Docker进阶
1.Docker Compose
简介
Docker Compose可以轻松高效的管理容器,定义运行多个容器
Compose是Docker官方的开源项目,需要安装。
Dockerfile让程序在任何地方运行。
Compose文件
version: '2.0'
services:
web:
build:
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
docker-compose up 即使是100个服务也是一次性启动
Compose:重要的概念
- services : 容器,应用。(web,redis,nginx…)
- 项目project : 一组关联的容器
安装compose
安装
[root@localhost ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 633 100 633 0 0 963 0 --:--:-- --:--:-- --:--:-- 966
100 12.1M 100 12.1M 0 0 165k 0 0:01:15 0:01:15 --:--:-- 156k
[root@localhost ~]# ls /usr/local/bin/
docker-compose
授权
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# ll /usr/local/bin/docker-compose
-rwxr-xr-x. 1 root root 12728384 Jun 21 00:28 /usr/local/bin/docker-compose
查看是否安装成功
[root@localhost ~]# docker-compose version
docker-compose version 1.29.1, build c34c88b2
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
体验
官网参考地址
https://docs.docker.com/compose/gettingstarted/
创建一个目录,并编写一个文件
[root@localhost home]# mkdir composetest
[root@localhost home]# cd composetest/
[root@localhost composetest]# vim app.py
[root@localhost composetest]# cat app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
创建一个文件
[root@localhost composetest]# vim requirements.txt
[root@localhost composetest]# cat requirements.txt
flask
redis
创建dockerfile文件
[root@localhost composetest]# vim Dockerfile
[root@localhost composetest]# cat Dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
创建docker-compose.yml文件(定义整个服务,需要的环境),完整的上线服务
[root@localhost composetest]# vim docker-compose.yml
[root@localhost composetest]# cat docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
启动compose
[root@localhost composetest]# docker-compose up
Building web
Sending build context to Docker daemon 5.632kB
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
540db60ca938: Pull complete
a7ad1a75a999: Pull complete
37ce6546d5dd: Pull complete
ec9e91bed5a2: Pull complete
ecb9463b81f8: Pull complete
Digest: sha256:deaefc5e07ef1f3420411dd5225b2fc2ab23ae7731e8cb216d9fe74557d81db5
Status: Downloaded newer image for python:3.7-alpine
---> 078bbc5dc0e6
Step 2/10 : WORKDIR /code
---> Running in 54fa73a3b81a
Removing intermediate container 54fa73a3b81a
---> 54bca3558bce
Step 3/10 : ENV FLASK_APP=app.py
---> Running in c2fbc8416478
Removing intermediate container c2fbc8416478
---> fb1675a62b57
Step 4/10 : ENV FLASK_RUN_HOST=0.0.0.0
---> Running in 63f853ef73ba
Removing intermediate container 63f853ef73ba
---> 43b0a25be2df
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in 719ddddd7dab
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
``````
Creating composetest_redis_1 ... done
Creating composetest_web_1 ... done
``````
检测是否安装成功
有两个服务web和redis
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bbc65e77cda composetest_web "flask run" 46 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp composetest_web_1
d55d70dcb8d4 redis:alpine "docker-entrypoint.s…" 30 minutes ago Up 4 seconds 6379/tcp composetest_redis_1
验证5000端口,服务正常
[root@localhost ~]# curl localhost:5000
Hello World! I have been seen 1 times.
[root@localhost ~]# curl localhost:5000
Hello World! I have been seen 2 times.
docker images
写在 yaml 文件的服务,都会下载成镜像,不需要手动去 run
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 2d57dfc6002e 4 minutes ago 184MB
<none> <none> 2f35460abc9e 34 minutes ago 184MB
redis alpine 1690b63e207f 2 weeks ago 32.3MB
python 3.7-alpine 078bbc5dc0e6 3 weeks ago 41.9MB
hello-world latest d1165f221234 3 months ago 13.3kB
网络
通过docker-compose启动的服务都在同一个网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
023494d4b7e4 bridge bridge local
6b636dfe7c1e composetest_default bridge local
047aca2ce154 host host local
ec2fbbfb74a6 none null local
#可以看到redis和web在同一网络内,可以通过域名访问
[root@localhost ~]# docker network inspect 6b636dfe7c1e
[
{
"Name": "composetest_default",
"Id": "6b636dfe7c1e5c3a84de27f7872ddf5d1c69fe4e4b98e8f3edfa41c2f3a944a9",
"Created": "2021-06-21T00:52:37.146259806-07:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"9bbc65e77cdaed1873cfe891cc3aff167e628336dd5e6c25309e9aeae67bd22c": {
"Name": "composetest_web_1",
"EndpointID": "89c87fef595ff6addbfbc0beb63724747db7102483bec61c9082e743cb400302",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"d55d70dcb8d4c22b290d53c43fd8eb17c53e220c327ea120cdad78332c1fa2b7": {
"Name": "composetest_redis_1",
"EndpointID": "4b99d701f97a1264cbf69ebc7ce3e2ba4f84739959068a716970d778ca18299f",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "composetest",
"com.docker.compose.version": "1.29.1"
}
}
]
yaml规则
官网参考地址
https://docs.docker.com/compose/compose-file/
version: "" #版本
services: #服务
服务1:web
#服务配置
images
build
network
······
服务2:redis
······
服务3:redis
#其他配置 网络/卷 全局规则
开源项目
1、下载项目
[root@localhost home]# mkdir my_wordpress
[root@localhost home]# cd my_wordpress/
[root@localhost my_wordpress]# vim docker-compose.yml
[root@localhost my_wordpress]# cat docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
[root@localhost my_wordpress]# docker-compose up -d (后台启动)
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7f9bb076cd6 wordpress:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8000->80/tcp, :::8000->80/tcp my_wordpress_wordpress_1
ba1fcc9c17de mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp my_wordpress_db_1
测试访问ip:8000端口
2.Docker Swarm
工作模式
创建集群
#初始化节点
[root@docker1 ~]# docker swarm init --advertise-addr 172.18.77.207
Swarm initialized: current node (xla5se30w25kl69mspl6ojrqh) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-0to7f4r0hk1nnvw3s4hckdakb 172.18.77.207:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#加入一个节点
获取令牌
docker swarm join-token manager 获取manager令牌
docker swarm join-token worker 获取worker令牌
#加入worker节点
[root@docker2 ~]# docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-0to7f4r0hk1nnvw3s4hckdakb 172.18.77.207:2377
This node joined a swarm as a worker.
#查看加入的节点信息
[root@docker1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh * docker1 Ready Active Leader 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
#生成worker令牌
[root@docker1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-0to7f4r0hk1nnvw3s4hckdakb 172.18.77.207:2377
#加入worker节点
[root@docker3 ~]# docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-0to7f4r0hk1nnvw3s4hckdakb 172.18.77.207:2377
This node joined a swarm as a worker.
#查看加入的节点信息
[root@docker1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh * docker1 Ready Active Leader 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Ready Active 20.10.7
#生成manager令牌
[root@docker1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-4b412prfpzednxsvwspjp3rj6 172.18.77.207:2377
#加入manager节点
[root@docker4 ~]# docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-4b412prfpzednxsvwspjp3rj6 172.18.77.207:2377
This node joined a swarm as a manager.
#查看加入的节点信息
[root@docker1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh * docker1 Ready Active Leader 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Ready Active 20.10.7
xz66ze5hi5ay7pkb4lbfr398b docker4 Ready Active Reachable 20.10.7
Raft协议
双主双从:假如一个节点挂了,其他节点是否可用?
Raft协议:保证大多数节点存活才可以用,至少要 > 1,集群至少 > 3
#实验
#停掉docker1主节点
[root@docker1 ~]# systemctl stop docker
#会发现docker4节点也无法使用
[root@docker4 ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
#重新启动docker1后,发现docker4成为了新的leader
[root@docker1 ~]# systemctl start docker
[root@docker4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh docker1 Ready Active Reachable 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Unknown Active 20.10.7
xz66ze5hi5ay7pkb4lbfr398b * docker4 Ready Active Leader 20.10.7
#尝试将docker3离开节点
[root@docker3 ~]# docker swarm leave
Node left the swarm.
#可以看到docker3的状态显示为Down
[root@docker1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh * docker1 Ready Active Reachable 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Down Active 20.10.7
xz66ze5hi5ay7pkb4lbfr398b docker4 Ready Active Leader 20.10.7
#将docker3重新以manager身份加入节点
[root@docker1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-4b412prfpzednxsvwspjp3rj6 172.18.77.207:2377
[root@docker3 ~]# docker swarm join --token SWMTKN-1-1xqmstk66u6emvfw2z6a7gws60au5o8rdhi71vy5qzczoihiqi-4b412prfpzednxsvwspjp3rj6 172.18.77.207:2377
This node joined a swarm as a manager.
[root@docker3 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh docker1 Ready Active Reachable 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
r1us2r3piwb6tsxlnucqac1sx * docker3 Ready Active Reachable 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Down Active 20.10.7
xz66ze5hi5ay7pkb4lbfr398b docker4 Ready Active Leader 20.10.7
#worker节点就是工作的、只有管理节点才能操作
[root@docker2 ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
#当有三个主节点的时候,停掉docker1节点
[root@docker1 ~]# systemctl stop docker
#发现这次其他主节点依然可以正常使用
[root@docker4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xla5se30w25kl69mspl6ojrqh docker1 Ready Active Unreachable 20.10.7
iji18ryi39e2fpf7mo37dt49y docker2 Ready Active 20.10.7
r1us2r3piwb6tsxlnucqac1sx docker3 Ready Active Reachable 20.10.7
rywzzwhfnvry0rdeto1r2ot8b docker3 Down Active 20.10.7
xz66ze5hi5ay7pkb4lbfr398b * docker4 Ready Active Leader 20.10.7
#停掉两个主节点
[root@docker3 ~]# systemctl stop docker
#发现docker4主节点也无法使用了
[root@docker4 ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
结论: 要保证集群的高可用,至少要设置三台主节点,并且要保证存活的节点 >1
体会
弹性,扩缩容,集群
以后告别 docker run
docker-compose up 启动一个容器! 单机!
集群:swarm 命令 docker service
容器 --> docker service
容器!–> 服务!–> 副本!
docker server命令
[root@docker01 ~]# docker service --help
Usage: docker service COMMAND
Commands:
create 创建一个service
inspect 查看service细节
logs 查看service日志
ls 列出所有service
ps 列出正在运行的service服务
rm 删除一个services
rollback 回滚节点
scale 动态扩缩容
update 更新service
docker run # 容器启动! 不具有扩缩容功能!
docker service # 服务!具有扩缩容功能! 滚动更新!
#创建一个服务
[root@docker1 ~]# docker service create -p 8888:80 --name my-nginx nginx
r92nojin01z5phvx13b4ix2xy
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
#查看服务
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r92nojin01z5 my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
# 发现在docker01启动的容器,确跑在docker02上面(集群内部随机分布!)
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE STATUS PORTS NAMES
cb9bf02f094c nginx:latest Up 4 minutes 80/tcp my-nginx.1.6mkcbs9nfkezz2fz50t2t24tq
[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker04 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#通过web访问ip+端口 发现无论用那一台服务器的ip都可以访问到nginx
动态扩缩容
[root@docker01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ngvtl97e1dwj my-nginx replicated 1/1 nginx:latest *:888->80/tcp
# 现在只有一个副本,如果业务量增多,一个副本扛不住,这个时候就需要扩容
# 更新副本数量(动态扩缩容)
[root@docker1 ~]# docker service update --replicas 10 my-nginx
my-nginx
overall progress: 10 out of 10 tasks
1/10: running [==================================================>]
2/10: running [==================================================>]
3/10: running [==================================================>]
4/10: running [==================================================>]
5/10: running [==================================================>]
6/10: running [==================================================>]
7/10: running [==================================================>]
8/10: running [==================================================>]
9/10: running [==================================================>]
10/10: running [==================================================>]
verify: Service converged
# 查看副本已添加(随机分配到集群中的服务器)
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r92nojin01z5 my-nginx replicated 10/10 nginx:latest *:8888->80/tcp
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
341558d273de nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my-nginx.6.ttj2nufw1o2c6p11ddqlx76oq
e60f832c63d1 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my-nginx.10.2fbqzi8efv3ryryotesxuexpz
f819dfbdf25a nginx:latest "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 80/tcp my-nginx.1.5tqjljvj8mdt4oengoowk1ynk
[root@docker2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57834e105680 nginx:latest "/docker-entrypoint.…" 58 seconds ago Up 51 seconds 80/tcp my-nginx.9.r77d9gd0a43xvcwp34od0041k
e6e5e720118b nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my-nginx.8.ocgzy8opwk54g0dt9dm22m5xt
1da5e34ff3b8 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp my-nginx.3.4g7mm96gjlnfggquyjz3gdbbn
[root@docker4 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e30280a05b9a nginx:latest "/docker-entrypoint.…" About a minute ago Up 57 seconds 80/tcp my-nginx.4.s0vj1eddlsolt92u3hajs9z4w
b5f998f7e689 nginx:latest "/docker-entrypoint.…" About a minute ago Up 57 seconds 80/tcp my-nginx.5.mckcf6ijf3nsob5arspda9e7l
256b80486e0f nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my-nginx.7.fpiiysboabrkqggwt5t1n2mut
fe757cb65902 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp my-nginx.2.pf4l98g49vlntyggql8k796qw
# 动态扩缩容(可以动态自由更改)
[root@docker1 ~]# docker service update --replicas 1 my-nginx
my-nginx
overall progress: 1 out of 1 tasks
1/1:
verify: Service converged
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r92nojin01z5 my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
#删除服务
[root@docker1 ~]# docker service rm my-nginx
my-nginx
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
服务: 集群是一个整体,他的任意一个节点都可以访问;服务可以有多个副本,随时动态扩缩容实现高可用!
工作原理: 一个 service 可以创建多个副本,每一个副本就是一个 task 任务 ,任务里面跑的就是我们的容器
内部原理: 命令 --> 管理者 --> api – >scheduler(调度) --> 工作节点(创建Task容器,维护创建!)
概念总结
swarm
集群的管理和编排,docker可以初始化一个swarm集群,其他节点可以加入,加入的角色有管理者(manager),工作者(worker)
node
就是一个docker节点,多个节点组成一个网络集群,节点的角色有管理者(manager),工作者(worker)
service
任务,可以在管理节点或者工作节点来运行,核心!用户可以访问!
Task
容器内的命令,细节任务
Docker Stack
大规模场景下的多服务部署和管理是一件很难的事情!
幸运的是,Docker Stack 为解决该问题而生,Docker Stack 通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中。
Stack 能够在单个声明文件中定义复杂的多服务应用。Stack 还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!
单机模式下,我们可以使用 Docker Compose 来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。
pi – >scheduler(调度) --> 工作节点(创建Task容器,维护创建!)
概念总结
swarm
集群的管理和编排,docker可以初始化一个swarm集群,其他节点可以加入,加入的角色有管理者(manager),工作者(worker)
node
就是一个docker节点,多个节点组成一个网络集群,节点的角色有管理者(manager),工作者(worker)
service
任务,可以在管理节点或者工作节点来运行,核心!用户可以访问!
Task
容器内的命令,细节任务
Docker Stack
大规模场景下的多服务部署和管理是一件很难的事情!
幸运的是,Docker Stack 为解决该问题而生,Docker Stack 通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中。
Stack 能够在单个声明文件中定义复杂的多服务应用。Stack 还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!
单机模式下,我们可以使用 Docker Compose 来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。