学习目标: · 掌握Docker基础知识,能够理解Docker镜像与容器的概念 · 完成Docker安装与启动 · 掌握Docker镜像与容器相关命令 · 掌握Tomcat Nginx 等软件的常用应用的安装 · 掌握docker迁移与备份相关命令 · 能够运用Dockerfile编写创建容器的脚本 · 能够搭建与使用docker私有仓库

1. 初始Docker

1.1 docker概念

我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境:
image.png
image.png
image.png
可能由于环境不同,而失败。如果我们能将开发环境需要的内容和war一起就好了。
image.png
•Docker 是一个开源的应用容器引擎
•诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
•Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
•容器是完全使用沙箱机制,相互隔离
•容器性能开销极低。
•Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

1.2 安装docker

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS 7 安装Docker。官网:https://www.docker.com
这五个命令从头到尾执行完即可。对于第一个和第四个需要花费好多时间、对于第四个,可能会失败(可能是网络原因,多执行两次),还有第四个中的y是确认的意思,如果没有,那么你安装过程中需要输入几次y确定。

  1. # 1、yum 包更新到最新
  2. yum update
  3. # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
  4. yum install -y yum-utils device-mapper-persistent-data lvm2
  5. # 3、 设置yum源
  6. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  7. # 4、 安装docker,出现输入的界面都按 y
  8. yum install -y docker-ce
  9. # 5、 查看docker版本,验证是否验证成功
  10. docker -v

1.2 安装docker(详细命令)

我这里步骤有点多,但是最全的。

1.yum 包更新到最新(该步骤耗时,可以省略该步骤),出现确认,点y

  1. yum update

2.卸载之前docker(如果没有则不需要)

  1. yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

3.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

  1. yum install -y yum-utils device-mapper-persistent-data lvm2

4.设置yum源

  1. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

5.安装docker,出现输入的界面都按 y,但是我们安装命令有,就不需要了。

  1. yum install -y docker-ce docker-ce-cli containerd.io

6.查看docker版本,验证安装成功

  1. docker -v

7.启动docker

  1. systemctl start docker

8.设置开机自启

  1. systemctl enable docker

9.配置docker的阿里云镜像加速(每个人不一样,自己注册阿里云查看!),这是四个命令,但是我们一下子全复制,回车即可。(这是我的)

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://upbi0ek8.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

10.检查镜像是否配置成功

  1. cat /etc/docker/daemon.json

image.png
11.重启docker

  1. systemctl restart docker

此外,还要配置镜像加速器,看后面

1.3 docker架构

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

image.png

1.3.2 配置Docker镜像加速器

默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:

怎么配置??
登录阿里云;选择控制台;点击面包按钮,有产品与服务,搜索镜像;选择容器镜像服务;找到最后的镜像加速器;复制操作,sudo可不加,加上也不错。

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://upbi0ek8.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

image.pngimage.pngimage.png
我们查看一下文件,发现配置好了
image.png

2. Docker命令

2.1 进程相关命令

启动docker服务:

  1. systemctl start docker

停止docker服务:

  1. systemctl stop docker

重启docker服务:

  1. systemctl restart docker

查看docker服务状态:

  1. systemctl status docker

设置开机启动docker服务:

  1. systemctl enable docker

查看版本

  1. docker version

2.2 镜像相关命令

2.2.1 查看本地所有的镜像

  1. docker images

image.png
o REPOSITORY:镜像名称
o TAG:镜像标签
o IMAGE ID:镜像ID
o CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
这些镜像都是存储在Docker的 /var/lib/docker 目录下。
这个命令后面有用

  1. docker images -q # 查看所有镜像的id

2.2.2 搜索镜像:看网络上是否有这个镜像

  1. docker search 镜像名称

image.png

2.2.3 拉取镜像:从Docker仓库拉去

  1. docker pull 镜像名称 # 该条拉去的是最新镜像
  2. docker pull 镜像名称:版本号 # 拉去对应版本

