如何通过名称而不是 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 服务器上的网站
Laravel Forge - 通过裸 IP 而不是域名访问应用程序