Docker 1.10通过主机名从主机访问容器

42fyovps  于 2023-03-07  发布在  Docker
关注(0)|答案(5)|浏览(202)

我有嵌入式DNS服务的Docker版本1.10。
我在我的docker-compose文件中创建了两个服务容器,它们可以通过主机名和IP访问,但是当我想从主机访问其中一个时,它不起作用,它只能通过IP访问,而不能通过主机名访问。
那么,是否可以通过Docker 1.10中的主机名从主机访问Docker容器?

    • 更新日期:**

docker-compose.yml

version: '2'
services:
    service_a:
        image: nginx
        container_name: docker_a
        ports:
           - 8080:80
    service_b:
        image: nginx
        container_name: docker_b
        ports:
            - 8081:80

然后我用命令启动它docker-compose up --force-recreate
当我跑步时:

  • docker exec -i -t docker_a ping -c4 docker_b-它工作正常
  • docker exec -i -t docker_b ping -c4 docker_a-它工作正常
  • ping 172.19.0.2-它工作(172.19.0.2docker_b的ip)
  • ping docker_a-失败

docker network inspect test_default的结果为

[
    {
        "Name": "test_default",
        "Id":   "f6436ef4a2cd4c09ffdee82b0d0b47f96dd5aee3e1bde068376dd26f81e79712",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1/16"
                }
            ]
        },
        "Containers": {
             "a9f13f023761123115fcb2b454d3fd21666b8e1e0637f134026c44a7a84f1b0b": {
                "Name": "docker_a",
                "EndpointID":     "a5c8e08feda96d0de8f7c6203f2707dd3f9f6c3a64666126055b16a3908fafed",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
                "c6532af99f691659b452c1cbf1693731a75cdfab9ea50428d9c99dd09c3e9a40": {
                "Name": "docker_b",
                "EndpointID":     "28a1877a0fdbaeb8d33a290e5a5768edc737d069d23ef9bbcc1d64cfe5fbe312",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
5lhxktic

5lhxktic1#

作为answered here,有一个软件解决方案,称为DNS代理服务器。

$ sudo ./dns-proxy-server

$ docker run --rm --hostname nginx.dev nginx
$ ping nginx.dev
PING nginx.dev (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4 (172.17.0.4): icmp_seq=1 ttl=64 time=0.043 ms
64 bytes from 172.17.0.4 (172.17.0.4): icmp_seq=2 ttl=64 time=0.022 ms
whitzsjs

whitzsjs2#

为了专门解决这个问题,我创建了一个简单的“etc/hosts”域注入tool,用于解析主机上本地Docker容器的名称。

docker run -d \
    -v /var/run/docker.sock:/tmp/docker.sock \
    -v /etc/hosts:/tmp/hosts \
    --name docker-hoster \
    dvdarias/docker-hoster

您将能够使用container namehostnamecontainer id和vía network aliases访问容器,这些变量已为每个网络声明。
容器在启动时自动注册,在暂停、停用或停止时自动删除。

zzlelutf

zzlelutf3#

我是这么做的。
我写了一个名为dnsthing的Python脚本,它监听Docker事件API来启动或停止容器,它维护一个hosts样式的文件,其中包含容器的名称和地址,容器被命名为<container_name>.<network>.docker,例如,如果我运行以下命令:

docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=secret  mysql

我得到这个:

172.17.0.2 mysql.bridge.docker

然后运行一个指向hosts文件的dnsmasq进程,具体来说,使用以下配置运行一个dnsmasq示例:

listen-address=172.31.255.253
bind-interfaces
addn-hosts=/run/dnsmasq/docker.hosts
local=/docker/
no-hosts
no-resolv

我运行dnsthing脚本,如下所示:

dnsthing -c "systemctl restart dnsmasq_docker" \
  -H /run/dnsmasq/docker.hosts --verbose

因此:

  • dnsthing在容器停止/开始时更新/run/dnsmasq/docker.hosts
  • 更新后,dnsthing将运行systemctl restart dnsmasq_docker
  • dnsmasq_docker使用上述配置运行dnsmasq,绑定到地址为172.31.255.253的本地网桥接口。
  • 我的系统上由NetworkManager维护的"主" dnsmasq进程使用/etc/NetworkManager/dnsmasq.d/dockerdns中的以下配置:
server=/docker/172.31.255.253

它告诉dnsmasq将.docker域中主机的所有请求传递给docker_dnsmasq服务。
这显然需要一点设置才能把所有的东西放在一起,但在那之后,它似乎只是工作:

$ ping -c1  mysql.bridge.docker
PING mysql.bridge.docker (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.087 ms

--- mysql.bridge.docker ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.087/0.087/0.087/0.000 ms
oipij1gg

oipij1gg4#

最简单的方法是将条目添加到主机文件中

  • 对于Linux:将127.0.0.1 docker_a docker_b添加到/etc/hosts文件
  • 对于mac:类似于linux,但使用虚拟机docker-machine ip default的ip
8fsztsew

8fsztsew5#

与@larsks类似,我也写了一个Python脚本,但将其实现为服务,如下所示:https://github.com/nicolai-budico/dockerhosts
它使用参数--hostsdir=/var/run/docker-hosts启动dnsmasq,并在每次运行的container列表更改时更新文件/var/run/docker-hosts/hosts。一旦文件/var/run/docker-hosts/hosts更改,dnsmasq将自动更新其Map,container将在一秒钟内按主机名可用。

$ docker run -d --hostname=myapp.local.com --rm -it ubuntu:17.10
9af0b6a89feee747151007214b4e24b8ec7c9b2858badff6d584110bed45b740

$ nslookup myapp.local.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   myapp.local.com
Address: 172.17.0.2

有安装和卸载脚本。您只需要允许您的系统与此dnsmasq示例交互。我在systemd-resolved中注册了:

$ cat /etc/systemd/resolved.conf

[Resolve]
DNS=127.0.0.54
#FallbackDNS=
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=no
#Cache=yes
#DNSStubListener=udp

相关问题