版本好查找需要到docker hub上面。版本号必须是这里面有的。
image.png
这里拉去最新的和5.0版本的redis
image.png

2.2.4 删除镜像

  1. docker rmi 镜像id # 删除执行本地镜像
  2. docker rmi 镜像名称:版本号 #这是另一种方式
  3. # 如果你像删除所有镜像怎么办??可以一个一个删除
  4. # 也可以用下面的命令 ,其实就是把docker images -q作为参数传入,即传入所有镜像id
  5. docker rmi `docker images -q` # 删除本地所有镜像

下面这几个命令可以了解下

  1. docker rmi -f 镜像ID # 删除单个镜像(-f 强制删除)
  2. docker rmi -f 镜像名1:TAG 镜像名2:TAG # 删除多个镜像
  3. docker rmi -f $(docker images -qa) # 删除所有镜像

2.3 容器相关命令

容器也是docker中的核心概念,镜像是创建容器的软件 , 容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。
如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用。比如网站、程序甚至是系统环境。
image.png

2.3.1 查看容器

  1. docker ps # 查看正在运行的容器
  2. docker ps -a # 查看所有容器,包括未运行的
  3. docker ps -f status=exited # 查看停止的容器

2.3.2 创建并启动容器

其实就是用镜像创建容器,镜像和容器的关系就是类和对象的关系。

  1. docker run 参数

参数说明:

  • -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  • -t:为容器重新非陪一个伪输入终端,通常与-i同时使用。即表示容器启动后会进入其命令行。
  • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。
  • -it:创建的容器一般称为交互式容器;-id创建的容器一般称为守护式容器
  • —name:为创建的容器命名。
  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

解释:-i其实是必加的,意思是如果没有客户端链接这个容器,容器不会自动关闭;-t和-d是选择的,且可以和-t连起来使用,应该是一般选择-d吧,-it是创建临时容器,且要直接进入容器,退出后容器就关闭了,-id是创建容器,但不会直接进入容器内部,退出容器,其也不会关闭;—name不用说,给容器命名。
注意这个/bin/bash可以省略
image.png
image.png

上面属于创建两种容器的方式:前者是交互式容器,后者是守护式容器。对于交互式容器,创建即进入容器内部,并运行,退出则容器结束运行。对于守护式容器,要自己启动和关闭。

守护式容器和交互式容器的创建方式区别:
# ① -it 换成 -id
# ② 去掉后面的 /bin/bash

我们这里说一下run命令的作用
image.png

2.3.3 进入容器(守护式容器)

用-id创建的可以进入

  1. docker exec -it 容器名称 (或者容器ID) /bin/bash
  2. # 比如
  3. docker exec -it mycentos10 /bin/bash

2.3.4 停止容器

  1. docker stop 容器名称/容器id

2.3.5 启动容器

  1. docker start 容器名称/容器id

2.3.6 删除容器

正在运行容器无法删除

  1. # 删除容器的时候,如果容器在运行,会报错,必须先停止容器
  2. docker rm 容器名称/id

你想一下子删除好几个

  1. docker rm 容器名称1 容器名称2 容器名称3
  2. # 当然你也可以,应该可以理解吧,q是只显示id,-a自然是所有的容器
  3. docker rm `docker ps -aq`

2.3.7 查看容器信息(包含了容器IP地址)

  1. docker inspect 容器名称/id

这个信息非常多,后面用到再说
image.png
通过inspect 可以查看的信息太多,如果想单纯有针对性的查看某个信息,也可以直接执行下面的命令直接输出IP地址

  1. docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
  2. # 例如:
  3. docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos11

2.3.8 文件拷贝

我们需要在容器内安装一个软件,软件首先需要有安装包,我们就需要把安装包拷贝到容器内。我们通常的操作是先把文件上传到宿主机,然后我们在将文件从宿主机拷贝到容器内的某个目录下面进行安装。
将linux宿主机中的文件拷贝到容器内可以使用命令:
image.png

