无法使用新的 1.10 DNS SD 访问容器
Can't reach containers with new 1.10 DNS SD
我一直在为 docker 尝试最新的 RC,并编写了几天,终于在今天发布了新的稳定版本(分别为 1.10 和 1.6)。
到目前为止,1.9 中添加的新网络内容非常棒。但是自从我升级到 1.10rc1(到目前为止每个 RC 和稳定版),同一个用户定义的网络中的容器不能再找到彼此。事实上,他们现在连外面的世界都联系不上。
一个简单的例子,文件 test_docker/docker-compose.yml:
version: '2'
services:
db1:
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
db2:
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
这将创建两个带有官方图像的 MySQL 容器。根据 compose 文档,应该创建一个新的 testdocker_default,两个容器自动连接,情况是这样的:
docker network inspect testdocker_default
[
{
"Name": "testdocker_default",
"Id": "820f702e8e685567e4f1a8638cd9be305e96e37fcd741306eed6c1cf0d54ba02",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1/16"
}
]
},
"Containers": {
"16d5594bdfd11f55d33a207612b8447f6b50ff4be8b42d2313707b06ca618556": {
"Name": "testdocker_db2_1",
"EndpointID": "b6d5ff10fba860c01ac7a6508e56c5e116296cd06ea2158c695897e18fcd50ce",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"9b8b885dab3b5012c9663cb97a07af66fbe385f92c69a614a4d56bf85305ec3a": {
"Name": "testdocker_db1_1",
"EndpointID": "09e43aef8e14b0e876d47fabe67a3827dc4cea5d44b199113d9ab2678d8ce22a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {}
}
]
现在,文档还说容器应该能够通过 db1 和 db2 相互访问,但这不是案例:
root@9b8b885dab3b:/# mysql -h db2 -u root
ERROR 2005 (HY000): Unknown MySQL server host 'db2' (111)
root@9b8b885dab3b:/# mysql -h testdocker_db2_1 -u root
ERROR 2005 (HY000): Unknown MySQL server host 'testdocker_db2_1' (111)
此外,两个容器都无法访问互联网,除非我明确地将 Google 的 DNS 添加到 /etc/resolv.conf.
我很确定我在这里做错了什么,因为我找不到其他人提出的问题,但我无法弄清楚它是什么。
谢谢大家!
编辑:
澄清一下,容器可以通过它们的 IP 地址相互 ping 通,但主机名没有解析。
This issue was reported on GitHub。目前建议的解决方法是 完全禁用 firewalld。
一旦找到更好的解决方案,我将更新此答案。
编辑#1:
Pull request solving this issue(针对 Fedora 23 测试)。此 PR 已与 master 合并,供任何想从源代码编译 Docker 的人使用。
找不到预期的发布日期,但我猜它会在接下来的几周内作为补丁版本发布。将在可用时使用更多信息再次更新此答案。
编辑#2:
Docker's 1.10.1 RC 解决了这个问题。我会将此答案标记为已接受只是为了结束此主题。
我一直在为 docker 尝试最新的 RC,并编写了几天,终于在今天发布了新的稳定版本(分别为 1.10 和 1.6)。
到目前为止,1.9 中添加的新网络内容非常棒。但是自从我升级到 1.10rc1(到目前为止每个 RC 和稳定版),同一个用户定义的网络中的容器不能再找到彼此。事实上,他们现在连外面的世界都联系不上。
一个简单的例子,文件 test_docker/docker-compose.yml:
version: '2'
services:
db1:
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
db2:
image: mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
这将创建两个带有官方图像的 MySQL 容器。根据 compose 文档,应该创建一个新的 testdocker_default,两个容器自动连接,情况是这样的:
docker network inspect testdocker_default
[
{
"Name": "testdocker_default",
"Id": "820f702e8e685567e4f1a8638cd9be305e96e37fcd741306eed6c1cf0d54ba02",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1/16"
}
]
},
"Containers": {
"16d5594bdfd11f55d33a207612b8447f6b50ff4be8b42d2313707b06ca618556": {
"Name": "testdocker_db2_1",
"EndpointID": "b6d5ff10fba860c01ac7a6508e56c5e116296cd06ea2158c695897e18fcd50ce",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"9b8b885dab3b5012c9663cb97a07af66fbe385f92c69a614a4d56bf85305ec3a": {
"Name": "testdocker_db1_1",
"EndpointID": "09e43aef8e14b0e876d47fabe67a3827dc4cea5d44b199113d9ab2678d8ce22a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {}
}
]
现在,文档还说容器应该能够通过 db1 和 db2 相互访问,但这不是案例:
root@9b8b885dab3b:/# mysql -h db2 -u root
ERROR 2005 (HY000): Unknown MySQL server host 'db2' (111)
root@9b8b885dab3b:/# mysql -h testdocker_db2_1 -u root
ERROR 2005 (HY000): Unknown MySQL server host 'testdocker_db2_1' (111)
此外,两个容器都无法访问互联网,除非我明确地将 Google 的 DNS 添加到 /etc/resolv.conf.
我很确定我在这里做错了什么,因为我找不到其他人提出的问题,但我无法弄清楚它是什么。
谢谢大家!
编辑:
澄清一下,容器可以通过它们的 IP 地址相互 ping 通,但主机名没有解析。
This issue was reported on GitHub。目前建议的解决方法是 完全禁用 firewalld。
一旦找到更好的解决方案,我将更新此答案。
编辑#1:
Pull request solving this issue(针对 Fedora 23 测试)。此 PR 已与 master 合并,供任何想从源代码编译 Docker 的人使用。
找不到预期的发布日期,但我猜它会在接下来的几周内作为补丁版本发布。将在可用时使用更多信息再次更新此答案。
编辑#2:
Docker's 1.10.1 RC 解决了这个问题。我会将此答案标记为已接受只是为了结束此主题。