67

有没有办法可以使用名称而不是 IP 地址来访问我的 docker 容器?

我听说过管道工作,也看到了一些 docker 的 dns 和主机名类型选项,但我仍然无法将所有内容拼凑在一起。

感谢您的时间。

我不确定这是否有帮助,但这是我到目前为止所做的:

  • 使用 docker-machine 和 vmwarevsphere 驱动程序安装了 docker 容器主机
  • 使用 docker-compose 启动所有服务
  • 我可以使用 IP 和端口从网络上的任何其他机器访问所有服务

我已向我的专用网络 DNS 服务器添加了一个 DNS 别名条目,它与 docker-machine 使用的机器名称相匹配。但是机器在启动并连接到网络时总是选择不同的 IP 地址。

我只是不知道在哪里解决这个问题:

  • 网络 DNS 服务器
  • 码头机器主机名
  • docker 容器主机名
  • 可能是所有这些的组合

我可能正在寻找类似于这个问题的东西:

如何让 docker 使用我的网络路由器轻松地将 dhcp ip 分配给容器而不是管道?

任何大方向都会很棒......再次感谢!

4

6 回答 6

53

Docker1.10有一个内置的 DNS。如果您的容器连接到同一个用户定义的网络(创建一个网络docker network create my-network并使用 运行您的容器--net my-network),它们可以使用容器名称相互引用。(文档)。

凉爽的!

如果您使用 Docker compose,请注意一个问题,您知道它会为您的容器名称添加前缀,即<project name>_<service name>-#. 这使您的容器名称更难以控制,但对于您的用例来说可能没问题。您可以通过在 compose 模板中手动设置容器名称来覆盖 docker compose 命名功能,但是您将无法使用 compose 进行扩展

于 2016-02-29T04:13:21.617 回答
13

创建一个除 docker0 之外的新桥接网络,在其中运行您的容器,您可以通过名称引用该网络中的容器。

Docker 守护进程运行嵌入式 DNS 服务器,为连接到用户定义网络的容器提供自动服务发现。来自容器的名称解析请求首先由嵌入式 DNS 服务器处理。

尝试这个:

docker network create <network name>
docker run --net <network name> --name test busybox nc -l 0.0.0.0:7000
docker run --net <network name> busybox ping test

首先,我们创建一个新网络。然后,我们在端口 7000 上运行一个名为test的 busybox 容器(只是为了让它保持运行)。最后,我们通过名称 ping 测试容器,它应该可以工作。

于 2016-10-19T17:28:31.690 回答
5

编辑 2018-02-17:Docker 最终可能会links从 docker-compose 中删除密钥,因此他们建议使用此处所述的用户定义网络=> https://docs.docker.com/compose/compose-file/#links


假设您想mysql从文件的web容器中访问容器docker-compose.yml,例如:

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

您会很高兴知道 Docker Compose 已经添加了一个指向容器的mysqlservice域名(在web容器中) 。/etc/hostsmysql

无需查找mysql容器 IP 地址,只需使用mysqlservice域名即可。

如果要添加自定义域名,也可以使用extra_hosts参数。

于 2015-07-01T17:52:10.820 回答
4

如果您想要开箱即用的解决方案,您可能需要检查例如Kontena。它配备了Weave的网络覆盖技术,该技术用于在服务之间创建虚拟专用 LAN 网络。由于每个服务/容器都可以通过service_name.kontena.local.

于 2015-07-01T07:19:24.913 回答
4

您可能想尝试一下 dnsdock。看起来很简单,很容易(!)设置。看看http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/https://github.com/tonistiigi/dnsdock

于 2015-07-02T06:27:52.693 回答
3

我用参数更改了--net参数--network,它按预期运行:

docker network create <network name>
docker run --network <network name> --name <container name> <other container options>
docker run --network <network name> --name <container name> <other container options>
于 2017-05-30T08:36:46.753 回答