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; (这里是有两个节点)