前面一篇文章《在CENTOS上通过DOCKER容器部署ASP.NET CORE应用》记录了如何在单主机上利用docker-compose编排容器。很多时候单主机上的多个容器,在性能上并不能满足使用需求。这时候就需要多主机来提供性能上的增强。本文记录如何在多个主机上创建容器,并将应用发布到容器中,实现将应用部署到服务器集群中。

整个集群的结构图如下:

首先,在所有主机上安装Docker,Docker的安装方法见《DockerCE的安装与卸载》,我这里安装的版本信息如下:

[root@14-23 ~]# docker --version
Docker version 17.09.0-ce, build afdb6d4

应用的集群部署,基本思路是在一台机器上编译应用,然后创建镜像。将此镜像push到私有镜像仓库里面,然后其他主机可以从私有镜像仓库pull镜像,用来创建容器。那么这里先说下如何创建私有仓库,这里直接使用Docker官方的仓库镜像来搭建自己的私有镜像仓库。

第一步:拉取官方registry镜像

docker pull registry

第二步:启动镜像仓库容器

docker run -d -p 5000:5000 --restart always --name registry registry:lastest

这样私有镜像仓库就搭建好了,我们来看看如何使用:

首先从hub.docker.com拉取一个nginx的镜像

docker pull nginx

镜像拉取下来以后,重新tag一下

docker tag nginx localhost:5000/nginx

然后我们将重新tag的nginx镜像push到我们的私有镜像仓库里面

docker push localhost:5000/nginx

至此,没什么问题的话,镜像是成功提交到镜像仓库的。然后我们来查看一下私有镜像仓库里面的镜像:

[root@14-22 ~]# curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["nginx"]}

我们看到已经有了刚刚提交的nginx镜像。还可以查看某个镜像的tag信息:

[root@14-22 ~]# curl -X GET http://localhost:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest"]}

这样我们的私有镜像仓库就创建出来了,也可以push和pull镜像了。注意:如果要在其他主机上访问此私有镜像,需要通过IP地址,或者在/etc/hosts文件里面设置域名与IP地址的映射。

—————————-分割线—————————-

私有镜像仓库搭建好了以后,下面就可以开始集群的创建了。至于swarm的基本概念,工作原理,自行google,这里都是具体的操作步骤。

第一步:设置管理节点

[root@14-22 ~]# docker swarm init --advertise-addr 192.168.14.22
Swarm initialized: current node (rupju61jbyg50rwdbg54zgf4t) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-4rgyqfybiemfhf2nq5bc6nt9u2hjvmb2wjmvo20saksbbcjb7g-bfbbi98wjgwzwk534tbpukjg1 192.168.14.22:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

第二步:添加工作节点,此步骤每个工作节点执行同样的命令

[root@14-23 ~]# docker swarm join --token SWMTKN-1-4rgyqfybiemfhf2nq5bc6nt9u2hjvmb2wjmvo20saksbbcjb7g-bfbbi98wjgwzwk534tbpukjg1 192.168.14.22:2377
This node joined a swarm as a worker.

这样我们就把几个主机链接到一起了,形成一个Docker主机的集群。

然后我们在管理节点上查看整个集群里面的节点:

[root@14-22 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
rupju61jbyg50rwdbg54zgf4t *   14-22.com           Ready               Active              Leader
hlq37qw6vrmqgkv6to1syfh1l     14-23.com           Ready               Active
p5fbmxqndfl9q07qy9g7hc7z1     14-24.com           Ready               Active

可以看到,管理节点被标记为Leader

第三步:构建镜像,并将镜像push到私有镜像仓库

构建镜像使用的是docker-compose,以下是docker-compose.yml文件内容:

version: '3.1'
services:
    dbpostgre:
        image: postgres:10.1
        restart: always
        volumes:
            - db_postgre:/var/lib/postgresql/data
        environment:
            POSTGRES_PASSWORD: 123456
            POSTGRES_DB: SearchSchedule
        networks:
            - overlay
        deploy:
            placement:
                constraints:
                    - node.hostname == 14-22.com
    web1:
        build: .
        image: 14-22.com:5000/searchschedule/web1
        restart: always
        links:
            - dbpostgre
        depends_on:
            - dbpostgre
        networks:
            - overlay
        deploy:
            placement:
                constraints:
                    - node.hostname == 14-23.com
    web2:
        build: .
        image: 14-22.com:5000/searchschedule/web2
        restart: always
        links:
            - dbpostgre
        depends_on:
            - dbpostgre
        networks:
            - overlay
        deploy:
            placement:
                constraints:
                    - node.hostname == 14-24.com
    nginx:
        image: nginx:latest
        restart: always
        volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf
        links:
            - web1
            - web2
        ports:
            - "80:80"
        environment:
            - NGINX_PORT=80
        networks:
            - overlay
        deploy:
            placement:
                constraints:
                    - node.hostname == 14-24.com
    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.hostname == 14-22.com]
volumes:
    db_postgre:
networks:
    overlay:

构建镜像

docker-compose build

push镜像到私有镜像仓库(注意,这里push用到的路径,就是在docker-compose.yml配置文件中,通过image指令来指定私有镜像仓库地址的)

docker-compose push

接下来就是发布服务了

docker stack deploy -c docker-compose.yml searchweb

这时候会报错,push镜像失败,错误信息如下:

[root@14-22 searchschedule]# docker-compose push
WARNING: Some services (dbpostgre, nginx, visualizer, web1, web2) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Pushing web1 (14-22.com:5000/searchschedule/web1:latest)...
The push refers to a repository [14-22.com:5000/searchschedule/web1]
ERROR: Get https://14-22.com:5000/v2/: http: server gave HTTP response to HTTPS client

这个问题需要修改docker的配置文件,设置为非安全模式,这样就不会使用https了。注意:每个主机的配置文件都要修改:

vi /usr/lib/systemd/system/docker.service

在ExecStart后面加上 –insecure-registry参数

ExecStart=/usr/bin/dockerd --insecure-registry 14-22.com:5000

然后重新加载配置,重启docker服务

systemctl daemon-reload
systemctl restart docker

这样就能正常push镜像到私有镜像仓库了。

接着发布服务,又遇到下面的问题:

Updating service searchweb_web2 (id: wpvobnp4vpclsbkts20x7tkza)
image 14-22.com:5000/searchschedule/web2:latest could not be accessed on a registry to record its digest.

解决办法是加上–with-registry-auth参数,这样表示工作节点在pull镜像的时候,会带上镜像仓库的授权信息。

[root@14-22 searchschedule]# docker stack deploy --with-registry-auth  -c docker-compose.yml searchweb
Ignoring unsupported options: build, links, restart

Creating service searchweb_web2
Creating service searchweb_nginx
Creating service searchweb_visualizer
Creating service searchweb_dbpostgre
Creating service searchweb_web1

看到命令没有报错,我们预期的服务也都创建了。然后访问http://192.168.14.22:8080/看看Docker Swarm的可视化页面,截图如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注