作者:欢乐乡村烤鸭8321 | 来源:互联网 | 2023-05-17 12:32
最近接手公司的一个项目,原先是用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; (这里是有两个节点)