文章目录
前言
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到
一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,
也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
docker的优势
灵活性:即使是最复杂的应用程序也可以容器化。
轻量级:容器利用并共享主机内核,使它们在系统资源方面比虚拟机更有效率。
可移植:您可以在本地构建,部署到云上,并在任何地方运行。
松耦合:容器是高度自给自足和封装的,允许您在不影响其他容器的情况下替换或升级其中一个。
可扩展:您可以跨数据中心增加和自动分发容器副本。
安全性:容器对进程应用主动约束和隔离,而不需要用户进行任何配置。
Docker和虚拟机技术的区别
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离
等等,极大的简化了容器的创建和维护。使得 Docker技术比虚拟机技术更为轻便、
快捷。下面比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟
出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有
进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
特性 | docker容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生(宿主机) | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker中的三个重要概念
Image(镜像)一个特殊的文件系统
可以把它理解成一个虚拟机的快照(Snapshot),里面包含了你要部署的应用程序
以及它所关联的所有库。操作系统分为内核和用户空间。对于Linux而言,内核启动
后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当
于是一个root文件系统。Docker镜像是一个特殊的文件系统,除了提供容器运行时所
需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数
(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后
也不会被改变。
Container(容器)镜像运行时的实体
这里的容器就像是一台台运行起来的虚拟机,里面运行了你的应用程序,每个容器
是独立运行的他们相互之间不影响。通过一个镜像,我们可以创建许多个不同的
Container容器。镜像(Image)和容器(Container)的关系,就像是面向对象程
序设计中的类和类的实例一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在
宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜
像使用的是分层存储,容器也是如此。容器存储层的生存周期和容器一样,容器
消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容
器删除而丢失。
Repository(仓储)集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器
上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务(就像Git仓库一样)
,Docker Registry就是这样的服务。一个Docker Registry中可以包含多个仓库
(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的
代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于
对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这
个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
docker安装
操作系统要求
要安装Docker Engine,您需要以下一个CentOS版本的维护版本:
CentOS 7
CentOS 8(流)
CentOS 9(流)
卸载老的版本
旧版本的Docker使用Docker或Docker引擎。在尝试安装新版本以及相关的依赖项之前,请先卸载任何此类旧版本。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum可能会报告您没有安装这些软件包。
卸载docker时,存储在/var/lib/doker/中的映像、容器、卷和网络不会自动删除。
安装方法
您可以根据需要以不同的方式安装Docker Engine:
您可以设置Docker的存储库并从中进行安装,以便于安装和升级任务。这是推荐的方法。
您可以下载RPM软件包,手动安装,并完全手动管理升级。这在无法访问互联网的气隙系统上安装Docker等情况下很有用。
在测试和开发环境中,您可以使用自动化的便利脚本来安装Docker。
使用rpm存储库进行安装
在新主机上首次安装Docker Engine之前,您需要设置Docker存储库。之后,您可以从存储库中安装和更新Docker。
设置存储库
安装yum-utils包(它提供了yum-config-manager实用程序)并设置存储库。
sudo yum install -y yum-utils
#docker镜像仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#设置阿里镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker引擎
1.安装Docker Engine、containerd和Docker Compose
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果提示接受GPG密钥,请验证指纹是否与060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35匹配,如果匹配,请接受。
此命令安装Docker,但不会启动Docker。它还创建了一个docker组,但是,它没有通过defa向该组添加任何用户
ult。
2.启动Docker
sudo systemctl start docker
3.通过运行helloworld镜像来验证Docker引擎安装是否成功。
sudo docker run hello-world
此命令下载测试映像并在容器中运行。当容器运行时,它会打印一条确认消息并退出。
您现在已经成功安装并启动了Docker引擎。
升级Docker引擎
要升级Docker引擎,请按照安装说明,选择要安装的新版本。
从程序包安装
如果你不能使用Docker的rpm存储库来安装Docker引擎,你可以下载你的版本的.rpm文件并手动安装。每次升级Docker引擎时,都需要下载一个新文件。
1.转到https://download.docker.com/linux/centos/并选择您的CentOS版本。然后浏览到x86_64/stable/Packages/并下载要安装的Docker版本的.rpm文件。
2.安装Docker引擎,将以下路径更改为下载Docker软件包的路径。
sudo yum install /path/to/package.rpm
Docker已安装,但尚未启动。docker组已创建,但没有用户添加到该组
3.启动Docker
sudo systemctl start docker
4.通过运行helloworld镜像来验证Docker引擎安装是否成功。
sudo docker run hello-world
此命令下载测试映像并在容器中运行。当容器运行时,它会打印一条确认消息并退出。
您现在已经成功安装并启动了Docker引擎。
docker常用命令
1 镜像相关
1.1 查看镜像列表
sudo docker images
1.2 镜像搜索
sudo docker search ubuntu
比如搜索 ubuntu 基础镜像
可输出官方的镜像名称,以及 star 数量,选择一个需要的镜像下拉即可
1.3 下拉镜像
sudo docker pull 镜像名
sudo docker pull 镜像名:Tag
1.4 删除镜像
sudo docker rmi -f 镜像名/镜像ID
1.5 保存镜像
将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
1.6 加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
2 容器相关
2.1 容器列表
sudo docker ps
sudo docker ps -a # 查看所有容器 -----包含正在运行 和已停止的
2.2 创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash
docker start 容器id #启动已有容器
参数含义:
-it 表示 与容器进行交互式启动(进入容器,需要加上!!!)(后台运行时不加上启动时docker会认为这个这个进程不活跃,自动关闭)
-d 表示可后台运行容器 (守护式运行)
–name 给要运行的容器 起的名字
/bin/bash 交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置
-e 修改配置参数,如es默认占用内存是非常大的,需要修改参数,-e ES_JAVA_OPTS=“-Xms 64m -Xmx512m”
2.3 停止容器
sudo docker stop 容器名/容器ID
2.4 删除容器
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
2.5 进入容器
docker attach 容器ID/容器名 #进入正在运行中的容器,退出容器会导致容器停止
docker exec -it 容器id /bin/bash #进入容器开启一个新的bash终端,退出容器终端不会导致容器停止
2.6退出容器
exit #退出容器并停止
Ctrl+p+q #退出容器,保持后台运行
2.7查看日志
docker logs -f 容器id
docker logs -f --tail 300 容器id #查询前300行日志
2.8查看元数据
docker inspect 容器id
2.9拷贝
从容器内拷贝到当前主机
docker cp 容器id:/test.java /usr/local/src
DockerFile
DockerFile常用命令
FROM
指定基础镜像,并且必须是第一条指令。
如果不以任何镜像为基础,那么写法为:FROM scratch。
FROM <image>FROM <image>:<tag>FROM <image>:<digest>
其中<tag>和<digest> 是可选项,默认值为latest
MAINTAINER
指定作者,国际标准为姓名加邮箱
MAINTAINER <name>
LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。
LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
// 语法格式如下:LABEL <key>=<value> <key>=<value> <key>=<value> ...// 添加作者LABEL org.opencontainers.image.authors="cy"
ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,
不同之处如下:
ADD 的优点:在执行 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,
会自动复制并解压到目标路径。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,
从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
ADD $PWD/test.jar /usr/local/
COPY
COPY 指令从 复制新文件、目录或远程文件 URL,并将它们添加到路径可以指定
多个 资源,但如果它们是文件或目录,则它们的路径被解析为相对于构建上下文的源
COPY $PWD/test.jar /usr/local/
通配符用法:
* 通配符:把所有 hom 开头的文件复制到镜像文件系统的 /mydir/ 目录下
COPY hom* /mydir/
* ? 通配符:?匹配 0 或 1 个字符,比如会把 home.txt 文件复制到 /mydir/ 目录下
COPY hom?.txt /mydir/
EXPOSE
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
EXPOSE <端口1> [<端口2>...]
ENV
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
在Dockerfile中使用变量的方式
$varname
${varname}
${varname:-default value}:当变量不存在使用-号后面的值
$(varname:+default value}:当变量存在时使用+号后面的值(当然不存在也是使用后面的值)
RUN
用于执行后面跟着的命令行命令
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
容器启动时运行的启动命令。
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,
而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT
指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
与CMD的区别:
ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个
完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数;
如果CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
// 实例:
1、Dockerfile 构建了 nginx:test 镜像
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
2、不传参运行,容器内会默认运行以下命令,启动主进程。
$ docker run nginx:test // nginx -c /etc/nginx/nginx.conf
3、传参运行,容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假
设容器内已有此文件)
$ docker run nginx:test -c /etc/nginx/new.conf // nginx -c /etc/nginx/new.conf
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。
(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过
WORKDIR 创建的目录才会一直存在。
WORKDIR <工作目录路径>
Docker网络
安装Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),
它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 在创建一个容器的时候,会执行如下操作:
创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;
本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,
如 vethxxxxx;容器一端放到新容器中,并修改名字作为 eth0,这个网卡
接口只在容器的名字空间可见;从网桥可用地址段中(也就是与该bridge对应的network
)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 vethxxxx。
容器互联
–link
通过–link可以实现容器之间的互联
#tomcat02通过 --link链接tomcat01
docker run -it -P -d --name tomcat02 --link tomcat01 fb5657adc892
##可以看到tomcat02 hosts配置文件下已配置tomcat01,可以
[root@localhost ~]# docker exec -it tomcat02 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 tomcat01 de436ebbf557
172.17.0.3 937c9a22a00a
[root@localhost ~]#
##tomcat01的hosts文件下未配置tomcat02,需要链接tomcat02,也需要在docker run时指定--link
[root@localhost ~]# docker exec -it tomcat01 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 de436ebbf557
[root@localhost ~]#
network
通过docker网络可以实现容器之间的互联
## 查看docker网络 bridge(桥接模式,也就是docker0) host(本地网络)
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cba235590f01 bridge bridge local
baf05b84bdfb host host local
ea74d4b355a4 none null local
## 查看创建docker网络时指定的参数
[root@localhost ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
## 指定链接方式,默认桥接,也是我们需要创建的模式
-d, --driver string Driver to manage the Network (default "bridge")
## 指定网关
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
## 指定子网
--subnet strings Subnet in CIDR format that represents a network segment
## 创建自己的网络
docker network create -d bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet
## 查看网络,已创建完毕
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "3d55e2ccfed08e00e34f112bdafcf307007441da8715da89c20e54afeea80af0",
"Created": "2023-11-08T17:47:06.611839944+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
## 创建两个容器,并指定自己创建的网络mynet
[root@localhost ~]# docker run -P -d -it --name tomcat01 --network mynet fb5657adc892
7875c3f572a65e76a53335ad01a359a009daf84fcc0e39e9015efd0daa7a9e28
[root@localhost ~]# docker run -P -d -it --name tomcat02 --network mynet fb5657adc892
819006e49b256ca8c3437d2dd7627a7011cc93297a3ebb2e860aa8a81809bb6e
[root@localhost ~]#
## 查看mynet网络,可以看到Containers下有配置的两个容器
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "3d55e2ccfed08e00e34f112bdafcf307007441da8715da89c20e54afeea80af0",
"Created": "2023-11-08T17:47:06.611839944+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"7875c3f572a65e76a53335ad01a359a009daf84fcc0e39e9015efd0daa7a9e28": {
"Name": "tomcat01",
"EndpointID": "687f42953a8d54ec73282898643cc1059ec6f5591f96deda7a2dea87e3ea9ba9",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"819006e49b256ca8c3437d2dd7627a7011cc93297a3ebb2e860aa8a81809bb6e": {
"Name": "tomcat02",
"EndpointID": "a23b2f3b961d796e7dcf8d7ebf7a94bb4fbc10df219d79ebd317d595eb9a8966",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Docker搭建mysql主从
##下载镜像
docker pull mysql:5.7
##创建自定义网络
docker network create -d bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet
##创建主从容器
docker run -it -d \
--name=mysql_master \
--network mynet \
-p 7001:3306 \
-v $PWD/master/conf:/etc/mysql/conf.d \
-v $PWD/master/logs:/logs \
-v $PWD/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
c20987f18b13
docker run -it -d \
--name=mysql_slave \
--network mynet \
-p 7002:3306 \
-v $PWD/slave/conf:/etc/mysql/conf.d \
-v $PWD/slave/logs:/logs \
-v $PWD/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
c20987f18b13
##配置文件主
[mysqld]
# 数据库字符集
character_set_server=utf8
# mysql编号(只可以是数字) 每个节点不一样
server_id=1
# 开始binlog日志,规定日志文件名称
log-bin=mysql-bin
# 开启relaylog日志,规定日志文件名称
relay_log=relay_bin
# 从库的写操作是否写入binlog日志
log-slave-updates=1
# 采用严格的SQL语句模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
##配置文件从
[mysqld]
# 数据库字符集
character_set_server=utf8
# mysql编号(只可以是数字) 每个节点不一样
server_id=2
# 开始binlog日志,规定日志文件名称
log_bin=mysql_bin
# 开启relaylog日志,规定日志文件名称
relay_log=relay_bin
# 限制普通账户无法insert、delete、update语句,但是该配置对于管理员账号无效
read-only=1
# 采用严格的SQL语句模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
##进入主容器,创建同步账号
grant replication slave on *.* to 'slave'@'%' identified by '123456';
flush privileges;
##进入从容器
stop slave;
# 设置mysql_1数据库同步
change master to master_host="linux服务器ip",master_port=7001,master_user='slave',master_password='123456';
# 启动服务
start slave;
# 查看同步状态
show slave status\G;
Docker Swarm
查看swarm命令
[root@localhost ~]# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm ##初始化一个swarm
join Join a swarm as a node and/or manager ##作为节点或管理者加入swarm
join-token Manage join tokens ##管理者加入令牌
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
查看swarm初始化命令
[root@localhost ~]# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
创建swarm
[root@localhost ~]# docker swarm init --advertise-addr 192.168.64.128
Swarm initialized: current node (wntdtgdydv0700wc5ssldmusz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3d72x6xpsg0a6iy4w72b7w76gb1ejeh5ztj0z55kvk0iv8ool8-ay3gvp548cjtg9jdykuxdujrt 192.168.64.128:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查看如何加入一个manager或worker
docker swarm join-token manager
docker swarm join-token worker
查看所有swarm节点
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
reyhky6v0iy2t806po8yrebhp localhost.localdomain Ready Active 20.10.0
wntdtgdydv0700wc5ssldmusz * localhost.localdomain Ready Active Leader 20.10.0
在swarm中部署服务
##创建docker网络
docker network create -d overlay mynet2
##部署服务
[root@localhost ~]# docker service create --network mynet2 --name mytomcat tomcat
lffevfmu2q27slkask4oqfckv
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
##查看所有服务
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lffevfmu2q27 mynginx replicated 1/1 nginx:latest
[root@localhost ~]#
##查看部署的节点,也可通过docker ps查看
[root@localhost ~]# docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yjt79bc5w5c7 mynginx.1 nginx:latest localhost.localdomain Running Running 32 minutes ago