Docker
前言
虚拟化
人们为了提高系统级硬件资源的利用率从而引入了虚拟化技术。虚拟化是一种资源管理技术。他可以将各种实体资源抽象后在分隔,从而打破实体结构的限制,最大程度的提高资源利用率。Docker属于软件虚拟化技术中的操作系统层虚拟化技术,他是基于LXC实现的一个应用容器引擎,Docker让开发者可以打包他们的应用及依赖环境到一个可以移植的容器中,然后可以将这个容器快速部署开发、测试或生产环境中。
什么是虚拟化技术?
在计算机技术中,虚拟化是一种资源管理技术。他是将计算机的各种实体资源,如:服务器、网络、内存及存储等。予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用更好地方式来利用这些资源。
虚拟化的目的是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理和容错容灾
虚拟化分类
硬件虚拟化
硬件虚拟化就是硬件物理平台本身提供了对特殊指令的截获和重定向的支持。支持虚拟化的硬件,也是一些基于硬件实现软件虚拟化技术的关键。在基于硬件实现软件虚拟化的技术中,在硬件是实现虚拟化的基础,硬件(主要是CPU)会为虚拟化软件提供支持,从而实现硬件资源的虚拟化
软件虚拟化
软件虚拟化就是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持
虚拟化技术、容器化技术
Docker作用
虚拟机技术缺点:
- 资源占用
- 冗余步骤
- 启动慢
容器化
容器化技术并不是模拟一个操作系统
比较Docker和虚拟机技术的不同
- 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机内部容器是没有自己的内核的,也没有 虚拟硬件
- 每个容器间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样
项目打包为一个镜像,扩展服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的.
更高效的计算资源利用
Dcoker内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例
基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务
通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的.
启动,停止,删除,基本命令!
仓库(repository):
存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云…都有容器服务端(配置镜像加速!)
安装docker
# 确保虚拟机可以上网
yum -y install gcc
yum -y install gcc-c++
#1、卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2、需要的安装包
yum install -y yum-utils
#3、设置镜像的仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum索引
yum makecache fase
#4、安装docker相关的引擎
yum install docker-ce docker-ce-cli containerd.io
#启动
systemctl start docker
# 查看镜像
docker images
卸载
# 1、卸载资源
yum remove docker-ce docker-ce-cli containerd.io
# 2、删除资源
rm - rf /var/lib/docker
# /var/lib/docker docker 默认工作路径
阿里云镜像加速
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g0c1djhr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
helloworld解析
底层原理
docker是一个client-server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
Docker为什么比vm快?
1、docker有着比虚拟机更少的抽象层。
2、docker利用的宿主机的内核,vm需要是Guest OS。
所以说,新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的步骤,秒级
基本命令
帮助命令
docker version
docker info
docker --help
帮助文档的地址
镜像命令
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 19 months ago 13.3kB
docker search name搜索镜像
docker pull name:版本号下载镜像
[root@Ruanshuai ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载。docker image 的核心,联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94 #签名
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 #真实地址
docker rmi -f 删除镜像
docker rmi -f image id
docker rmi -f $(docker images -aq)
容器命令
有了镜像才可以创建容器
docker pull centos
新建容器并启动
docker run 【可选参数】image
--name="Name" 容器名字 用来区分容器
-d 后台方式运行
-it 使用交互方式运行
-p 指定容器的端口 -平8080:8080
-P(大写) 随机指定端口
# 测试 启动并进入容器
[root@Ruanshuai ~]# docker run -it centos /bin/bash
[root@e96297194126 /]#
docker ps 列出正在运行的容器
-a #+历史运行过的容器
-n=? #最近创建的容器
-q # 只显示容器的编号
退出容器
exit #退出并关闭运行
ctrl+p+Q #容器不停止退出
删除容器
docker rm 容器id
启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
常用其他命令
后台启动容器
docker run -d centos
docker ps 发现centos停止了
docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序
查看日志
docker logs -ft --tail 10 容器id
# 显示日志
-tf #显示日志
--tail number #要显示日志条数
查看容器中进程信息
docker top 容器id
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id
[root@Ruanshuai ~]# docker exec -it bbc6426002c1 /bin/bash
#方式二
docker attach 容器id
docker exec 进入容器后开启新的终端
docker attach 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
拷贝是一个手动过程,未来使用-v卷的技术,实现自动化
安装基本软件
安装Nginx
#外部3344端口映射内部80端口
docker run -d --name nginx1 -p 3344:80 nginx
#本机自测
[root@Ruanshuai ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
端口暴露概念
Tomcat
# 官方使用 一般用于测试,用完即删
docker run -it --rm tomcat:9.0
#下载启动
docker pull tomcat
#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
#测试访问没有问题
#进入容器
docker exec -it tomcat01 /bin/bash
#发现问题:镜像为阉割版2.没有webapps。阿里云镜像的原因。默认是最小的镜像,所以不必要的都剔除,保证最小可运行环境
部署es +kibana
# es 暴露的端口很多
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动了Linux就卡了 docker stats 查看cpu的状态
#增加内存限制,修改配置文件-e
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"-e "ES_JAVA_OPTS=-Xms64m -Xmx512m" elasticsearch:7.6.2
curl localhost:9200
docker网络原理
可视化
portainer
#下载
docker run -d -p 8088:9000 \
#权限与卷
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问外网:8088
镜像
镜像是什么
镜像是一种轻量级/可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
- 从远程仓库下载
- 自己制作一个镜像
docker镜像加载原理
UnionFs联合文件系统
UnionFs(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录改在到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终上的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统UnionFs。
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等等。
分层理解
Docker镜像为什么采用分层结构
最大的好处,资源共享!比如有很多个镜像都从相同的Base镜像构建而来,name宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect redis 命令!
理解
所有的镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m
容器数据卷
容器之间数据共享
Docker容器中产生的数据,同步到本地!目录的挂载,将容器内的目录,挂载到Linux上面
容器的持久化和同步技术容器间可以数据同步
使用数据卷
方式一:命令挂载
docker run -it -v 主机目录:容器内目录
# 查看所有卷的情况
docker volume
数据同步
好处:以后修改只需要在本地修改记录,容器内会自动同步
安装MySQL
# 获取镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载! # 安装启动mysql,需要配置密码,
# 官方测试,$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
[root@Ruanshuai ceshi]# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d --volumes-from dbdata --name db1 training/postgres
具名和匿名挂载
# 匿名挂载
-v 容器内路径! #未指定名字
docker run -p... --name nginx01 -v /etc/nginx nginx
# 具名挂载 #注意没带/
docker run 。。。。 -v juming-nginx:/etc/nginx nginx
# 查看一下这个卷信息
docker volume inspect juming-nginx
#通过具名挂载方便找到我们的一个卷、大多数情况下使用
拓展
# 通过 -v容器内路径:ro rw改变读写权限
ro readonly # 只读
rw readwrite # 读写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run 。。。。 -v juming-nginx:/etc/nginx:ro nginx
docker run 。。。。 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
# 默认是rw
初始DockerFile
DockerFile就是用来构建docker镜像的构建文件
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层
# 创建一个dockerfile文件,名字可以随机,建议dockerfile
# 文件中的内容 指令(大写)参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end--------"
CMD /bin/bash
docker build -f dockerfile --name
# 测试一下刚才的文件是否同步出去了
这种范式我们未来使用的时分对,因此我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载
数据卷容器
上面讲述的是主机和容器之间共享数据,那么如何你有一些持续更新的数据需要在容器之间共享,最好的方法就是创建数据卷容器。
多个mysql同步数据
# -volumes-from 可以多次使用来 mount 多个conatainer里的多个volumes。
[root@pdai ~]# docker run -d -v /dbdata --name dbdata training/postgres
70966085a85b05dd741a44a96725e2e44f146cc404b1b4e3aa3e519cd546c6b4
[root@pdai ~]# docker run -d --volumes-from dbdata --name db1 training/postgres
4c92240096d919724b233e1a5cfca94b5ceb0505e43262a7121cb83cfd8542f6
[root@pdai ~]# docker run -d --volumes-from dbdata --name db2 training/postgres
25246ebfae2f8437316b10d7eac3b34c1bd1522f50ba81651aec198bc79415a2
[root@pdai ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70966085a85b training/postgres "su postgres -c '/us…" 46 seconds ago Up 45 seconds 5432/tcp dbdata
25246ebfae2f training/postgres "su postgres -c '/us…" About a minute ago Up About a minute 5432/tcp db2
4c92240096d9 training/postgres "su postgres -c '/us…" 2 minutes ago Up 2 minutes 5432/tcp db1
# 这个操作是链式的, 我们在db1 中通过 --volumes-from mount进来的 volume可以继续被其他container使用
[root@pdai ~]# docker run -d --name db3 --volumes-from db1 training/postgres
44d0719377e86e3080b26d22adcb6055de93033dc9509ca2ecd8be2c93dc33b5
[root@pdai ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44d0719377e8 training/postgres "su postgres -c '/us…" 3 seconds ago Up 2 seconds 5432/tcp db3
70966085a85b training/postgres "su postgres -c '/us…" 3 minutes ago Up 3 minutes 5432/tcp dbdata
25246ebfae2f training/postgres "su postgres -c '/us…" 4 minutes ago Up 4 minutes 5432/tcp db2
4c92240096d9 training/postgres "su postgres -c '/us…" 4 minutes ago Up 4 minutes 5432/tcp db1
#使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。
DockerFile
dockerfile使用啦构建docker镜像的文件!命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build构建成为一个镜像
- docker run 运行镜像
- dockerpush发布镜像
dockerfile 构建过程
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,Tomcat镜像,这个Tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
EXPOSE # 暴露的端口配置
VOLUME # 挂载的目录
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD 的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建一个新的镜像层,并提交
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件
Dockerfile镜像逐渐成为企业交付的标准
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
实战测试
Docker Hub 中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的构建
创建自己的centos
# 1、编写DockerFile文件
[root@Ruanshuai dockerfile]# cat mydockerfile-centos
FROM centos:7
MAINTAINER Ruanshuai<Rs_15137631396@163.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
CMD和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
# 编写dockerfile文件
vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
# 构建镜像 并运行
tomcat镜像
准备镜像文件Tomcat压缩包,jdk压缩包
编写dockerfile文件
2/编写dockerfile文件,官方命名Dockerfile (build 会自动寻找dockerfile文件不用加-f)
FROM centos:7
MAINTAINER Ruanshuai<Rs_15137631396@163.com>
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.35.tar.gz /usr/local/
ADD jdk-8u371-linux-aarch64.tar.gz /usr/local/
RUN yum -y install yum
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_371
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.35/bin/logs/catalina.out
3.、构建镜像
docker build -t name .
4、启动镜像
发布镜像
DockerHub
地址 https://hub.docker.com/注册自己的账号
在服务器上登录
docker login -- help
登录完毕后就可以提交镜像了,docker push
Docker网络
理解Docker0
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性,evth-pair冲淡一个桥梁,连接着各种虚拟网络设备
# 容器与容器之间是可以ping通的,容器与服务器之间也是可以ping通的
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了
–link
思考一个场景,编写一个微服务,database url =ip,项目不重启,数据库ip改变,我们希望可以处理这个问题,不停止服务,可以用名字来进行访问容器
docker exec -it tomcat02 ping tomcat01
Name or service not know
# 通过--link解决
[root@Ruanshuai ~]# docker run -d -P --name tomcat05 --link tomcat02 tomcat
01942b0a426fa7695f96fd27b77732f7b2170d6b1d83b9771d1100064f7a7f9f
# 但是不能双向
tomcat05就是在本地配置了tomcat02的配置
# 查看hosts配置中
[root@Ruanshuai ~]# docker exec -it tomcat05 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat02 29e26d0d71f2
172.17.0.4 01942b0a426f
本质探究:–link 就是我们在hosts文件中配置了增加了一个
不建议使用:
docker0问题:它不支持容器名访问
自定义网络
查看所有的docker网络
[root@Ruanshuai ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
67bba25886e5 bridge bridge local
7efa165a6225 host host local
bac3199ff109 none null local
网络模式
bridge:桥接模式(默认),docker大桥
none:不配置网络
host:和宿主机共享网络
container:容器网络联通(用的少,局限大)
测试
# 我们直接启动的命令,--net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
#docker0特点:默认,域名不能访问,--link可以打通
#自定义网络
[root@Ruanshuai ~]# docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ff906ac6cc5442154cc8ca7bde3e9d71a21bd1bcb662a9015cd4be06a2e12097
[root@Ruanshuai ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
67bba25886e5 bridge bridge local
7efa165a6225 host host local
ff906ac6cc54 mynet bridge local
bac3199ff109 none null local
[root@Ruanshuai ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.057 ms
^C
--- 192.168.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.054/0.062/0.076/0.009 ms
Docker Compose
Docker Swarm
搭建集群
私网、公网 ip addr
# 初始化
[root@iZ0jl8e9o1v9067b60p4c9Z ~]# docker swarm init --advertise-addr 172.22.211.67
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker
[root@iZ0jl8e9o1v9067b60p4c7Z ~]# docker swarm join --token SWMTKN-1-00psglbjt23q68qpcxxz1whwj26jj3nziaq1393w83zzwkynco-5xazonivhcz5mpuabwrhcuvll 172.22.211.67:2377
This node joined a swarm as a worker.
#查看swarm节点
docker node ls
生成主节点init
加入(管理者、worker)
Docker Stack
8.0.3 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.054/0.062/0.076/0.009 ms
## Docker Compose
## Docker Swarm
### 搭建集群
<img src="C:\Users\86151\Pictures\Saved Pictures\Markdown图片\docker_swarm_init.png" alt="docker_swarm_init" style="zoom:50%;" />
私网、公网 ip addr
~~~ shell
# 初始化
[root@iZ0jl8e9o1v9067b60p4c9Z ~]# docker swarm init --advertise-addr 172.22.211.67
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker
[root@iZ0jl8e9o1v9067b60p4c7Z ~]# docker swarm join --token SWMTKN-1-00psglbjt23q68qpcxxz1whwj26jj3nziaq1393w83zzwkynco-5xazonivhcz5mpuabwrhcuvll 172.22.211.67:2377
This node joined a swarm as a worker.
#查看swarm节点
docker node ls
[外链图片转存中…(img-6nDLr2nr-1683018510653)]
生成主节点init
加入(管理者、worker)