浅谈docker-compose网络设置之networks
作者:Kiloveyousmile 发布时间:2023-05-11 14:17:19
networks使用方式之官网教程
官网的docker-compose.yml参考文档:Compose file version 3 reference
较为准确的中文翻译版:Compose file version 3 reference
networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题。这种应用在swarm部署中,非常常见。不过,本文并不做讨论。
一般对于集群服务,常常通过docker-compose.yml文档快速编排、部署应用服务。官网中给出了如下的使用场景和方式:
1. 未显式声明网络环境的docker-compose.yml
例如,在目录app
下创建docker-compose.yml,内容如下:
version: '3'
services:
web:
mage: nginx:latest
container_name: web
depends_on:
- db
ports:
- "9090:80"
links:
- db
db:
image: mysql
container_name: db1234567891011121314
使用docker-compose up
启动容器后,这些容器都会被加入app_default
网络中。使用docker network ls
可以查看网络列表,docker network inspect <container id>
可以查看对应网络的配置。
$ docker net work ls
NETWORK ID NAME DRIVER SCOPE
6f5d9bc0b0a0 app_default bridge local
0fb4027b4f6d bridge bridge local
567f333b9de8 docker-compose_default bridge local
bb346324162a host host local
a4de711f6915 mysql_app bridge local
f6c79184ed27 mysql_default bridge local
6358d9d60e8a none null local
12345678910
2. networks关键字指定自定义网络
例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1
并不能直接使用,你应该替换为host, bridge, overlay
等选项中的一种。
version: '3'
services:
proxy:
build: ./proxy
networks:
- front
app:
build: ./app
networks:
- front
- back
db:
image: postgres
networks:
- back
networks:
front:
# Use a custom driver
driver: custom-driver-1
back:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"123456789101112131415161718192021222324252627
值得注意的是,这里定义了back和front两个网络,似乎它们的名字就定义成了back和font,但是你使用docker network ls
命令并不能找到它们。假如你是在myApp
目录下运行的docker-compose up
命令,那么这两个网络应该分别对应myApp_back
和myApp_front
。
3. 配置默认网络
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-11234567891011121314
4. 使用已存在的网络
networks:
default:
external:
name: my-pre-existing-network1234
遇到的问题
学习了上面的东西,笔者准备将自己的项目付诸实践。我的项目包含了两个docker-compose.yml,且使用了links
选项,所以必须使用networks配置。
其中,一个docker-compose.yml用于启动mysql服务,位于mysql/
目录下:
version: "3"
services:
dbmaster:
image: master/mysql:latest
container_name: dbmaster
ports:
- "3308:3306"
volumes:
- $HOME/Work/data/dbmaster:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: master
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
networks:
- app
dbslave:
image: slave/mysql:latest
container_name: dbslave
ports:
- "3309:3306"
depends_on:
- dbmaster
volumes:
- $HOME/Work/data/dbslave:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: slave
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
links:
- dbmaster
networks:
- app
networks:
default:
external:
name: app12345678910111213141516171819202122232425262728293031323334353637383940414243
另一个docker-compose.yml用于启动服务程序,位于cloudgo/
目录下:
version: "3"
services:
web:
image: nginx:latest
container_name: web
depends_on:
- cloudgo
ports:
- "9090:80"
volumes:
- $HOME/Work/docker/docker-compose/nginx/conf.d:/etc/nginx/conf.d
links:
- cloudgot
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
networks:
- app
cloudgo:
image: cloudgo:latest
container_name: cloudgo
ports:
- "8080:8080"
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
external_links:
- dbmaster
- dbslave
networks:
- app
networks:
app:
external: true123456789101112131415161718192021222324252627282930313233343536373839
我决定使用预先创建的网络,然后把他们加入这个已经创建好的网络,从而实现通信。为此,我运行了如下命令:
$ docker network create app1
之后,开始运行编写好的docker-compose.yml文件。首先运行启动mysql的配置文件,结果如下:
l$ docker-compose up
ERROR: Service "dbmaster" uses an undefined network "app"12
明明已经创建好了,却还是报了错,说该网络未定义。尝试改变名称mysql_app,但是依旧报出同样的错误。最终证明,这种方法无法实现,至今没有找到官方文档给出的例子。
所以,最终决定将第一个docker-compose.yml文件中的networks配置改为如下内容:
networks:
mysql_app:
driver: bridge123
在这个文件中定义一个网络,以便在后面使用。这里修改完毕,该文件其他地方凡是引用到了该网络的地方均要作出相同的修改。同样,第二个文件也一样。
其他的一些用法
使用aliases代替link
一般的使用格式如下:
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias212345678910
在下面的例子中,我的web
容器可以直接通过database:3306
或者db:3306
访问db
容器了。它们同时属于一个网络,并且db
设置了主机别名,所以这样的访问方式是完全可以的。
version: '2'
services:
web:
depends_on:
- worker
networks:
- new
worker:
depends_on:
- db
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:123456789101112131415161718192021222324252627
此时直接使用depends_on已经不再需要link,如果woker需要访问db,可以直接通过mysql:port的方式。
使用networks的要点在于:
1. 注意自定义网络的方式
2. 注意docker-compose.yml文件的位置与网络默认命名的关系
3. 注意遇到问题尝试几种替代方式去解决
来源:https://blog.csdn.net/Kiloveyousmile/article/details/79830810
猜你喜欢
- 1.安装mysql workbench,提示未安装软件包 libpng12-0下载了MySQL Workbench 6.3.8 在安装的时候
- 你的网站是不是常常被黑,或者一不注意就成了黑客的“肉鸡”?对于Web网站服务器来说,如果不进行安全设置,很容易被黑客“盯上”,随时都有被入侵
- 域名:GoDaddy是世界第一大域名注册商,域名的附加服务很多,有blog,Email,email指向,停放页,出售页面等。而且可以很方便的
- 8月10日阿里妈妈广告平台发布后我就是申请了代码,投放了一段时间后,还是有些经验教训,这里与大家分享。第一: 及时查看广告购买情况,避免缺省
- awk #对字段的处理是sed,grep不能实现的。awk -F , 'NR==1,NR==2 {print $1 $2}'
- 一家公司的业务是帮助在中国的外国人找中文语伴,同样也帮中国人找英文语伴。他们的业务很不错,介绍一个语伴的收费是400人民币,每天能成交很多个
- 过去的几年,由于大量广告主的大量资金注入互联网 ,已具实力的网站你争我斗,海量新兴的网站迅速崛起,都想在这个看起来赚钱很美、实则赚钱不易的互
- 1. 简要双网卡绑定技术在centos7中使用了teaming技术,而在rhel6/centos7中使用的是bonding技术,在cento
- 最近遇到wordpress的头像在国内一直显示不出来,问题发生在WordPress 3.0以上,WordPress的头像服务Gravatar
- 对两个虚拟SMTP服务器防止垃圾邮件中转的总结我对两个虚拟SMTP服务器防止垃圾邮件中转的总结:在论坛上看到了很多高手的发言,结合自己在实践
- 近日,从谷歌发信给站长的信中了解,谷歌将全面暂停AdSense推介业务。到2008年8月的最后一周,暂停AdSense推介计划。对于正在投放
- 百度热门关键词能带来很大的流量,这是大家有目共睹的事情。看看百度指数,如“货架”、“手机”这些词每天的检索量都过千过万。现在SEO教程都是“
- 巴西一家最大银行Bandesco巴西银行,日前遭受了DNS缓存病毒攻击。受到影响的用户会被重定向至一个假冒的银行网站,该假冒网站试图窃取用户
- SMTP提供一种可靠的有效的传送机制,它用于传送电子邮件。虽然十几年来,它的作用已经有目共睹,可是对它功能的扩充也是必不可少的。对SMTP服
- 一、需求点描述:1、在有路由器的情况下,能够通过固定的外网IP访问路由器中某台实体机中运行的VMware虚拟机。2、能够通过外网IP访问该虚
- 其实每一个黑客都有自己独到的方法。笔者对于入侵网站服务器的资料收集了很多,但是因为实际情况的不同,往往造成许多方法的失效;由此可见,每一个网
- linux杀掉指定端口1、查看端口netstat -ntlp2、杀掉端口kill 端口3、重启服务service nginx&nb
- 11月6日消息,据国外媒体报道,针对美国伊利诺伊州一家公司起诉谷歌Android侵权一事,谷歌提起了反诉。并称有人曾试图利用施佩希特的注册商
- 第一:网站内容的相关性也就是用户搜索的关键词与网页内容是否匹配,是否有相关性。相关性的加强可以通过页面内优化和一小部分链接优化来达到的。包括
- 中国互联网协会公布的2008年一季度中国反垃圾邮件调查结果显示,商业广告类是侵扰用户的垃圾邮件的主要来源;在用户最讨厌的垃圾邮件中,病毒型垃