compose、machine 和 swarm 是docker 原生提供的三大编排工具。
compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。
compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑起来。 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。
Docker Machine 是一个简化Docker 安装的命令行工具。通过一个简单的命令行即可在相应的平台上安装 Docker,为用户提供了灵活的功能,使得用户可以在任一主机上运行 Docker 容器。简单说,一个 Docker Machine 就是一个 Docker host 主机和经过配置的 Docker client 的结合体。
Swarm 是 Docker 社区提供的原生支持 Docker 集群的工具。 它可以把多个 Docker 主机组成的系统转换成为单一的虚拟 Docker 主机。Swarm 对外提供两种 API。一种是标准的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;另一种是 Swarm 的集群管理 API,用于集群的管理。
但是swarm适用的是小集群。
下载后直接就是一个可以使用的二进制命令,可以根据自己的需要下载对应的版本
machine指的是docker daemon主机,其实就是在host上安装和部署docker
创建machine要求免密登陆远程主机
在https://get.docker.com里下载那个index.html,然后把yum源修改为可用的
修改之后把这个文件发送到172.25.20.250的/var/www/html下,即共享目录下,安装时会自己匹配
但是这样安装的时候server3的yum源检查不能通过
所以再server3上的yum源全局设定里取消安装检查
复制三个machine的命令到bash下并分别source,再添加环境变量
docker-machine use server3 ##切换用户
可以在官网上通过sudo curl -L “https://github.com/docker/compose/releases/download/1.24.1/docker-compose- ( u n a m e − s ) − (uname -s)- (uname−s)−(uname -m)” -o /usr/local/bin/docker-compose来获取
下载之后是一个可使用的命令,本机使用的版本是
注意:docker stack 的用法与compose基本相同,而且stack是docker自带命令,但是它只能再version3以上使用
需要先导入nginx和haproxy的镜像
mkdir compose ##建立一个目录存放yml文件
mkdir compose/web1 ##准备两个默认发布目录存不同的文件来进行对比
mkdir compose/web2
mkdir compose/haproxy ##把一个修改好的haproxy.cfg挂载到容器中
vim docker-compose.yml
web1:
image: nginx:1.17.2 ##注意自己倒入的镜像版本,不对应的话就会自动从网上拉取下载
expose:
- 80
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx:1.17.2
expose:
- 80
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy:latest
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- web1
- web2
ports:
- "80:80"
expose:
- "80"
vim haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
mode http
log global
option httplog
option dontlognull
timeout connect 10s
timeout client 1m
timeout server 1m
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backends
backend web_backends
balance roundrobin
server server1 web1:80 check
server server2 web2:80 check
docker-compose up -d ##在yml所在的目录下,后台运行服务
在浏览器上输入172.25.20.1测试轮询
先准备三台虚拟机
server1(manager):172.25.20.1
server2(worker):172.25.20.2
server3(worker):172.25.20.3
因为swarm集群管理是docker自带的服务,所以搭建起来较为简单
在管理节点直接执行创建的命令即可,不需要导入额外的镜像
在普通节点上直接用docker swarm join那一串命令就可以加入节点
当三个节点都加入集群后,在管理节点上查看
首先需要导入一个镜像dockersamples/visualizer,可以直接联网然后pull
注意:集群之间的节点要免密
先创建一个web服务
docker service create --name web --replicas 3 --publish 80:80 nginx
##replicas代表可扩展的,与接下来所说的global模块是不同的,不仅可以自动分配到节点上,而且还是自动负载均衡的
导入镜像之后,创建容器来监控即可
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
在浏览器访问172.25.20.1:8080访问即可
docker service scale web=60 ##通过这个命令可直接把web的数量变为60个,且是自动分配的,也可以用这个命令来减少
docker service update --image game2048 --update-delay 5s --update-parallelism 2 web
##给web服务再添加一个滚动更新的2048页面,这样在访问的时候每5s都会自动切换,但是每个节点上都要有相应的镜像
当有一个新节点加入时,只要有向对应的镜像,就会自动拉起服务,先把上一个容器服务删掉,然后调用global模块
docker service create --name web --publish 80:80 --mode global game2048
在server4上倒入game2048的镜像
docker node update --availability drain server4 ##让这个节点不再接收工作进程,一般用来让管理节点只管理不处理工作请求源
docker node update --availability active server4 ##恢复节点的工作进程
docker stack类似与docker-compose,但是docker stack必须是v3及以上版本才可以使用,但是compose可以识别不同的版本
在创建这个服务之前,先把上一个监控删掉
docker service rm web ##删掉原来的服务
docker service rm viz
编写一个自动部署nginx和监控模块的yml文件,注意每个节点上都要倒入镜像,监控模块的镜像只要在管理节点上导入即可
mkdir test ##新建一个目录来存放yml文件
cd test
vim docker-compose.yml
version: "3.7"
services:
web:
image: nginx:1.16 ##与自己的镜像版本对应即可
ports:
- "80:80"
networks:
- webnet
volumes:
- "webdata:/usr/share/nginx/html"
deploy:
replicas: 4 ##可扩展的服务,最初服务个数为4
resources:
limits: ##可以在创建服务时直接限制容器的内存和cpu
cpus: "0.2"
memory: "300M"
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager] ##只有在管理者节点才能运行这个监控服务
networks:
webnet:
volumes:
webdata:
docker stack deploy -c docker-compose.yml example ##没有服务的话创建这个服务
##如果文件中作出了修改,这条命令就是更新服务
注意:文件中的镜像版本与每个节点上导入的都要相同,不同的话可以用tag改名,不然的话服务运行可能会有问题,如下
docker tag dockersamples/visualizer:latest dockersamples/visualizer:stable
直接在官网下载即可,载每个节点上导入agent,在管理节点上导入监控服务
vim portainer-agent-stack.yml ##yml文件
version: '3.2'
services:
agent:
image: portainer/agent
environment:
# REQUIRED: Should be equal to the service name prefixed by "tasks." when
# deployed inside an overlay network
AGENT_CLUSTER_ADDR: tasks.agent
# AGENT_PORT: 9001
# LOG_LEVEL: debug
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9000:9000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
在4个节点上都导入agent镜像,然后在这个文件的目录下
docker stack deploy -c portainer-agent-stack.yml portainer ##直接创建服务
创建成功后进入浏览器测试
还可以通过图形直接给仓库上传或下载镜像