docker的集群(swarm)部署及其问题

0、参考与调料包

参考:

  1. http无法容器内应用(connection refused)https://github.com/docker/machine/issues/4608
  2. 利用dockers实现负载均衡 https://docs.docker.com/get-started/part4/
  3. 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集群的简单部署,如有错误,欢迎指出。

猜你喜欢

转载自blog.csdn.net/qq_27861281/article/details/85111180
今日推荐