ref
https://stackoverflow.com/questions/42079458/how-to-run-docker-machine-create-in-os-x
https://github.com/machine-drivers/docker-machine-driver-xhyve
https://asciinema.org/a/29930
https://docs.docker.com/machine/
https://www.jianshu.com/p/9fce6e583669
https://yeasy.gitbooks.io/docker_practice/swarm_mode/create.html
https://www.qiancheng.me/post/coding/show-linux-issue-version
安装
$ brew install docker-machine-driver-xhyve
# docker-machine-driver-xhyve need root owner and uid
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
创建
# 比较随意的尝试 ...
# 创建一个 docker-machine
docker-machine -D create --driver xhyve xhyve-test
# 查看创建的 docker-machine
(demo) (base) furuiyangdeMacBook-Pro:bin furuiyang$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
xhyve-test * xhyve Running tcp://192.168.64.2:2376 v18.09.4
# 再创建一个 docker-machine 用 docker-machine create -d virtualbox default 会 失败 是因为我们没有使用正确的引擎
# 按照相同的引擎再创建一个
docker-machine -D create --driver xhyve test2
# 查看
(demo) (base) furuiyangdeMacBook-Pro:bin furuiyang$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
test2 - xhyve Running tcp://192.168.64.3:2376 v18.09.4
xhyve-test * xhyve Running tcp://192.168.64.2:2376 v18.09.4
# 创建一个具有三个节点的集群
# kill 掉之前创建的节点 最好先停掉再kill 不然可能会有延迟
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine kill xhyve-test
Killing "xhyve-test"...
(xhyve-test) Killing xhyve-test ...
Machine "xhyve-test" was killed.
# 杀死之后貌似要移除才能够不显示
# 杀死之后貌似移除才能不显示
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine rm test2
About to remove test2
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed test2
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine rm xhyve-test
About to remove xhyve-test
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed xhyve-test
# 开始创建工作 创建一个 docker 主机作为管理节点
docker-machine -D create --driver xhyve manager
# 使用 docker swarm init 在管理节点初始化一个 swarm 集群
# 进入manager 节点
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine ssh manager
( '>')
/) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
(/-_--_-\) www.tinycorelinux.net
docker@manager:~$
# (3) 在初始化集群的时候 如果我们的 Docker 主机有多个网卡拥有多个 ip 必须使用 —advertise-addr指定 IP
执行了 docker swarm init 命令的节点自动成为管理节点:
docker@manager:~$ docker swarm init --advertise-addr 192.168.64.4
Swarm initialized: current node (a5pj98cwqvtzbku5hx791fwbx) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0lxcpv2s9t6tuo2ylz5e2nk009kcpvuopl09verkio2vbq12k8-85vdf3io09ergf0ghnp56gmtc 192.168.64.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 上一步是初始化了一个 Swarm 集群拥有了一个管理节点,下面要继续创建两个 docker 主机作为工作节点,并加入集群中
docker-machine -D create --driver xhyve worker-1
docker-machine ssh worker-1
# 按照上一步的提示 加入集群 :
docker@worker-1:~$ docker swarm join --token SWMTKN-1-0lxcpv2s9t6tuo2ylz5e2nk009kcpvuopl09verkio2vbq12k8-85vdf3io09ergf0ghnp56gmtc 192.168.64.4:2377
This node joined a swarm as a worker.
# 相同的流程,再创建一个 worker-2
# 现在我们就拥有了一个最小的 swarm 集群,包含一个管理节点和两个工作节点:
# 在管理节点使用 docker node ls 查看集群 :
docker-machine ssh manager
docker@manager:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
a5pj98cwqvtzbku5hx791fwbx * manager Ready Active Leader 18.09.4
sbklk1trusrzk6fh5autpc4r0 worker-1 Ready Active 18.09.4
lspybekg0bu2hn29qi6rppxs6 worker-2 Ready Active 18.09.4
# 我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行:
docker@manager:~$ docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
Run 'docker service COMMAND --help' for more information on a command.
# 使用 docker service ls 来查看当前集群运行的服务
docker@manager:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
# 在当前的 swarm 集群中创建运行一个名字为 nginx 的服务:
docker@manager:~$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
8zhje131zfvkjcvzf3n994g6p
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
# 再次查看当前集群中运行的服务:
docker@manager:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
8zhje131zfvk nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
# 查看某个服务的详情
docker@manager:~$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
o6q2krpwgen8 nginx.1 nginx:1.13.7-alpine manager Running Running 3 minutes ago
fao1f7wn38ov nginx.2 nginx:1.13.7-alpine worker-1 Running Running 3 minutes ago
kdwep3qbdzek \_ nginx.2 nginx:1.13.7-alpine worker-1 Shutdown Rejected 3 minutes ago "No such image: nginx:1.13.7-a…"
nthguxsg4i58 \_ nginx.2 nginx:1.13.7-alpine worker-1 Shutdown Rejected 3 minutes ago "No such image: nginx:1.13.7-a…"
s46wy6mxcgli \_ nginx.2 nginx:1.13.7-alpine worker-1 Shutdown Rejected 3 minutes ago "No such image: nginx:1.13.7-a…"
gjpo9ee74teq nginx.3 nginx:1.13.7-alpine worker-2 Running Running 3 minutes ago
docker@manager:~$
# 查看某个服务的日志
docker service logs nginx
# 从集群中移除某个服务
$ docker service rm nginx
# 服务伸缩:我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩
docker@manager:~$ docker service scale nginx=5
nginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
docker@manager:~$ docker service scale nginx=2
nginx scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
在 swarm 集群中部署 WordPress
创建 docker-compose.yml 文件
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
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]
volumes:
db-data:
networks:
overlay:
我们要在管理节点创建该文件,这里面得 visualizer 服务提供一个可视化的页面,我们可以从浏览器中
很直观的查看集群中各个服务的运行节点。
# 在 swarm 中使用 docker-compose.yml 我们使用 docker stock 命令:
# -c 用于指定 compose 文件名
docker@manager:~$ docker stack deploy -c docker-compose.yml wordpress
Creating network wordpress_overlay
Creating network wordpress_default
Creating service wordpress_wordpress
failed to create service wordpress_wordpress: Error response from daemon: rpc error: code = InvalidArgument desc = port '80' is already in use by service 'nginx' (8zhje131zfvkjcvzf3n994g6p) as an ingress port
# 失败 是因为集群中已经有一个占用了 80 端口的服务
# 那我们首先关闭 nginx 服务:
docker@manager:~$ docker service rm nginx
nginx
# 再次创建 :
docker@manager:~$ docker stack deploy -c docker-compose.yml wordpress
Creating service wordpress_wordpress
Creating service wordpress_db
Creating service wordpress_visualizer
# 退出 查看集群任一节点暴露出的ip
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine ip manager
192.168.64.4
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine ip workoer-1
Docker machine "workoer-1" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine ip worker-1
192.168.64.5
(base) furuiyangdeMacBook-Pro:~ furuiyang$ docker-machine ip worker-2
192.168.64.6
# 这时候我们打开浏览器 输入任一节点的IP:8080 就可以查看各个节点的运行状态:
http://192.168.64.6:8080/
# 查看服务 使用 docker stack ls
docker@manager:~$ docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 3 Swarm
# 关停服务 docker stack down wordpress
docker@manager:~$ docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_default
Removing network wordpress_overlay
# 移除服务不会移除相关的 数据卷 需要自己使用 docker volume rm xxxx
docker@manager:~$ docker volume ls
DRIVER VOLUME NAME
local efdf2083aaf8478a08c05ef5e513aa8cc10aed9e23fcd287590f14f78d4c49fe
local wordpress_db-data
docker@manager:~$ docker volume rm efdf2083aaf8478a08c05ef5e513aa8cc10aed9e23fcd287590f14f78d4c49fe
Error response from daemon: remove efdf2083aaf8478a08c05ef5e513aa8cc10aed9e23fcd287590f14f78d4c49fe: volume is in use - [a6c2950b04b180d5b2b531d70b5c9adbe6830b30778a7f023b2388912a6e111f]
docker@manager:~$ docker volume rm wordpress_db-data
wordpress_db-data