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

时间:2015-06-30 22:16:13

标签: dns docker hostname docker-compose docker-machine

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

我听说过管道工程,我已经看到了码头工具的一些dns和主机名类型选项,但我仍然无法将所有东西拼凑在一起。

感谢您的时间。

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

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

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

我很遗憾在哪里解决这个问题:

  • 网络DNS服务器
  • docker-machine hostname
  • docker container hostname
  • 可能是所有这些的组合

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

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

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

6 个答案:

答案 0 :(得分:18)

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

酷!

如果您使用Docker撰写,请注意,您知道它会为您的容器名称添加前缀,即<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

答案 1 :(得分:4)

编辑2018-02-17:Docker最终可能会从docker-compose中删除links密钥,因此他们建议使用此处所述的user-defined networks =&gt; 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/hosts中),该域名指向mysql容器

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

创建一个除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测试容器,它应该可以工作。

答案 4 :(得分:3)

如果您想要开箱即用的解决方案,您可能需要查看示例Kontena。它配备了Weave的网络覆盖技术,该技术用于在服务之间创建虚拟专用LAN网络。多亏了actionPerformed(ActionEvent ae)可以访问每个服务/容器。

答案 5 :(得分:1)

我使用--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>