有没有一种方法可以使用名称而不是ip地址来访问我的docker container?
我听说过pipework,也看到过一些dns和docker的主机名类型选项,但我仍然无法将所有内容拼凑在一起。
感谢您抽出宝贵时间。
我不确定这是否有帮助,但这是我到目前为止所做的:
- 使用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?
任何大致的方向都会很棒...再次感谢!
7条答案
按热度按时间xmq68pz91#
Docker
1.10
有一个内置的DNS。如果你的container连接到同一个 * 用户定义的 * 网络(创建一个网络docker network create my-network
并使用--net my-network
运行你的container),它们可以使用container名称相互引用。(Docs)。酷!
如果你使用Docker compose,你知道它会给你的容器名称添加一个前缀,比如
<project name>_<service name>-#
。这会让你的容器名称更难控制,但是对于你的用例来说可能是可以的。你可以通过在compose模板中手动设置容器名称来覆盖Docker compose命名功能,但是这样你就不能随着compose进行缩放了。bvn4nwqk2#
创建一个除docker0之外的新网桥网络,在其中运行容器,您可以按名称引用该网络中的容器。
Docker守护程序运行嵌入式DNS服务器,为连接到用户定义网络的容器提供自动服务发现。来自容器的名称解析请求首先由嵌入式DNS服务器处理。
试试看:
首先,我们创建一个新的网络。然后,我们运行一个名为test的busybox容器,监听端口7000(只是为了让它保持运行)。最后,我们ping测试容器的名称,它应该工作。
r6l8ljro3#
2018年2月17日编辑:Docker最终可能会从docker-compose中删除
links
密钥,因此他们建议使用此处所述的用户定义网络=〉https://docs.docker.com/compose/compose-file/#links假设您想要从
docker-compose.yml
档案的web
容器存取mysql
容器,例如:您会很高兴地知道Docker Compose已经添加了一个指向
mysql
容器的mysqlservice
域名(在web
容器/etc/hosts
中)。您可以只使用
mysqlservice
域名,而不用查找mysql
容器IP地址。如果您想添加自定义域名,也可以使用extra_hosts参数。
wfveoks04#
你可能想试试dnsdock。看起来很直接,很容易(!)设置。看一下http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/和https://github.com/tonistiigi/dnsdock。
kpbpu0085#
如果你想要开箱即用的解决方案,你可能需要选择Kontena。它带有来自Weave的网络覆盖技术,该技术用于在服务之间创建虚拟专用LAN网络。由于该技术,每个服务/容器都可以通过
service_name.kontena.local
访问。w8biq8rn6#
我将
--net
参数更改为--network
参数,它按预期运行:h6my8fg27#
如果您正在使用Docker Compose,并且您的
docker-compose.yml
文件具有顶层services:
块(您没有使用过时的“版本1”文件格式),则Compose会自动执行所有必需的设置。services:
下面的名称可以直接用作主机名。Docker文档中的Networking in Compose进一步描述了此设置。
这些主机名只适用于同一个合成文件中的容器之间的连接。如果你手动声明
networks:
,那么两个容器必须有一些共同的网络,但是最简单的设置是根本不声明networks:
。这些连接将只使用“标准”端口(例如,对于PostgreSQL,总是连接到端口5432);ports:
声明不是必需的,并且如果存在则被忽略。