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

Posted

技术标签:

【中文标题】如何通过名称而不是 IP 地址访问 docker 容器?【英文标题】:How to reach docker containers by name instead of IP address? 【发布时间】:2015-09-17 21:54:23 【问题描述】:

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

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

感谢您的宝贵时间。

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

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

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

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

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

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

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

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

【问题讨论】:

看看this answer,你可以使用DPS来实现这一点,同时你可以利用其他一些功能 【参考方案1】:

编辑 2018-02-17:Docker 最终可能会从 docker-compose 中删除 links 键,因此他们建议使用 user-defined networks,如此处所述 => 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 容器。

您可以使用mysqlservice 域名,而不是寻找mysql 容器IP 地址。

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

【讨论】:

docs.docker.com/compose/compose-file/#labels-2 链接会被删除吗? :-O【参考方案2】:

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。

【讨论】:

(更正)刚刚看到你写的关于缩放的最后一部分,现在我明白你来自哪里了! (原创)您应该能够在服务中使用docker-compose.yml 并设置container_name: anything,如果我错了,它不应该在前面添加任何内容,但如果我错了,我会在自定义网络上经常这样做。【参考方案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>

【讨论】:

【参考方案4】:

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

Docker daemon 运行一个嵌入式 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

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

【讨论】:

【参考方案5】:

如果您想要开箱即用的解决方案,您可能需要检查例如Kontena。它带有来自Weave 的网络覆盖技术,该技术用于在服务之间创建虚拟专用 LAN 网络。感谢service_name.kontena.local 可以访问每个服务/容器。

【讨论】:

这是否允许您使用service_name.kontena.local 连接到容器从主机 公开的端口?【参考方案6】:

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

【讨论】:

以上是关于如何通过名称而不是 IP 地址访问 docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过我的 IP 地址而不是本地主机访问托管在 Xampp 服务器上的网站

如何从主机获取 Docker 容器的 IP 地址

Laravel Forge - 通过裸 IP 而不是域名访问应用程序

sqlserver服务器名称改成本地IP地址登录

如何防止通过 IP 地址访问 AWS beanstalk 应用程序?

如何使用可访问的 docker-compose 设置特定的 IP 地址