浅谈docker-compose网络设置之networks
networks使用方式之官网教程
官网的docker-compose.yml参考文档:Composefileversion3reference
较为准确的中文翻译版:Composefileversion3reference
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-composeup启动容器后,这些容器都会被加入app_default网络中。使用dockernetworkls可以查看网络列表,dockernetworkinspect
$dockernetworkls NETWORKIDNAMEDRIVERSCOPE 6f5d9bc0b0a0app_defaultbridgelocal 0fb4027b4f6dbridgebridgelocal 567f333b9de8docker-compose_defaultbridgelocal bb346324162ahosthostlocal a4de711f6915mysql_appbridgelocal f6c79184ed27mysql_defaultbridgelocal 6358d9d60e8anonenulllocal 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: #Useacustomdriver driver:custom-driver-1 back: #Useacustomdriverwhichtakesspecialoptions driver:custom-driver-2 driver_opts: foo:"1" bar:"2"123456789101112131415161718192021222324252627
值得注意的是,这里定义了back和front两个网络,似乎它们的名字就定义成了back和font,但是你使用dockernetworkls命令并不能找到它们。假如你是在myApp目录下运行的docker-composeup命令,那么这两个网络应该分别对应myApp_back和myApp_front。
3.配置默认网络
version:'2' services: web: build:. ports: -"8000:8000" db: image:postgres networks: default: #Useacustomdriver 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
我决定使用预先创建的网络,然后把他们加入这个已经创建好的网络,从而实现通信。为此,我运行了如下命令:
$dockernetworkcreateapp1
之后,开始运行编写好的docker-compose.yml文件。首先运行启动mysql的配置文件,结果如下:
l$docker-composeup ERROR:Service"dbmaster"usesanundefinednetwork"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.注意遇到问题尝试几种替代方式去解决
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。