docker-swarm容器集群

docker-swarm容器集群

    最近接手公司的一个项目,原先是用docker-swarm部署的,所以借此机会学习了一下docker-swarm中,是如何来部署服务的,以及不同容器之间是如何连接相同的网络来进行通信的。

    1、部署服务

    1)docker stack deploy

    用法:docker stack deploy [OPTIONS] STACK,其中 -c 参数指定 compose 文件名

    说明:docker stack deploy命令用于部署新的堆栈或更新现有堆栈。从群集中的compose文件或dab文件创建和更新堆栈,必须以管理员节点为目标运行此命令

    2)具体使用

    在yaml文件所在的目录下,执行以下命令:

    docker stack deploy -c  docker-compose.yml example

    部署的服务名称则以example_为前缀:example_SERVICE

    下面是yaml文件

    redis.yaml

 1 version: '3.6'
 2 services:
 3   wisdom-test-redis:
 4     image: 172.28.*.*/redis:5.0.3
 5     container_name: wisdom-test-redis
 6     ports:
 7     - 36379:6379
 8     volumes:
 9     - v2-test-redis-volumn:/data
10     command: redis-server --appendonly yes
11     deploy:
12       replicas: 1
13       restart_policy:
14         condition: on-failure
15 volumes:
16   v2-test-redis-volumn:
17     driver: local
18     driver_opts:
19       type: "nfs"
20       o: "addr=172.28.*.*,rw"
21       device: ":/data/www/codes/redis-test/data"
22 
23 networks:
24   wisdom-net:
25     driver: overlay

     wisdom.yaml

 1 version: '3.6'
 2 services:
 3   wisdom:
 4     image: 172.28.*.*/php-swoole:7.4.6-1
 5     ports:
 6     - 9512:9501
 7     volumes:
 8     - app_backend:/easyswoole/
 9     command: ["php", "/easyswoole/vendor/easyswoole/easyswoole/bin/easyswoole", "start", "produce"]
10     configs:
11       - source: php_memory_ini
12         target: /usr/local/etc/php/conf.d/uploads.ini
13     deploy:
14       replicas: 2
15       placement:
16         constraints:
17           - node.role == manager
18       restart_policy:
19         condition: on-failure
20 volumes:
21   app_backend:
22     driver: local
23     driver_opts:
24       type: "nfs"
25       o: "addr=172.28.*.*,rw"
26       device: ":/data/www/codes/wisdom-v2-test"
27 
28 configs:
29   php_memory_ini:
30     external: true
31 
32 networks:
33   wisdom-net:
34     driver: overlay

    举个栗子:

 1 $ docker stack deploy --compose-file docker-compose.yml vossibility
 2 
 3 Creating network vossibility_vossibility
 4 Creating network vossibility_default
 5 Creating service vossibility_nsqd
 6 Creating service vossibility_logstash
 7 Creating service vossibility_elasticsearch
 8 Creating service vossibility_kibana
 9 Creating service vossibility_ghollector
10 Creating service vossibility_lookupd

    延伸一下: docker statck 相关操作

    3)stack相关操作

    docker stack deploy  部署新的堆栈或更新现有堆栈

    docker stack ls  列出现有堆栈

    docker stack rm 删除堆栈

    docker stack services STACK  列出堆栈中的服务

    

    docker stack ps STACK  列出堆栈中的任务

    

    说明:上图中说明,使用docker stack ps 可以看到当前堆栈中的所有服务,NODE一栏表示的是该服务所在的结点名称,这里有01和03两个不同的结点。

    注意:使用docker ps只能看到当前节点上面部署的容器

    docker node ls   结点列表

    

   说明:ID一列带*号的就是主节点,只有这个主节点才能查看节点列表,从节点不能使用此命令查看

    2、ip地址

    这里的docker-swarm集群有两个结点,拿其中一台机器来说:

    V_CT_*_*_WEB_02

    有下面三个ip地址:

    ip: 192.168.*.1  eth0物理网卡(内网)

    eip:  10.85.*.71    docker swarm集群分配的ip

    内网ip: 172.28.*.*  docker虚拟网卡分配的ip

    3、容器网络

    1)容器网络相关命令

    docker network ls

    

    说明:使用yaml文件创建的服务,docker会自动创建网络,默认是以服务名称_default来命名的

   docker network create   创建一个新的网络连接

    用法:docker network create [OPTIONS] NETWORK

    docker network inspect NETWORK   查看网络详情

    a. 01结点上面查看wisdom_default

    

    b. 03结点上面查看wisdom_default

    

    docker inspect CONTAINER

     其中我们看下Networks里面的信息,是容器所在的网络相关信息

    

    2)容器通信

   现在有一个问题:容器与容器之间是隔离的,比如我这里用到的php和redis,实际项目中是需要这两者配合使用的,现在它们之间要通信的话,就必须在同一个网络中。那么如何知道它们是否在同一个容器中呢?

   解决方案:

   a. 查看:使用上面docker inspect CONTAINER,查看各个容器所在网络地址是否为同一个

   b. 如果不在,就需要将容器添加进同一个网络中

   docker network connect 命令是用于将docker容器连接到某个网络中,或者与其他容器建联,容器可以使用容器名或者容器ID。

   使用如下:

   docker network connect wisdom_default CONTAINER

   c. 最后是确认

   使用docker exec进入到其中一个容器, ping OTHER_CONTAINER  如果可以ping通,说明这两个容器之间可以互相通信

   补充一下:如何重启

   docker service scale wisdom-v2-test_wisdom=0;    (先把副本数设为0)
   docker service scale wisdom-v2-test_wisdom=2;   (这里是有两个节点)

原文地址:https://www.cnblogs.com/hld123/p/14962824.html