docker-compose中link和external_links的区别及说明
作者:IT杂人
拆分docker-compose.yml导致depends_on、links和external网络配置失效,因compose限制及Portainer命名冲突,解决方案为使用external_links或手动创建网络
使用场景
原本把在同一个docker-compose.yml文件中的向个服务拆分为多个文件部署。
如拆分为单个服务的yml文件:原rocketmq
version: '2' services: namesrv: image: apache/rocketmq:4.5.0 container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./data/namesrv/logs:/home/rocketmq/logs command: sh mqnamesrv broker: image: apache/rocketmq:4.5.0 container_name: rmqbroker ports: - 10909:10909 - 10911:10911 - 10912:10912 volumes: - ./data/broker/logs:/home/rocketmq/logs - ./data/broker/store:/home/rocketmq/store - ./data/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.9.3/conf/broker.conf command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf depends_on: - namesrv
拆分后产生的问题
1.depends_on 无法使用,所以改成links
2.发现各links无法使用
3.发现networks=>external无法使用
分析原因
1.depends_on 是compose独有的功能,拆分后不在同一个yml文件内,无法继续识别其他服务
2.links与docker run中的links不一致,也是受限于同一个yml文件内
3.networks=>external无法使用:网络创建有问题,portainer的机制,使用compose创建自定义网络时,网络名会被强加上yml文件的Title(坑)前缀
4.尝试external_links
解决
- links改成external_links:external_links后面为其他容器的名称
environment: - JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 external_links: - rmqnamesrv
- networks=>external:先手动创建网络
#1.手动创建一个自定义网络 docker network create rocketmq
- 或者在portainer上创建
2.再填写网络external: true信息 version: '2' services: broker: image: commandcenter/public/rocketmq:latest container_name: rmqbroker ports: - 10909:10909 - 10911:10911 - 10912:10912 volumes: - /opt/public/broker/logs:/home/rocketmq/logs command: sh mqbroker -c ../conf/broker.conf -n rmqnamesrv:9876 external_links: - rmqnamesrv networks: - rocketmq networks: rocketmq: external: true
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。