想问一下 docker link 问题

2017-06-03 20:38:35 +08:00
 SlipStupig
我现在有多个 mongodb 的容器,有一个 tornado 的服务端,tornado 不在一起,我怎么通过 link 到 mongodb,但是我程序里面怎么才能知道 mongodb 的地址和端口呢?
3783 次点击
所在节点    程序员
13 条回复
zuolan
2017-06-03 20:43:03 +08:00
Docker 的 link 实际上会修改容器的 /etc/hosts 文件,所以直接使用 mongodb 的容器名称加上端口号就可以连接了,有点像使用域名连接一样。
SlipStupig
2017-06-03 21:30:57 +08:00
@zuolan 哦,那程序里面要改成 host:port 这种形式?
tlday
2017-06-03 21:53:34 +08:00
link 选项已经不推荐了,你说的这些 docker 文档写的很清楚
SlipStupig
2017-06-03 21:56:26 +08:00
@tlday 有什么更好的办法吗?
tlday
2017-06-03 22:01:08 +08:00
Warning: The --link flag is a deprecated legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.
出处:https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#connect-using-network-port-mapping
yiding
2017-06-03 22:58:38 +08:00
@SlipStupig 可以使用 network 参数,最新的几个版本中都有
https://docs.docker.com/engine/userguide/networking/#default-networks
beginor
2017-06-04 07:59:55 +08:00
确实不推荐使用 link, 建议使用指定 network 或者 volume 的形式
SlipStupig
2017-06-04 10:32:40 +08:00
@beginor 我是使用 docker-compose 构建的,我该如何编排多个容器呢?
deepzz
2017-06-04 15:14:56 +08:00
有 a-docker-compose.yml 和 b-docker-compose.yml:
version: '2'
services:
ping:
image: alpine
command: ping redis
external_links:
- redis

networks:
default:
external:
name: a_default

这是 b-docker-compose.yml。目的是去 ping redis。
在 a.docker-compose.yml 启动的时候创建了默认的网络 a_default (你可以通过 $docker network ls 查看)并启动了 redis.

那么重要的来了,你需要在 b-docker-compose.yml 中指定 a 的 networks,如上面所示。
SlipStupig
2017-06-04 15:36:47 +08:00
@deepzz 如果 host 和容器不是一个机器也可以嘛?
jhsea3do
2017-06-05 11:16:46 +08:00
既然使用 link, 你应该不太用 scale 的,

其实指定 hostname / domainname 就可以了,另外 可以考虑指定 depends_on

如果两个 container 都在同一个域下面,可以直接用主机名互相访问的
jarlyyn
2017-06-05 12:01:12 +08:00
制定 network 比较好用
beginor
2017-06-05 12:22:35 +08:00
@SlipStupig 就是按照 deepzz 的配置, 网络配好就行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX