越来越多的开发者被带到Docker的使用中,至少我的所有开发环境都是Docker的,Github直达。本人习惯用 Docker compose 来管理,在各种各样的容器之间,网络问题时不时的就蹦出来,现我就过程中遇到的问题做出自己的总结。
同一个 docker-compose 文件中的容器如何互联?
在整理开发环境时,我习惯性的把php和nginx放在一起,方便启动时能够同时启动。所以会把 nginx 和 php 放在同一个 docker-compose 中。那么如何保证 nginx 能转发到 php 呢?
links
version: "3"
services:
nginx:
image: nginx:1.15
links:
- "php7cache"
php7cache:
build: .
这样nginx和php就能简单的通信了。当然,我们的php不会是独立的,一般还会用到mysql,但是又不是必要的,所以我又单独启动了一个mysql容器。独立的mysql容器,独立的docker-compose文件。那么这时候又要怎样连接呢?
不同 docker-compose 文件中的容器如何互联?
external_links
external_links是连接外部网络的方式,这种方案来源于网上,如下:
...
# other
...
php7cache:
build: .
networks:
- default
- app_net
external_links:
- redis
- mysql
networks:
app_net: # 定义了一个 app_net 的网络
external: true # 并标识为外部网络
networks
在使用external_links这个过程中我意识的,这生效的极有可能不是external_links,而是在networks服务生效了,于是做了尝试,发现真的可以,我的理解是 app_net 其实是重新定义了一个网络,然后在容器的net_works参数上指定加入了 app_net 中。
version: "3"
services:
flume:
image: probablyfine/flume
networks:
- default
- kafka_default
networks:
kafka_default:
external: true
细心的同学可能已经发现了,在上面的代码中我并没有再使用app_net,而是直接使用了kafka_default。为什么?其实,当使用 “docker network ls” 命令时,我们会发现在当指定 app_net 时,列表中会包含 app_net 网络,同时,也会有各种容器的 default 网络,如:kafka_default。为了偷懒,我就直接使用了 kafka_default。
extra_hosts
最近,又有一个需求,我的docker需要使用与宿主机同一网络的其它服务。尝试很多方法,改hosts、创建新网络,发现都无法解决。后来才发现还有extra_hosts参数,尝试了一下,发现真的可行。
version: "3"
services:
flume_events:
image: probablyfine/flume
container_name: flume_events
environment:
FLUME_AGENT_NAME: agent
extra_hosts:
- "test-1:10.3.8.49"
指定extra_hosts后,在宿主机上修改host。然后在flume的配置文件中指定kafka的链接为 test-1:9092。