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

vptzau2j  于 2022-11-03  发布在  Docker
关注(0)|答案(7)|浏览(235)

有没有一种方法可以使用名称而不是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?
任何大致的方向都会很棒...再次感谢!

xmq68pz9

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进行缩放了。

bvn4nwqk

bvn4nwqk2#

创建一个除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

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

r6l8ljro

r6l8ljro3#

2018年2月17日编辑:Docker最终可能会从docker-compose中删除links密钥,因此他们建议使用此处所述的用户定义网络=〉https://docs.docker.com/compose/compose-file/#links
假设您想要从docker-compose.yml档案的web容器存取mysql容器,例如:

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

您会很高兴地知道Docker Compose已经添加了一个指向mysql容器的mysqlservice域名(在web容器/etc/hosts中)。
您可以只使用mysqlservice域名,而不用查找mysql容器IP地址。
如果您想添加自定义域名,也可以使用extra_hosts参数。

kpbpu008

kpbpu0085#

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

w8biq8rn

w8biq8rn6#

我将--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>
h6my8fg2

h6my8fg27#

如果您正在使用Docker Compose,并且您的docker-compose.yml文件具有顶层services:块(您没有使用过时的“版本1”文件格式),则Compose会自动执行所有必需的设置。services:下面的名称可以直接用作主机名。

version: '3.8'
services:
  database:             # <-- "database" is a usable hostname
    image: postgres
  application:          # <-- "application" is a usable hostname
    build: .
    environment:
      PGHOST: database  # <-- use the "database" hostname

Docker文档中的Networking in Compose进一步描述了此设置。
这些主机名只适用于同一个合成文件中的容器之间的连接。如果你手动声明networks:,那么两个容器必须有一些共同的网络,但是最简单的设置是根本不声明networks:。这些连接将只使用“标准”端口(例如,对于PostgreSQL,总是连接到端口5432); ports:声明不是必需的,并且如果存在则被忽略。

相关问题