如何通过名称而不是 IP 地址访问 docker 个容器?

How to reach docker containers by name instead of IP address?

有什么方法可以使用名称而不是 IP 地址访问我的 docker 容器?

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

感谢您的宝贵时间。

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

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

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

我可能正在寻找与此问题类似的内容:

How can let docker use my network router to assign dhcp ip to containers easily instead of pipework?

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

如果您想要开箱即用的解决方案,您可能需要检查 Kontena. It comes with network overlay technology from Weave 并且此技术用于在服务之间创建虚拟专用 LAN 网络。由于 service_name.kontena.local.

可以到达每个 service/container

编辑 2018-02-17:Docker 最终可能会从 docker-compose 中删除 links 键,因此他们建议使用 user-defined networks as stated here => https://docs.docker.com/compose/compose-file/#links


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

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

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

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

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

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

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

酷!

请注意,如果您使用 Docker compose,您知道它会为您的容器名称添加一个前缀,即 <project name>_<service name>-#。这会使您的容器名称更难控制,但对于您的用例来说可能没问题。你可以override the docker compose naming functionality by manually setting the container name in your compose template, but then you wont be able to scale with compose

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

Docker daemon runs an embedded DNS server to provide automatic service discovery for containers connected to user-defined networks. Name resolution requests from the containers are handled first by the embedded DNS server.

试试这个:

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

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

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

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>