从宿主机拷贝到容器

  1. docker cp anaconda-ks.cfg mycentos2:/usr/local/

拷贝当前目录下的文件anaconda-ks.cfg,到 mycentos2 的 /urs/local/ 文件下面。

从容器拷贝到宿主机

  1. # 拷贝到当前目录下
  2. docker cp mycentos2:/usr/local/anaconda-ks.cfg ./

2.3.9 目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器添加-v参数后边为宿主机目录:容器目录,例如:

  1. # 创建并启动容器mycentos3,并挂载linux中的/usr/local/myhtml目录到容器的/usr/local/myhtml;也就是在linux中的/usr/local/myhtml中操作相当于对容器相应目录操作
  2. docker run -di --name=容器的名字 -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
  3. 比如:docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7

3. Docker容器数据卷(看目录挂载,加深理解)

3.1 数据卷概念及作用

思考:

  • Docker容器删除后,在容器中产生的数据还在吗? 不存在了,那不安全啊,还敢用吗?image.png
  • Docker容器和外部机器可以直接交换文件吗? 不能,比如这是tomcat容器,我们想在外部机器开发的war包部署进去,发现不行,这怎么行??image.png
  • 容器之间想要进行数据交互?

数据卷

  • 数据卷是宿主机中的一个目录或文件(当然单纯一个目录不叫数据卷,要挂载到容器才算是数据卷)
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载 (可以实现两个容器的通信)
  • 一个容器也可以被挂载多个数据卷

数据卷作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

    3.2 配置数据卷

  • 创建启动容器时,使用-v参数 设置数据卷

    1. docker run ... -v 宿主机目录(文件):容器内目录(文件)...
  • 注意事项

1.目录必须是绝对路径
2.如果目录不存在,会自动创建
3.可以挂载多个数据卷
删除所有容器
image.png
拉取centos:7镜像,当然你也可以直接用redis镜像操作,我这里是为了和老师的保持一致,因此拉取了centos:7
这样启动容器就创建了数据卷:/root/data:就会在宿主机创建这个目录,如果有,就不会创建了;另外一个是在容器中创建/root/data_container目录,有则不创建。

  1. docker run -it --name centos -v /root/data:/root/data_container centos:7

image.png
此时在宿主机创建文件,那么容器内部也就自动有了。
image.pngimage.png
创建多个数据卷,其实没什么演示的,只是一个符号值得关注 \,如果你一行没有写完,可以用这个在另一行写。
image.png
此外,你在宿主机的/root/data也可以改写为~/data,但是容器就不可以。
image.png
两个容器如何通信呢?很简单,就是共用一个数据卷,这个就不写命令了,很简单。
image.png
那么怎么查看你给容器配置的数据卷呢?以后忘了怎么办?
就是上面提到的docker inspect 容器id,有两个地方可以查看。
image.pngimage.png

3.3 配置数据卷容器

3.3.1 数据卷容器介绍

这个好奇怪,什么是数据卷,我们知道了,什么是容器我们也知道了。
那什么是数据卷容器呢?其实就是拿一个容器充当一个数据卷,好抽象啊!!!
数据卷容器
多容器进行数据交换

  • 多个容器挂载同一个数据卷
  • 数据卷容器

数据卷容器绑定到宿主机数据卷;然后两个容器绑定到数据卷容器;然后相当于这两个容器绑定到了宿主机的数据卷。
image.png

3.3.2 配置数据卷容器

1.创建启动c3数据卷容器,使用-v 参数 设置数据卷 注意,这里并没有宿主机目录,只有容器目录/volume,就是在数据卷容器内部创建这个目录,至于宿主机目录是自动生成的,后面可以用docker inspect 容器id查看。

  1. docker run –it --name=c3 –v /volume centos:7 /bin/bash

2.创建启动c1 c2容器,使用 —volumes-from 参数 设置数据卷 这一步其实就是将两个容器绑定到数据卷容器

  1. docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
  2. docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash

这些都不演示了,大胆点尝试,没什么。至于宿主机的目录,是自动生成的

3.3.3 数据卷容器的优势

对于3.2其实我们已经介绍过一种容器通信的方式,这里为什么还有数据卷容器??
答案:我不清楚,百度吧!!!!

3.4 数据卷小结

  1. 数据卷概念
    1. 宿主机的一个目录或文件
  2. 数据卷作用
    1. 容器数据持久化
    2. 客户端和容器数据交换
    3. 容器间数据交换
  3. 数据卷容器
    1. 创建一个容器,挂载一个目录,让其他容器继承自该容器( —volume-from )。
    2. 通过简单方式实现数据卷配置

      4. Docker应用部署

      4.1 MySQL部署

      4.1.1 废话

      image.png案例:需求
      在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。
      image.png案例:实现步骤
      ①搜索mysql镜像
      ②拉取mysql镜像
      ③创建容器
      ④操作容器中的mysql
      其实所有部署基本都是这个步骤
      MySQL部署
      •容器内的网络服务和外部机器不能直接通信
      •外部机器和宿主机可以直接通信
      •宿主机和容器可以直接通信
      •当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务。
      •这种操作称为:端口映射
      容器不能和外部机器通信;但是容器可以和宿主机通信;宿主机可以和外部机器通信;因此搞一个端口映射,那么间接地就可以和外部机器通信。
      image.png
      image.png

      4.1.2 命令走起,就是干

      1.搜索mysql镜像,常见的不用搜,直接拉
      1. # 可省略
      2. docker search mysql
      2.拉取mysql镜像,之一查版本https://hub.docker.com/search?q=mysql&type=image
      1. docker pull mysql:5.7
      3.创建容器,设置端口映射、目录映射(数据、配置和日志)
      1. # 在/root目录下创建mysql目录用于存储mysql数据信息
      2. mkdir ~/mysql
      3. cd ~/mysql
      1. docker run -id \
      2. -p 3306:3306 \
      3. --name=mysql \
      4. -v $PWD/conf:/etc/mysql/conf.d \
      5. -v $PWD/logs:/logs \
      6. -v $PWD/data:/var/lib/mysql \
      7. -e MYSQL_ROOT_PASSWORD=root \
      8. mysql:5.7
      参数说明:
  • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
  • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录,其实则容器内部这个/etc/mysql/my.cnf是本来就存在的
  • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录,其实则容器内部这个/etc/mysql/conf.d是本来就存在的
  • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录,其实则容器内部这个/var/lib/mysql 是本来就存在的
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。root用户是默认的

4.进入容器,操作mysql

  1. docker exec -it mysql /bin/bash

image.png
5.使用外部机器连接容器中的mysql
image.png

4.2 Tomcat部署

1.搜索tomcat镜像

  1. docker search tomcat

2.拉取tomcat镜像,这个拉取最新tomcat

  1. docker pull tomcat

3.创建容器,设置端口映射、目录映射(只需要映射webapp目录)

  1. # 在/root目录下创建tomcat目录用于存储tomcat数据信息
  2. mkdir ~/tomcat
  3. cd ~/tomcat
  1. docker run -id --name=tomcat \
  2. -p 8080:8080 \
  3. -v $PWD:/usr/local/tomcat/webapps \
  4. tomcat

参数说明:

  • -p 8080:8080:将容器的8080端口映射到主机的8080端口
  • -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

4.使用外部机器访问tomcat http://192.168.1.27:8080,当然里面没有内容,因此
image.png
在宿主机/root/tomcat目录下创建test文件夹,vim index.html,里面写

Hello tomcat docker


然后浏览器访问http://192.168.1.27:8080/test/index.html
image.pngimage.pngimage.png

4.3 Nginx部署

