0、参考与调料包
参考:
- http无法容器内应用(connection refused)https://github.com/docker/machine/issues/4608
- 利用dockers实现负载均衡 https://docs.docker.com/get-started/part4/
- VirtualBox安装 https://www.cnblogs.com/harry-h/p/6405433.html
调料包:CentOS7.4(操作系统)、VirtualBox 5.1、docker
1、简介
关于docker,大家都已不再陌生,但在实际生产中,一个一个地用container进行部署是及其低效的。这里就需要理解docker部署应用的三个层次:stack、service和container。stack可以简单地理解为应用(application);而一个应用的运行是需要多个service辅助的,以网站举例,需要有前端、后台和数据存储,这些都可以理解为service;抽象概念定义完成,那就要有实际干活的,一个service可以只有一个container,也可以有多个container,而多个container在多台host上运作,就是一个简单的集群了。
接下来的内容,就是与大家讨论,如何利用docker部署集群。
2、具体步骤
1、安装VirtualBox、docker-compose和docker-machine
对于这一步,读者可以参考引用3的VirtualBox安装流程,而对于docker-compose和docker-machine的安装,这些内容在docker官网有详细教程,再次就不做重复了。
2、下载boot2dockerv18061CE.iso
curl -Lo ~/.docker/machine/cache/boot2dockerv18061CE.iso https://github.com/boot2docker/boot2docker/releases/download/v18.06.1/boot2docker.iso
3、在确保CentOS系统支持虚拟化后,创建用于构建集群的虚拟机
# 构建两个用于部署集群的虚拟机
docker-machine create --driver virtualbox --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2dockerv18061CE.iso myvm1
docker-machine create --driver virtualbox --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2dockerv18061CE.iso myvm2
# 查看生成的虚拟机IP,确保其正常运行
docker-machine ls
结果如图所示:
4、编写docker-compose.yml,用于构建stack(stack包含两个service,web内的镜像是我放在dockerhub上的一个example,visualizer则是docker官方开源的集群监控服务)
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: beifen/friendlyhello:latest
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "4000:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
5、设置集群的leader和worker
注意,此处使用的端口为2377而不是2376。具体原因可参考官方文档https://docs.docker.com/get-started/part4/
# 设置myvm1作为集群的leader
docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"
# 根据上一命令的返回信息,myvm2作为worker加入集群
docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-4upi3hyqfgfkvca4wd42s1z1y6tp29oq853df36im04b0g1qbc-1ai5l3soldvveoo8gbkikeogi 192.168.99.100:2377"
# 查看集群节点
docker-machine ssh myvm1 "docker node ls"
结果如图所示:
6、部署集群
根据docker-compose.yml可知,web服务将用于5个container,而visualizer服务则拥有一个container。对于集群而言,一切操作都是对leader实施的,worker充当的角色就是提供计算机资源。
# 以本地环境操作myvm1
docker-machine env myvm1
eval $(docker-machine env myvm1)
# 部署集群
docker stack deploy -c docker-compose.yml getstartedlab
7、查看部署结果
之前我们提到了stack、service和container三个概念,那我们就从这三方面查看部署结果。
首先写个shell脚本check.sh,如下:
# 查看stack
docker stack ls
# 查看service
docker service ls
# 查看myvm1上的container
docker ps -a
执行脚本check.sh,将输出结果重定向到log:
./check.sh > log
查看log,结果如图:
可以看出,getstartedlab这个stack包含2个service,而service web则包含5个task/container。通过visualizer服务,我们可以看到集群的部署情况如下:
3、附注
至此,一个简单的集群就已经部署完成了。但是,如果根据官方文档https://docs.docker.com/get-started/part4/进行操作,可能会存在bug。例如,
[root@csdn DockerWorkspace]# curl 192.168.99.100:4000
curl: (7) Failed connect to 192.168.99.100:4000; 拒绝连接
对于这一bug,参考https://github.com/docker/machine/issues/4608,使用firefox浏览器访问后即可解决。
上述就是对docker集群的简单部署,如有错误,欢迎指出。