假设我有这样的设置:
- 应用服务器
- 私有 IP:;
1.0.0.1
私有主机名:machine1.internal.domain
- 公共 IP :
2.0.0.1
;公共主机名:machine1.example.com
- 私有 IP:;
- 数据库服务器
- 私有 IP:;
1.0.0.2
私有主机名:machine2.internal.domain
- 公共 IP :
2.0.0.2
;公共主机名:machine2.example.com
- 私有 IP:;
这两台机器位于 DMZ 中。
Machine1 需要使用内部主机名连接到 machine2。有一点很重要:我们不希望这两台机器之间的任何流量流出 DMZ。并且主机名machine2.internal.domain
在机器 #1 上运行的应用程序中被硬编码。
无需 Dockerized 设置:
- 案例#1:如果名称解析有效
machine2.internal.domain
,则所有事情都已很好。 - 案例#2:否则,我将在机器 1 中添加一个条目
/etc/hosts
:machine2.internal.domain 1.0.0.2
通过 Dockerized 设置,我知道当名称解析不起作用时,Docker 容器无法到达 machine2,因为它没有继承/etc/hosts
主机中的条目。
我怎样才能使这个东西以最好的方式工作?......对于两种情况:DNS解析工作和不工作。
我已经审查了情况 2 的以下选项:
- 将machine2的IP传递给machine1中的Docker容器:
docker run --add-host machine2.internal.domain:1.0.0.2 ...
- 我必须定义
machine2.internal.domain
两次IP:一次/etc/hosts
在Docker运行命令中
- 我必须定义
- 没有为 machine1 中的容器包含网络:
docker blabla --net=host
- 虽然我不知道会有什么后果,但我觉得这不对劲。
答案1
如果您有内部 DNS 服务器,则可以使用 --dns=[] 选项运行您的 docker 应用程序。
将内部 DNS 服务器设置为名称查找失败时真实 DNS 的转发器,这样任何内部名称都可以使用内部地址。
另一个选择是将自定义主机文件写入您的 docker 镜像中,如果它们是固定的,这是可以的,但并不总是理想的。
第三种方法是考虑使用类似 skydns 的东西。如果您的 docker 主机正在运行 CoreOS,或者您有一个 etcd2 集群,那么它也可以工作。
到目前为止,最好的选择是让您的主机通过某种发现机制来找出事物所在位置,而不依赖于 DNS。但是,它们通常需要 etcd2 或 consul 之类的东西。