注意:nginx部署,需要自己在外部创建nginx.conf文件,因为里面要直接编辑一些内容。
1.搜索nginx镜像

  1. docker search nginx

2.拉取nginx镜像,拉取最新的

  1. docker pull nginx

3.创建容器,设置端口映射、目录映射,首先要创建文件nginx.conf,在里面编辑内容(复制)

  1. # 在/root目录下创建nginx目录用于存储nginx数据信息
  2. mkdir ~/nginx
  3. cd ~/nginx
  4. mkdir conf
  5. cd conf
  6. # 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
  7. vim nginx.conf
  1. user nginx;
  2. worker_processes 1;
  3. error_log /var/log/nginx/error.log warn;
  4. pid /var/run/nginx.pid;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include /etc/nginx/mime.types;
  10. default_type application/octet-stream;
  11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. access_log /var/log/nginx/access.log main;
  15. sendfile on;
  16. #tcp_nopush on;
  17. keepalive_timeout 65;
  18. #gzip on;
  19. include /etc/nginx/conf.d/*.conf;
  20. }
  1. docker run -id --name=nginx \
  2. -p 80:80 \
  3. -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
  4. -v $PWD/logs:/var/log/nginx \
  5. -v $PWD/html:/usr/share/nginx/html \
  6. nginx

参数说明:

  • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
  • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录

这里报错,解决方案如下,我这里就不解决了。

  1. docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/root/nginx/conf/conf/nginx.conf" to rootfs at "/etc/nginx/nginx.conf" caused: mount through procfd: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

https://blog.csdn.net/qierkang/article/details/92657302
4.使用外部机器访问nginx,访问默认是80端口,因此可以不写端口号。
如果想访问,需要在$PWD/html目录下创建index.html文件。

4.4 Redis部署

4.4.1 下载镜像文件

拉取最新版

  1. docker pull redis

4.4.2 创建文件夹和redis.conf文件

  1. mkdir -p /mydata/redis/conf
  2. touch /mydata/redis/conf/redis.conf

4.4.3 创建实例并启动

最后一句是默认启动redis是用redis.conf配置文件启动。

  1. docker run -p 6379:6379 --name redis --restart=always -v /mydata/redis/data:/data \
  2. -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
  3. -d redis redis-server /etc/redis/redis.conf --appendonly yes

image.png
此外:经过测试,开启持久化必须在redis-server之后。

4.4.4 使用redis镜像执行redis-cli命令

以前这个命令是/bin/bash进入控制台,这里直接链接redis客户端进行测试

  1. docker exec -it redis redis-cli

进入后,我们可以设置和获取值。再次进入,依然有值。
image.png
但是假设我们关闭容器,再启动容器,这个里面还有值吗?答案,没有,即没有持久化!
见鬼了,我的竟然还存在,啥情况!!!!此问题先不管了。下面依然做持久化设置。

4.4.5 持久化设置(该步省略,启动容器已有)

  1. vi /mydata/redis/conf/redis.conf

image.png
记得重启

  1. docker restart redis

4.5 Elasticsearch

4.5.1 获取镜像

  1. 拉取elasticsearch镜像

    1. # 存储和检索数据
    2. docker pull elasticsearch:7.4.2

    4.5.2 获取可视化镜像

  2. 拉取可视化界面,你也可以不需要,但是有界面不是挺好的吗?

    1. docker pull kibana:7.4.2

    4.5.3 创建映射目录

  3. 依次创建两个文件夹和写一个文件

    1. mkdir -p /mydata/elasticsearch/config
    2. mkdir -p /mydata/elasticsearch/data
    3. echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml

    4.5.4 运行镜像

  4. 启动elasticsearch

看到下面是单节点启动

  1. # 下面是使用,测试时"-Xms64m -Xmx128m"(虚拟机1G内存);使用时"-Xms64m -Xmx512m"(虚拟机3G)
  2. docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --restart=always \
  3. -e "discovery.type=single-node" \
  4. -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
  5. -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  6. -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
  7. -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  8. -d elasticsearch:7.4.2

此时你直接访问是无法访问的:
image.png

4.5.5 查看ES日志

5.报错,查看日志方法docker logs elasticsearch
错误是访问权限,因此修改权限

  1. [root@localhost config]# docker logs elasticsearch
  2. OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
  3. {"type": "server", "timestamp": "2021-09-13T07:14:46,580Z", "level": "WARN", "component": "o.e.b.ElasticsearchUncaughtExceptionHandler", "cluster.name": "elasticsearch", "node.name": "36aafb208fda", "message": "uncaught exception in thread [main]",
  4. "stacktrace": ["org.elasticsearch.bootstrap.StartupException: ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];",
  5. "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.4.2.jar:7.4.2]",
  6. "at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.4.2.jar:7.4.2]",
  7. "at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.4.2.jar:7.4.2]",
  8. "at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:125) ~[elasticsearch-cli-7.4.2.jar:7.4.2]",
  9. "at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.4.2.jar:7.4.2]",
  10. "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.4.2.jar:7.4.2]",
  11. "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.4.2.jar:7.4.2]",
  12. "Caused by: org.elasticsearch.ElasticsearchException: failed to bind service",
  13. "at org.elasticsearch.node.Node.<init>(Node.java:614) ~[elasticsearch-7.4.2.jar:7.4.2]",
  14. "at org.elasticsearch.node.Node.<init>(Node.java:255) ~[elasticsearch-7.4.2.jar:7.4.2]",
  15. "at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
  16. "at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
  17. "at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.4.2.jar:7.4.2]",
  18. "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.4.2.jar:7.4.2]",
  19. "... 6 more",
  20. "Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",
  21. "at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?]",
  22. "at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]",
  23. "at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[?:?]",
  24. "at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:389) ~[?:?]",
  25. "at java.nio.file.Files.createDirectory(Files.java:693) ~[?:?]",
  26. "at java.nio.file.Files.createAndCheckIsDirectory(Files.java:800) ~[?:?]",
  27. "at java.nio.file.Files.createDirectories(Files.java:786) ~[?:?]",
  28. "at org.elasticsearch.env.NodeEnvironment.lambda$new$0(NodeEnvironment.java:272) ~[elasticsearch-7.4.2.jar:7.4.2]",
  29. "at org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:209) ~[elasticsearch-7.4.2.jar:7.4.2]",
  30. "at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:269) ~[elasticsearch-7.4.2.jar:7.4.2]",
  31. "at org.elasticsearch.node.Node.<init>(Node.java:275) ~[elasticsearch-7.4.2.jar:7.4.2]",
  32. "at org.elasticsearch.node.Node.<init>(Node.java:255) ~[elasticsearch-7.4.2.jar:7.4.2]",
  33. "at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
  34. "at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:221) ~[elasticsearch-7.4.2.jar:7.4.2]",
  35. "at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.4.2.jar:7.4.2]",
  36. "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.4.2.jar:7.4.2]",
  37. "... 6 more"] }
  38. [root@localhost config]#

4.5.6 修改权限

6.修改权限
chomd -R 777 /mydata/elasticsearch
image.png

4.6.7 浏览器访问

7.浏览器访问

  1. http://1.15.122.141:9200/

image.png
其实我这里有一个疑问:我修改权限后,没有重启ES,就可以直接访问了,不过想一想,这应该没啥!


8.如果你的访问是被拒绝的,我的解决方案是:(当然,最好你什么都不要改,等两三分钟再访问,还不行,再说
https://blog.csdn.net/star1210644725/article/details/103903993

  1. # ES的配置文件/config/elasticsearch.yml 中新增配置项(在配置文件里边的最下边直接粘贴就可以了)
  2. network.host: 0.0.0.0
  3. http.port: 9200
  4. transport.host: localhost
  5. transport.tcp.port: 9300

4.7.8 启动Kibana容器

9.安装Kibana
其实安装好elasticsearch后,可以不安装kibana,可以直接用postman发送命令,但是呢?有客户端不是很好吗?
注意:一定要是自己Linux的地址哦!!!

  1. docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.64.29:9200 -p 5601:5601 -d kibana:7.4.2

10访问:如果页面报错Kibana server is not ready yet,多访问几次。是因为还没有启动起来。

  1. http://192.168.64.29:5601/

等待后,成功!
image.png

4.7.9 ES设置分词器

在设置分词器前,用的是默认分词器,一个一个分词。
image.png
参考这篇文章:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
我们这里使用第一章方式在线安装
这个地址是在github找的,https://github.com/medcl/elasticsearch-analysis-ik/tags?after=v7.7.0注意版本对应。

  1. https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

image.png
重启ES,并测试()估计不重启也行
image.png

4.6 RabbitMQ安装

  1. 搜素(可以省略)

    1. docker search rabbitmq

    4.6.1 获取镜像

  2. 拉取最新镜像,如果需要其它版本,可添加版本号

    1. docker pull rabbitmq

    image.png

    4.6.2 运行镜像

  3. 基于镜像,创建容器(采用这条命令) ```java docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin —name rabbitmq —restart=always —hostname=my-rabbit rabbitmq

  1. 最后一个rabbitmq是镜像名称<br />下面仅是参考:
  2. ```java
  3. #方式一:默认guest 用户,密码也是 guest
  4. docker run -d --hostname my-rabbit --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management
  5. #方式二:设置用户名和密码
  6. docker run -d --hostname my-rabbit --name rabbitmq -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management
  7. # 这两个密码的区别,暂时没有确定答案
  1. docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9

说明:
-d 后台运行容器;
—name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
—hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

4.6.3 浏览器访问

http://1.15.122.141:15672/:出现错误,我这个是安装在腾讯云,不知道本地安装是否有访问错误!
image.png
解决方案:需要安装一个插件(原因未知)

  1. # 进入容器
  2. docker exec -it 镜像ID /bin/bash
  3. # 安装插件
  4. rabbitmq-plugins enable rabbitmq_management
  5. # 退出容器
  6. exit
  7. # 重启
  8. docker restart rabbitmq

image.png
再次访问:成功
image.pngimage.png

5. 迁移与备份

image.png
其中涉及到的命令有:
o docker commit 将容器保存为镜像
o docker save 将镜像备份为tar文件
o docker load 根据tar文件恢复为镜像

5.1 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

  1. # 保存nginx容器为镜像
  2. docker commit 容器名称 镜像名称
  3. 例如:docker commit mynginx mynginx_i

保存后,可以用docker images查看该镜像。当然你也可以用你刚刚制作的镜像通过docker run命令制作成镜像。

5.2 镜像备份

我们可以通过以下命令将镜像保存为tar 文件,会保存在当前目录下。

  1. # 命令形式:docker save –o tar文件名 镜像名
  2. # 保存镜像为文件 -o:表示output 输出的意思
  3. docker save -o mynginx.tar mynginx_i

5.3 镜像恢复与迁移

首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复

  1. # 命令形式:docker load -i tar文件名
  2. docker load -i mynginx.tar

-i 表示input输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
我们需要直接恢复刚刚的 tar 文件 ,就需要先删除 mynginx_i 镜像,才能恢复, 直接删除 mynginx_i 镜像 ,发现会报错,因为当前镜像的容器正在运行,需要先停止容器,删除容器 , 在删除镜像

6. Dockerfile

Dockerfile,其实就是Docker文件,剧透一下,这个Dockerfie是用来制作镜像的。

6.1 什么是Dockerfile

前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfile
Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。

6.2 常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录

6.3 使用脚本创建镜像

6. Docker服务编排

7. Docker私有仓库

8. Docker相关概念