docker swarm集群部署服务
- 机器配置
- 设置域名
- Swarm集群使用
- 设置管理节点
- info查看swarm状态
- join-token查看管理节点命令和令牌
- 查看节点信息
- join --token将工作节点添加到swarm中
- 创建网络
- Service管理服务
- create创建服务
- logs查看服务日志
- ls查看所有服务
- ps列出所有运行的服务
- rm删除服务
- rollback恢复对服务配置的更改
- scale复制的服务
- update更新服务
- Node管理节点
- rm删除节点
- scale复制的服务
- update更新节点
- Config配置
- create创建配置
- inspect查看详情
- ls查看所有
- rm删除配置
- stack部署
- deploy部署
- ls查看所有
- ps查看运行的堆栈
- rm删除堆栈
- services列出服务
官网:https://docs.docker.com/engine/swarm/
功能亮点
与 Docker Engine 集成的集群管理:使用 Docker Engine CLI 创建一组 Docker Engine,您可以在其中部署应用程序服务。您不需要额外的编排软件来创建或管理集群。
去中心化设计: Docker 引擎不是在部署时处理节点角色之间的差异,而是在运行时处理任何专业化。您可以使用 Docker 引擎部署两种类型的节点、管理器和工作器。这意味着您可以从单个磁盘映像构建整个集群。
声明式服务模型: Docker Engine 使用声明式方法让您定义应用程序堆栈中各种服务的所需状态。例如,您可能会描述一个应用程序,该应用程序由具有消息队列服务和数据库后端的 Web 前端服务组成。
缩放:对于每个服务,您可以声明要运行的任务数量。当您扩大或缩小规模时,群管理器会通过添加或删除任务来自动适应以保持所需的状态。
期望状态协调: swarm 管理器节点不断监控集群状态,并协调实际状态和您表达的期望状态之间的任何差异。例如,如果您设置一个服务来运行容器的 10 个副本,并且托管其中两个副本的工作机器崩溃,则管理器会创建两个新副本来替换崩溃的副本。swarm manager 将新的副本分配给正在运行且可用的 worker。
多主机网络:您可以为您的服务指定一个覆盖网络。群管理器在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
服务发现: Swarm 管理器节点为 Swarm 中的每个服务分配一个唯一的 DNS 名称并平衡运行容器的负载。您可以通过嵌入在 swarm 中的 DNS 服务器查询在 swarm 中运行的每个容器。
负载均衡:您可以将服务的端口暴露给外部负载均衡器。在内部,swarm 允许您指定如何在节点之间分发服务容器。
默认安全: swarm 中的每个节点都强制执行 TLS 相互身份验证和加密,以保护自身与所有其他节点之间的通信。您可以选择使用自签名根证书或来自自定义根 CA 的证书。
滚动更新:在推出时,您可以增量地将服务更新应用到节点。swarm 管理器允许您控制服务部署到不同节点集之间的延迟。如果出现任何问题,您可以回滚到该服务的先前版本。节点工作原理
swarm 模式如何接受服务创建请求并将任务调度到工作节点。
4.1.Swarm集群条件
三个可以通过网络通信的 Linux 主机,安装了 Docker
管理员机器的IP地址
打开主机之间的端口
用于集群管理通信的TCP 端口 2377
用于节点间通信的TCP和UDP 端口 7946
UDP 端口 4789用于覆盖网络流量
需要三个安装了 Docker 并且可以通过网络进行通信的 Linux 主机。这些可以是物理机、虚拟机、Amazon EC2 实例或以其他方式托管。
其中一台机器是经理(称为manager1),其中两台是工人(worker1和worker2)
机器配置
设置域名
永久生效不重启:hostnamectl set-hostname worker2
永久生效需要重启才能生效:
vim /etc/sysconfig/network
临时生效:hostname worker2
Swarm集群使用
docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca 显示并旋转根CA
init 初始化swarm集群
join 将工作加点加入到管理节点
join-token 加入管理节点令牌
leave 离开swarm集群
unlock 解锁swarm集群
unlock-key 管理解锁秘钥key
update 更新swarm集群
设置管理节点
sudo docker swarm init --help
Usage: docker swarm init [OPTIONS]
初始化swarm集群
Options:
--advertise-addr string 绑定IP地址,如果是云上,建议使用私网,私网之间通信不需要流量 (format: <ip|interface>[:port])
--autolock 启用管理器自动锁定(需要解锁密钥才能启动已停止的管理器)
--availability string 节点的可用模式 ("active"|"pause"|"drain") (default "active")
--cert-expiry duration 节点证书的有效期 (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string 用于数据路径通信的地址或接口 (format: <ip|interface>)
--data-path-port uint32 用于数据路径通信的端口 (1024 - 49151). 果未设置值或设置为0,则使用默认端口(4789).
--default-addr-pool ipNetSlice CIDR格式的默认地址池 (default [])
--default-addr-pool-mask-length uint32 默认地址池子网掩码长度 (default 24)
--dispatcher-heartbeat duration 调度器心跳周期 (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca 一个或多个证书签名终结点的规范
--force-new-cluster 强制从当前状态创建新群集
--listen-addr node-addr 监听地址(format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--max-snapshots uint 要保留的附加快照数
--snapshot-interval uint Raft快照之间的日志条目数(默认值10000)
--task-history-limit int 任务历史记录保留限制(默认值5)
[root@localhost ~]#
1、示例:
docker swarm init --advertise-addr 192.168.3.85
[root@localhost ~]# docker swarm init --advertise-addr 192.168.3.85
Swarm initialized: current node (uhqsbzo5s3i3i3nhfr4o7m3gu) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2o01hzyxquaiodr27h40obm66i906dhfvp002rnfm9isr5okkf-6n2ux88advdj2jqwkbb3wp7sj 192.168.3.85:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@localhost ~]#
该–advertise-addr标志将管理器节点配置为将其地址发布为192.168.99.100。群中的其他节点必须能够访问 IP 地址的管理器。输出包括将新节点加入群的命令。根据–token 标志的值,节点将作为经理或工人加入。
info查看swarm状态
运行docker info以查看 swarm 的当前状态:docker info
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 19
Server Version: 20.10.7
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: uhqsbzo5s3i3i3nhfr4o7m3gu
Is Manager: true
ClusterID: vpa4ed0unejfh8kl2pjt1m9ci
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.3.85
Manager Addresses:
192.168.3.85:2377
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.934GiB
Name: localhost.localdomain
ID: 354G:VTVT:M5Q6:S3BS:ZY4S:BGWN:JHCZ:UV5E:35RZ:CMED:G3P6:ZR7F
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
hub.docker.com
120.79.51.144:8079
192.168.0.85:8085
192.168.0.85:8086
127.0.0.0/8
Live Restore Enabled: false
WARNING: API is accessible on http://0.0.0.0:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/go/attack-surface/
[root@localhost ~]#
join-token查看管理节点命令和令牌
要查看管理节点的加入命令和令牌。
docker swarm join-token manager
传递–quiet标志以仅打印令牌:
docker swarm join-token --quiet worker
运行swarm join-token --rotate使旧令牌无效并生成新令牌。指定是否要为worker或manager 节点轮换令牌:
$ docker swarm join-token --rotate worker
查看节点信息
node ls查看节点信息:
[root@localhost ~]#
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
uhqsbzo5s3i3i3nhfr4o7m3gu * localhost.localdomain Ready Active Leader 20.10.7
[root@localhost ~]#
在*该节点ID下表明当前连接此节点上。Docker Engine swarm 模式会自动为机器主机名命名节点。
该AVAILABILITY列显示调度程序是否可以将任务分配给节点:
Active 意味着调度程序可以将任务分配给节点。
Pause 意味着调度程序不会将新任务分配给节点,但现有任务会继续运行。
Drain意味着调度程序不会向节点分配新任务。调度程序关闭任何现有任务并将它们安排在可用节点上。
该MANAGER STATUS列显示节点参与 Raft 共识:
没有值表示工作节点不参与群管理。
Leader 意味着该节点是主要管理器节点,它为集群做出所有集群管理和编排决策。
Reachable表示该节点是参与 Raft 共识仲裁的管理节点。如果领导节点变得不可用,则该节点有资格被选举为新的领导者。
Unavailable意味着该节点是一个无法与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群或将工作节点提升为管理器。
join --token将工作节点添加到swarm中
使用管理节点docker swarm init输出 生成的命令,以创建加入到现有 swarm 的工作节点:
该docker swarm join命令执行以下操作:
将当前节点上的 Docker 引擎切换到 swarm 模式。
向管理器请求 TLS 证书。
使用机器主机名命名节点
根据群令牌将当前节点加入到管理器监听地址的群中。
将当前节点设置为Active可用性,这意味着它可以从调度程序接收任务。
将ingress覆盖网络扩展到当前节点。
1、将192.168.3.86添加到管理节点
docker swarm join --token SWMTKN-1-2o01hzyxquaiodr27h40obm66i906dhfvp002rnfm9isr5okkf-6n2ux88advdj2jqwkbb3wp7sj 192.168.3.85:2377
2、将192.168.3.87添加到管理节点
docker swarm join --token SWMTKN-1-2o01hzyxquaiodr27h40obm66i906dhfvp002rnfm9isr5okkf-6n2ux88advdj2jqwkbb3wp7sj 192.168.3.85:2377
3、查看工作节点
打开终端并通过 ssh 进入管理节点运行的机器并运行docker node ls命令以查看工作节点。
创建网络
您可以使用覆盖网络连接群内的一项或多项服务。
首先,使用docker network create 带有--driver overlay标志的命令在管理器节点上创建覆盖网络。
$ docker network create --driver overlay my-network
在群模式下创建覆盖网络后,所有管理器节点都可以访问网络。
您可以创建一个新服务并传递--network标志以将服务附加到覆盖网络:
$ docker service create \
--replicas 3 \
--network my-network \
--name my-web \
nginx
swarm 扩展my-network到运行服务的每个节点。
您还可以使用该--network-add标志将现有服务连接到覆盖网络 。
$ docker service update --network-add my-network my-web
要将正在运行的服务与网络断开连接,请使用该--network-rm标志。
$ docker service update --network-rm my-network my-web
使用该--ingress标志以及您要设置的自定义选项创建一个新的覆盖网络。本示例将 MTU 设置为 1200,将子网设置为10.11.0.0/16,并将网关设置为10.11.0.2。
$ docker network create \
--driver overlay \
--ingress \
--subnet=10.11.0.0/16 \
--gateway=10.11.0.2 \
--opt com.docker.network.driver.mtu=1200 \
my-ingress
$docker network create \
--driver=overlay \
--subnet=172.12.0.0/16 \
--ip-range=172.12.0.0/16 \
--gateway=172.12.0.1 \
--attachable \
net01
Service管理服务
sudo docker service --help
Usage: docker service COMMAND
管理服务
Commands:
create 创建服务
inspect 查看服务信息
logs 获取服务或任务的日志
ls 查看所有服务
ps 列出一个或多个服务的任务
rm 删除服务
rollback 恢复对服务配置的更改
scale 扩展一个或多个复制的服务
update 更新服务
Run 'docker service COMMAND --help' for more information on a command.
[root@localhost ~]#
create创建服务
Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new service
Options:
--cap-add list 添加Linux功能
--cap-drop list 删除Linux功能
--config config 指定要向服务公开的配置
--constraint list 布局约束
--container-label list 容器标签
--credential-spec credential-spec 托管服务帐户的凭据规范(仅限Windows)
-d, --detach 立即退出,而不是等待服务聚合
--dns list 设置自定义DNS服务
--dns-option list 设置DNS选项
--dns-search list 设置自定义DNS搜索域
--endpoint-mode string 端点模式(vip或dnsrr)(默认为“vip”)
--entrypoint command 覆盖镜像的默认入口点
-e, --env list 设置环境变量
--env-file list 通过文件读入环境变量
--generic-resource list 用户定义的资源
--group list 为容器设置一个或多个补充用户组
--health-cmd string 运行命令检查状况
--health-interval duration 设置健康检查时间 (ms|s|m|h)
--health-retries int 需要报告连续故障
--health-start-period duration 计算重试次数之前容器初始化的开始时间(ms|s|m|h)
--health-timeout duration 允许运行一次检查的最长时间(ms|s|m|h)
--host list 设置一个或多个自定义主机到IP映射(主机:IP)
--hostname string 设置容器主机名
--init 在每个服务容器中使用init来转发信号和获取进程
--isolation string 服务容器隔离模式
-l, --label list 设置服务标签
--limit-cpu decimal 限制 CPUs
--limit-memory bytes 限制 内存
--limit-pids int 限制最大进程数(default 0 = unlimited)
--log-driver string 服务日志驱动程序
--log-opt list 服务日志驱动选项
--max-concurrent uint 要同时运行的作业任务数(默认为副本--replicas)
--mode string 设置服务模式 (replicated, global, replicated-job, or global-job) (default "replicated")
--mount mount 将文件系统装载附加到服务
--name string 设置服务名
--network network 设置网络
--no-healthcheck 禁用任何指定的容器 HEALTHCHECK
--no-resolve-image 不要查询注册表以解析图像摘要和支持的平台
--placement-pref pref 添加放置首选项
-p, --publish port 将端口发布为节点端口
-q, --quiet 抑制进度输出
--read-only 以只读方式装载容器的根文件系统
--replicas uint 设置任务副本数
--replicas-max-per-node uint Maximum number of tasks per node (default 0 = unlimited)
--reserve-cpu decimal Reserve CPUs
--reserve-memory bytes Reserve Memory
--restart-condition string Restart when condition is met ("none"|"on-failure"|"any") (default "any")
--restart-delay duration Delay between restart attempts (ns|us|ms|s|m|h) (default 5s)
--restart-max-attempts uint Maximum number of restarts before giving up
--restart-window duration Window used to evaluate the restart policy (ns|us|ms|s|m|h)
--rollback-delay duration Delay between task rollbacks (ns|us|ms|s|m|h) (default 0s)
--rollback-failure-action string Action on rollback failure ("pause"|"continue") (default "pause")
--rollback-max-failure-ratio float Failure rate to tolerate during a rollback (default 0)
--rollback-monitor duration Duration after each task rollback to monitor for failure (ns|us|ms|s|m|h) (default 5s)
--rollback-order string Rollback order ("start-first"|"stop-first") (default "stop-first")
--rollback-parallelism uint Maximum number of tasks rolled back simultaneously (0 to roll back all at once)
(default 1)
--secret secret Specify secrets to expose to the service
--stop-grace-period duration Time to wait before force killing a container (ns|us|ms|s|m|h) (default 10s)
--stop-signal string Signal to stop the container
--sysctl list Sysctl options
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
--update-delay duration 更新延迟时间 (ns|us|ms|s|m|h) (default 0s)
--update-failure-action string Action on update failure ("pause"|"continue"|"rollback") (default "pause")
--update-max-failure-ratio float Failure rate to tolerate during an update (default 0)
--update-monitor duration Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 5s)
--update-order string Update order ("start-first"|"stop-first") (default "stop-first")
--update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
-u, --user string 指定用户ID(format: <name|uid>[:<group|gid>])
--with-registry-auth 向swarm代理发送注册表身份验证详细信息
-w, --workdir string 容器内的工作目录
[root@localhost ~]#
1、示例
sudo docker service create --name my-nginx -p 8888:80 --hostname nginx --replicas 3 nginx
创建nginx服务,指定名称为my-nginx ,端口为8888,主机名为nginx,副本数为3.
浏览器测试:
http://192.168.3.87:8888/ http://192.168.3.86:8888/ http://192.168.3.85:8888/### inspect查看服务信息
Usage: docker service inspect [OPTIONS] SERVICE [SERVICE...]
Display detailed information on one or more services
Options:
-f, --format string Format the output using the given Go template
--pretty Print the information in a human friendly format
[root@localhost ~]#
1、示例
sudo docker service inspect my-nginx
logs查看服务日志
Usage: docker service logs [OPTIONS] SERVICE|TASK
Fetch the logs of a service or task
Options:
--details 显示提供给日志的其他详细信息
-f, --follow 跟踪日志输出
--no-resolve 不要将ID映射到输出中的名称
--no-task-ids 不要在输出中包含任务ID
--no-trunc 不要截断输出
--raw 不要格式化日志
--since string 输出从xxx到xx的日志 (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string 从日志末尾显示的行数 (default "all")
-t, --timestamps 显示时间戳
[root@localhost ~]#
1、示例
sudo docker service logs my-nginx
sudo docker service logs -n 5 my-nginx
ls查看所有服务
Usage: docker service ls [OPTIONS]
List services
Aliases:
ls, list
Options:
-f, --filter filter 根据提供的条件筛选输出
--format string 使用go模版打印服务
-q, --quiet 仅显示IDs
[root@localhost ~]#
1、示例
sudo docker service ls
ps列出所有运行的服务
Usage: docker service ps [OPTIONS] SERVICE [SERVICE...]
List the tasks of one or more services
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print tasks using a Go template
--no-resolve Do not map IDs to Names
--no-trunc Do not truncate output
-q, --quiet Only display task IDs
[root@localhost ~]#
1、示例
sudo docker service ps my-nginx
在这里插入图片描述
rm删除服务
sudo docker service rm my-nginx
rollback恢复对服务配置的更改
Usage: docker service rollback [OPTIONS] SERVICE
恢复对服务配置的更改
Options:
-d, --detach 立即退出,而不是等待服务聚合
-q, --quiet 抑制进度输出
[root@localhost ~]#
scale复制的服务
Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
扩展一个或多个复制的服务
Options:
-d, --detach 立即退出,而不是等待服务聚合
[root@localhost ~]#
1、示例
sudo docker service scale my-nginx=3
update更新服务
sudo docker service update --replicas 2 my-nginx
Node管理节点
sudo docker node --help
Usage: docker node COMMAND
Manage Swarm nodes
Commands:
demote 从群中的管理器降级一个或多个节点
inspect 显示一个或多个节点的详细信息
ls 查看swarm所有节点
promote 将一个或多个节点升级到群中的manage
ps 列出在一个或多个节点上运行的任务,默认为当前节点
rm 从群中删除一个或多个节点
update 更新节点
Run 'docker node COMMAND --help' for more information on a command.
[root@localhost ~]#
1.demote从群中的管理器降级一个或多个节点
2.inspect查看节点信息
[root@localhost ~]# sudo docker node inspect --help
Usage: docker node inspect [OPTIONS] self|NODE [NODE...]
Display detailed information on one or more nodes
Options:
-f, --format string Format the output using the given Go template
--pretty Print the information in a human friendly format
1、示例
sudo docker node inspect manager
3.ls查看所有节点
[root@localhost ~]# sudo docker node ls --help
Usage: docker node ls [OPTIONS]
List nodes in the swarm
Aliases:
ls, list
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print nodes using a Go template
-q, --quiet Only display IDs
[root@localhost ~]#
[root@localhost ~]#
1、示例
sudo docker node ls
4.ps查看节点信息
[root@localhost ~]# sudo docker node ps --help
Usage: docker node ps [OPTIONS] [NODE...]
List tasks running on one or more nodes, defaults to current node
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print tasks using a Go template
--no-resolve Do not map IDs to Names
--no-trunc Do not truncate output
-q, --quiet Only display task IDs
[root@localhost ~]#
1、示例
sudo docker node ps manager
rm删除节点
[root@localhost ~]# sudo docker node rm --help
Usage: docker node rm [OPTIONS] NODE [NODE...]
Remove one or more nodes from the swarm
Aliases:
rm, remove
Options:
-f, --force Force remove a node from the swarm
[root@localhost ~]#
1、示例
sudo docker node rm -f worker1
scale复制的服务
[root@localhost ~]# sudo docker service scale --help
Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
扩展一个或多个复制的服务
Options:
-d, --detach 立即退出,而不是等待服务聚合
[root@localhost ~]#
1、示例
sudo docker service scale my-nginx=3
update更新节点
Config配置
官网:https://docs.docker.com/compose/compose-file/compose-file-v3/#configs
在动态的、大规模的分布式集群上,管理和分发配置文件也是很重要的工作。传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性。
在 Docker 17.06 以上版本中,Docker 新增了 docker config 子命令来管理集群中的配置信息,以后你无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。
注意:config 仅能在 Swarm 集群中使用。
这里我们以在 Swarm 集群中部署 redis 服务为例。
命令格式:
[root@manager base]# docker config --help
Usage: docker config COMMAND
管理docker相关配置
Commands:
create 从文件或STDIN创建配置
inspect 显示一个或多个配置的详细信息
ls 列出所有配置
rm 删除配置
Run 'docker config COMMAND --help' for more information on a command.
[root@manager base]#
create创建配置
[root@manager base]# docker config create --help
Usage: docker config create [OPTIONS] CONFIG file|-
创建配置
Options:
-l, --label list 配置标签
--template-driver string 模板驱动程序
[root@manager base]#
1、示例
docker config create redis.conf redis.conf
2、compose示例
version: "3.9"services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_configconfigs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
version: "3.9"services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
3、创建redis服务
docker service create --name redis \
--hostname redis \
--network mynetwork \
--config redis.conf \
-p 6379:6379 redis:6.0 \
redis-server /redis.conf
$ docker service create \
--name redis \
# --config source=redis.conf,target=/etc/redis.conf \
--config redis.conf \
-p 6379:6380 \
redis:latest \
redis-server /redis.conf
可以看到在节点worker1上创建了一个redis服务。
如果你没有在 target 中显式的指定路径时,默认的 redis.conf 以 tmpfs 文件系统挂载到容器的 /config.conf。
经过测试,redis 可以正常使用。
以前我们通过监听主机目录来配置 Redis,就需要在集群的每个节点放置该文件,如果采用 docker config 来管理服务的配置信息,
我们只需在集群中的管理节点创建 config,当部署服务时,集群会自动的将配置文件分发到运行服务的各个节点中,大大降低了配置信息的管理和分发难度。
3、测试redis服务
登录worker1服务器上,查看redis服务。
进入redis容器:sudo docker exec -it 8e5587f2a3ad bash
登录redis操作:
redis-cli
auth “123456”
set name ‘lisi’
get name
4、扩展redis服务
sudo docker service scale redis=3
可以看到扩展了3个副本,分别在manager/worker1/worker2上创建一个redis副本服务。
登录到manager测试:
sudo docker service ps redis
sudo docker ps
sudo docker exec -it f2c3b34f0d2e bash
redis-cli -p 6379 -a 123456
Worker1节点:
Worker2节点:
inspect查看详情
Usage: docker config inspect [OPTIONS] CONFIG [CONFIG...]
Display detailed information on one or more configs
Options:
-f, --format string 使用go模版格式化输出
--pretty 使用goson格式化输出
[root@manager base]#
1、示例
docker config inspect redis.conf
ls查看所有
[root@manager base]# docker config ls --help
Usage: docker config ls [OPTIONS]
List configs
Aliases:
ls, list
Options:
-f, --filter filter 基于所提供条件的过滤器输出
--format string 使用go模版打印输出
-q, --quiet 只显示容器ID
[root@manager base]#
1、示例
docker config ls
rm删除配置
sudo docker config rm redis.conf
stack部署
sudo docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string 要使用的编排 (swarm|kubernetes|all)
Commands:
deploy 部署新堆栈或更新现有堆栈
ls 列表堆栈
ps 列出堆栈中的任务
rm 移除一个或多个堆栈
services 列出堆栈中的服务
Run 'docker stack COMMAND --help' for more information on a command.
[root@localhost test02]#
deploy部署
[root@localhost test02]# docker stack deploy --help
Usage: docker stack deploy [OPTIONS] STACK
部署新堆栈或更新现有堆栈
Aliases:
deploy, up
Options:
-c, --compose-file strings 指定docker-compose.yml文件
--orchestrator string 使用的编排方式 (swarm|kubernetes|all)
--prune 删除不再引用的服务
--resolve-image string 查询注册表以解析镜像摘要和支持的平台("always"|"changed"|"never")(default "always")
--with-registry-auth 向Swarm代理发送注册表身份验证详细信息
[root@localhost test02]#
1、示例
sudo docker stack deploy -c docker-compose.yml redis
sudo docker stack deploy -c mysql-stack.yml mysql
ls查看所有
sudo docker stack ls
ps查看运行的堆栈
[root@manager base]# sudo docker stack ps --help
Usage: docker stack ps [OPTIONS] STACK
List the tasks in the stack
Options:
-f, --filter filter 根据提供的条件筛选输出
--format string 使用go模版打印输出
--no-resolve 不要将ID映射到名称
--no-trunc 不要截断输出
--orchestrator string O要使用的编排器 (swarm|kubernetes|all)
-q, --quiet 只是输出容器ID
[root@manager base]#
1、示例
sudo docker stack ps mysql
sudo docker stack ps --no-resolve mysql
rm删除堆栈
[root@manager base]# sudo docker stack rm --help
Usage: docker stack rm [OPTIONS] STACK [STACK...]
删除堆栈
Aliases:
rm, remove, down
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
[root@manager base]#
1、示例
sudo docker stack rm mysql
services列出服务
[root@manager base]# sudo docker stack services --help
Usage: docker stack services [OPTIONS] STACK
列出所有堆栈
Options:
-f, --filter filter 根据提供的条件筛选输出
--format string 使用go模版打印输出
--orchestrator string 要使用的编排器 (swarm|kubernetes|all)
-q, --quiet 只是输出容器ID
[root@manager base]#
1、示例
sudo docker stack services mysql