1、docker的常用命令
1.1、帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 指令 --help # 查看某个指令的帮助命令
可以通过docker --help查看docker常用命令,也可以在官网查看。
docker命令官网查询地址:Reference | Docker Docs
1.2、镜像命令
docker images # 查看本机的镜像信息
docker search 镜像名 # 搜索镜像
docker pull 镜像名[:tag] # 下载镜像,可以指定镜像的版本tag,默认是最新版本
docker rmi -f 镜像名或镜像id # 删除镜像
docker rmi -f 镜像id1 镜像id2 镜像id3 # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除所有的镜像
1.docker images # 查看本机的镜像信息
字段解释:
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的id
CREATED:镜像的创建时间
SIZE:镜像的大小
2.docker search 镜像名 # 搜索镜像
也可以通过DockerHub官网搜索:https://hub.docker.com/search?q=
3.docker pull 镜像名[:tag] # 下载镜像,可以指定镜像的版本tag,默认是最新版本
从DockerHub上看一下mysql的版本,下载指定的版本:
4. 删除镜像
docker rmi -f 镜像名或镜像id # 删除镜像
docker rmi -f 镜像id1 镜像id2 镜像id3 # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除所有的镜像
1.3、容器命令
docker run [可选参数] 镜像名 # 运行镜像,创建容器
docker ps [可选参数] # 查看正在运行的容器
exit # 容器停止并退出
Ctrl + P + Q # 退出容器,但容器并未停止
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,可使用-f强制删除
docker rm [-f] $(docker ps -aq) # 删除所有的容器,-f 表示强制删除,包括运行的容器
docker ps -aq | xargs docker rm # 删除所有的容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制杀死当前容器
1.docker run [可选参数] 镜像名 # 运行镜像,创建容器
可选参数说明:
--name # 给容器起个名字,用于区分容器
-d # 以后台方式运行
-it # 以交互方式运行,进入容器查看内容
-p #指定容器端口,如-p 8080,常用的是将主机端口与容器端口进行映射,即-p 主机端口:容器端口,如-p 8090:8090。还有一种方式指定主机ip,-p 主机ip:主机端口:容器端口。
-P # 随机指定端口
只有有了镜像,才可以创建容器,运行镜像,就是创建了一个容器。
先下载一个centos镜像:
再运行镜像,创建容器:
2.docker ps [可选参数] # 查看正在运行的容器
可选参数说明:
-a # 查看所有容器,包括曾经运行的容器
-n=? # 查看最近创建的容器,例如查看最近创建的两个容器:-n=2
-q # 只显示容器的编号CONTAINER ID
3.退出容器
exit # 容器停止并退出
Ctrl + P + Q # 退出容器,但容器并未停止
4.删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,可使用-f强制删除
docker rm [-f] $(docker ps -aq) # 删除所有的容器,-f 表示强制删除,包括运行的容器
docker ps -aq | xargs docker rm # 删除所有的容器
5.启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制杀死当前容器
1.4、其他常用命令
docker run -d 镜像名 #容器启动后,docker发现该容器没有提供服务,就会自动停止容器
docker logs -tf --tail 10 容器id # 查看指定容器的日志信息
docker top 容器id # 查看容器中进程信息
docker inspect 容器id # 查看容器的元数据
docker exec -it 容器id /bin/bash # 进入当前正在运行的容器,开启一个新的终端
docker attach 容器id # 进入容器,并使用正在运行的终端,不会开启新的终端
docker cp 容器id:容器内路径 主机路径
docker stats 容器id # 查看容器占用CPU和内存信息
1.后台启动容器
docker run -d 镜像名 #容器启动后,docker发现该容器没有提供服务,就会自动停止容器
2.查看容器日志
docker logs -tf --tail 10 容器id # 查看指定容器的日志信息
参数说明:--tail 10 表示查看10条日志,不加tail表示查看所有日志。
3.查看容器中进程信息
docker top 容器id # 查看容器中进程信息
docker inspect 容器id # 查看容器的元数据
4.进入当前正在运行的容器
通常容器都是以后台方式运行的,如果需要进入容器,修改一些配置,则可以使用docker exec命令。
docker exec -it 容器id /bin/bash # 进入当前正在运行的容器,开启一个新的终端
docker attach 容器id # 进入容器,并使用正在运行的终端,不会开启新的终端
5、将容器内的文件复制到主机上
docker cp 容器id:容器内路径 主机路径
6、docker stats 容器id # 查看容器占用CPU和内存信息
1.5、命令小结
练习:使用docker安装nginx、tomcat
练习1:使用docker安装nginx
1、搜索nginx镜像,docker search nginx,建议到DockerHub官网上搜索,可以看到版本
2、下载nginx镜像,docker pull nginx[:tag]
3、运行nginx镜像,启动容器,docker run -d --name nginx01 -p 8090:80 nginx
启动命令参数说明:-d 以后台方式运行,--name 给容器命名,-p 8090:80将主机端口8090与容器端口80进行映射。
端口映射:
在浏览器上输入虚拟机ip:主机映射端口号,并且防火墙开通主机映射端口号。
练习2:使用docker部署tomcat
docker run -it --rm tomcat:9.0
--rm 表示容器用完退出之后就删除,一般用来测试,不建议这样使用。
练习3:使用docker安装elasticsearch
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.0
由于elasticsearch运行非常耗内存,所以通过-e ES_JAVA_OPTS参数限制其占用内存大小。
启动elasticsearch容器之后,通过curl localhost:9200进行测试是否启动成功。
ElasticSearch启动时,会占用两个端口9200和9300。
9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口,各种CRUD操作都是走的该端口。
9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都用此接口。
练习4:使用docker安装portainer可视化界面
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、docker镜像讲解
镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
得到镜像的方式:
·从远程仓库下载
·朋友拷贝给你
·自己制作一个镜像 DockerFile
2.1、docker镜像加载原理
1. UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
2. Docker镜像加载原理
docker镜像实际由一层一层的文件系统(UnionFS)组成,基础的镜像都会包含bootfs和rootfs。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux则启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system)在bootfs之上,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等。
[root@localhost ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 3 months ago 237MB
平时安装虚拟机的centos都是好几个GB,为什么使用Docker拉取的镜像才200MB?
这是因为对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的简单例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像层的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
Docker镜像的特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是通常说的容器层,容器之下的都叫镜像层!
2.2、提交镜像
提交容器成为一个新的镜像:
docker commit -m= "描述信息" -a= "作者" 容器id 目标镜像名:[tag]
下面首先通过默认的tomcat镜像启动一个容器,接着修改容器中的webapps,然后将修改后的容器提交成为一个新的tomcat镜像。
3、容器数据卷
3.1、数据卷挂载
将容器中的数据同步到本地,当删除容器时,使得数据不会丢失。这就是一种卷技术,也就是目录挂载,将容器中的目录挂载到宿主机上的目录。
方式一:使用命令挂载 (如果主机目录和容器目录不存在会自动创建)
-v /主机目录:容器目录 # 指定目录挂载,主机目录要以/开头,容器目录是绝对路径
-v 容器目录 # 匿名挂载,容器目录是绝对路径
-v 卷名:容器目录 # 具名挂载,容器目录是绝对路径
如果在挂载时没有指定宿主机目录,则会将容器目录挂载到宿主机的/var/lib/docker/volumes/xxx/_data目录下,其中的xxx是卷名。
docker run -it -v /主机目录:容器目录 镜像名 /bin/bash
docker run -d -P --name 容器名 -v /主机目录:容器目录[:ro或rw] 镜像名
参数说明:
-it 表示以交互模式运行,-d 表示以后台模式运行,-P 表示随机指定端口号,--name 表示给容器命名,-v 表示目录挂载,ro和rw表示对容器内的数据进行权限限定,ro表示只读,在容器内不能修改,只能在宿主机挂载的目录中修改,rw表示读写,默认是读写权限。
可以通过“docker inspect 容器id”命令查看容器的详细信息,可以看到目录挂载信息。
实战:挂载mysql数据
docker run -d -p 3306:3306 -v /home/andy/test/mysql/conf:/etc/mysql/conf.d -v /home/andy/test/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
-e 是环境配置,-e MYSQL_ROOT_PASSWORD 表示配置数据库的密码。
通过数据库工具datagrip连接mysql容器进行测试:
创建schema和数据表:
在宿主机挂载的/home/andy/test/mysql/data目录下查看是否有新建的数据库和表:
3.2、初识DockerFile
方式二:通过脚本文件进行挂载
这个脚本文件可以生成镜像,脚本文件是由一行一行命令组成的,镜像是一层一层的,每行命令都表示一层镜像。
docker build -f 文件路径 -t 生成镜像名称[:tag] dir
例如:docker build -f /tmp/dockerfile01 -t tomcat01:1.0 . (注意:最后有个点(.))
参数说明:
-f 指定文件路径,表示通过哪个Dockerfile文件构建镜像,默认情况下Docker会在当前目录查找名为Dockerfile的文件。
-t 指定生成的目标镜像名称和版本标签。镜像名称用于定义镜像的标识(如my-app),通常包含仓库前缀(如registry.example.com/my-app)。tag表示版本标签(如:v1.0),是可选的,默认为:latest,标签用于区分不同版本的镜像。
dir:指定作为构建上下文的目录,点(.)表示使用当前目录作为构建上下文。Docker会将此目录下的文件发送给守护进程用于构建镜像。注意:Dockerfile文件中COPY或ADD指令中用到的文件必须在此目录或其子目录中。
查看挂载的宿主机目录:
3.3、数据卷容器
命令:docker run -it --name 容器名 --volumes-from 父容器名 镜像名
docker run -it --name centos02 --volumes-from centos01 my-centos
多个mysql容器之间实现数据共享:
docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 –name mysql02 --volumes-from mysql01 mysql
4、DockerFile
4.1、构建镜像
DockerFile是用来构件docker镜像的脚本文件,文件内容是命令参数。
构建步骤:
1、编写一个DockerFile文件
2、通过docker build命令构建成为一个镜像
3、docker run运行镜像,镜像运行成功就创建了一个容器
4、docker push发布镜像(可以发布到DockerHub或者阿里云镜像仓库)
很多官方镜像都是基础包,很多功能都没有,我们通常会自己构建合适的镜像。
查看官方的镜像是如何通过DockerFile构建的,比如centos镜像的DockerFile文件:
编写DockerFile文件的注意事项和关键字:
1、每个保留关键字都必须是大写字母
2、按照从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建并提交一个新的镜像层。
实战1:构建一个自己的centos镜像
1、编写构建文件
[root@localhost dockerfile]# cat mydockerfile
FROM centos
MAINTAINER 倚天照海<12345678@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
2、执行构建命令
docker build -f 构建文件的路径 -t 目标镜像名[:tag] 目录
docker build -f mydockerfile -t mycentos:1.0 .
参考安装docker时报错的解决方案,依次执行下面的命令:
1、ll /etc/yum.repos.d/
2、mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup.20220408
3、更换成国内的yum源,命令:wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
4、把/etc/yum.repos.d/CentOS-Linux-BaseOS.repo文件中的[AppStream]部分复制到/etc/yum.repos.d/CentOS-Linux-AppStream.repo文件中,将原来的[AppStream]部分注释掉。
5、yum clean all
6、yum makecache
并将CentOS-Linux-BaseOS.repo和CentOS-Linux-AppStream.repo两个文件复制到DockerFile文件所在的目录下。
[root@localhost dockerfile]# cp /etc/yum.repos.d/CentOS-Linux-BaseOS.repo .
[root@localhost dockerfile]# cp /etc/yum.repos.d/CentOS-Linux-AppStream.repo .
同时修改DockerFile文件,将宿主机上的这两个文件拷贝到centos镜像里的/etc/yum.repos.d/目录下。这样在DockerFile文件里面执行yum命令时就不会报错了。
再次执行构建命令
官方提供的centos镜像是基础的,很多命令都没有,例如ifconfig、vim等等,在自己构建的镜像中通过yum安装了net-tools和vim,就可以通过自己构建的centos镜像使用这些命令了。
docker history 镜像id # 查看镜像的构建历史
实战2:构建一个自己的tomcat
1、编写构建文件,如果文件名称为Dockerfile,则可以不用使用-f指定文件路径,默认查找Dockerfile文件。
FROM centos
MAINTAINER 倚天照海<12345678@qq.com>
ADD jdk-8u271-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.62.tar.gz /usr/local
COPY CentOS-Linux-BaseOS.repo /etc/yum.repos.d/
COPY CentOS-Linux-AppStream.repo /etc/yum.repos.d/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.62/logs/catalina.out
2、构建镜像:docker build -f 构建文件路径 -t目标镜像名[:tag] 目录
如果构建文件名称是Dockerfile,可以不用-f指定构建文件路径,默认使用Dockerfile文件进行构建。
3、运行镜像,启动容器
docker run -d -p 8080:8080 --name mytomcat01 -v /home/andy/test/tomcat/webapps:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/andy/test/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs diytomcat
4.2、发布镜像
4.2.1、发布镜像到DockerHub上
1、首先在DockerHub上注册一个账号
打开DockerHub官网:https://hub.docker.com/
2、登录账号
3、提交镜像:docker push 镜像名[:tag]
在build自己的镜像添加tag时必须在前面加上自己的dockerhub的username,否则push会报错denied: requested access to the resource is denied。
4.2.2、发布镜像到阿里云上
1、注册阿里云账号并登录,找到容器镜像服务
2、创建命名空间
3、创建镜像仓库
操作指南:
1. 登录阿里云Docker Registry
$ docker login --username=a倚天照海 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/aliyun-image-server/image-repo:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=a倚天照海 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/aliyun-image-server/image-repo:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/aliyun-image-server/image-repo:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
推送成功之后,将本地镜像删除,再从阿里云拉取,运行镜像测试。
小结:
5、Docker网络
5.1、理解docker0
lo是本机回环网卡地址,ens33是虚拟机网卡地址,docker0是安装docker之后分配的网卡地址。
每启动一个容器,docker就会给容器分配一个ip,增加一个网卡,同时容器内部也会增加对应的网卡,这一对网卡就是veth-pair技术。veth pair是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连。由于它的这个特性,常常被用于构建虚拟网络拓扑。例如连接两个不同的网络命名空间(netns),连接docker容器,连接网桥(Bridge)等,其中一个很常见的案例就是OpenStack Neutron底层用它来构建非常复杂的网络拓扑。
创建一个容器,并查看容器的网卡信息:
再查看容器外部的网卡信息:
再启动一个容器:
Docker中所有的网络接口都是虚拟的,因为虚拟的转发效率高,比如内网传递文件。
只要容器删除了,一对veth网桥就消失了。
5.2、自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
参数说明:
--driver:设置网络模式,bridge表示桥接模式,默认是bridge
--subnet:子网掩码
--gateway:网关
使用我们自己定义的网络模式启动容器:
docker run -d -P --name 容器名 --net 网络名 镜像名
如果不写--net,默认是--net bridge,即桥接模式。
docker run -d -P --name tomcat-net01 --net mynet tomcat
使用自定义网络启动两个容器之后,观察自定义网络的详细信息:
在执行docker exec -it tomcat-net01 ping tomcat-net02命令时报错:OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown。
解决方案参考:
https://stackoverflow.com/questions/49463719/docker-ping-executable-file-not-found-in-path-unknown
首先以交互模式进入到容器中:docker exec -it tomcat-net01 bash,再分别执行apt-get update和apt-get install iputils-ping两个命令后,按Ctrl+P+Q退出容器。最后再ping。
5.3、网络连通
docker run -d -P --name tomcat01 tomcat
如果不使用--net参数指定网络,则默认是docker0。
docker network connect mynet tomcat01
docker exec -it tomcat01 ping tomcat-net01
连通之后将tomcat01容器放到mynet网络下,一个容器两个ip地址。
由于tomcat02没有连通mynet网络,所以tomcat02无法ping通tomcat-net01。
5.4、实战:部署redis集群
1、创建网卡
docker network create redis-net --subnet 172.38.0.0/16
2、通过脚本创建六个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
3、运行镜像,创建容器
在DockerHub上查看redis版本:
# redis-1容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.11 redis:6.2.6 redis-server /etc/redis/redis.conf
# redis-2容器
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.12 redis:6.2.6 redis-server /etc/redis/redis.conf
# redis-3容器
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.13 redis:6.2.6 redis-server /etc/redis/redis.conf
# redis-4容器
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.14 redis:6.2.6 redis-server /etc/redis/redis.conf
# redis-5容器
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.15 redis:6.2.6 redis-server /etc/redis/redis.conf
# redis-6容器
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.16 redis:6.2.6 redis-server /etc/redis/redis.conf
4、六个redis节点启动成功之后,随便进入一个节点创建集群模式
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
参数--cluster-replicas表示分片比例,主节点与从节点的比例。
5、使用redis-cli客户端连接集群,进行高可用测试
由上图可知,ip为11、12、13的三个容器节点是主节点,ip为14、15、16的三个容器节点是从节点,且14是13的从节点,15是11的从节点,16是12的从节点。
设置一个键值对k-v,由图可知,该键值对由172.38.0.12容器节点处理保存,其从节点172.38.0.16必定也会保存该键值对。接下来停掉172.38.0.12容器节点,观察从节点是否会变成主节点,从而验证高可用。
6、微服务打包成docker镜像
1、创建springboot项目
使用之前开发好的一个springboot项目,也可以随便创建一个非常简单的项目,通过一个controller类映射路径返回“hello world”字符串。
2、打包应用
3、编写Dockerfile文件
4、构建镜像:docker build -t spring-test001 .
将编写的Dockerfile文件和项目jar包上传到服务器上,构建镜像。
5、发布运行:docker run -d -P --name springtest01 spring-test001