Docker 容器间的自定义 DNS 解析

Docker custom dns resolve among containers

我关注docker-compose.yml

php:
    build: ./phpfpm
    volumes:
        - ~/works/codes:/code

web:
    image: nginx:latest
    ports:
        - "80:80"
    volumes:
        - ~/works/codes:/code
        - ./nginx/etc/conf.d/virtual.conf:/etc/nginx/conf.d/virtual.conf
        - ./nginx/var/log/nginx:/var/log/nginx
    links:
        - php

我在 Web 容器中设置了 2 个虚拟主机

app.lan
api.lan

在我的 php 应用程序中,我卷曲到 api.lan。但它抛出 Could not resolve host: api.lan

在我的 docker 主机中,我已将以下内容添加到 /etc/hosts 文件

127.0.0.1 app.lan
127.0.0.1 api.lan

我可以从 docker 主机 curl 到 api.lan 没有问题。但似乎 web 容器无法从 docker 主机解析名称。

如果我找到 web 容器的 ip 并将其放入 php 容器的主机文件中,它会起作用。

172.18.0.5 api.lan

但是如何在 docker 撰写时自动执行此操作。或者任何其他最佳实践?

此外,如果我对任一容器进行 cat /etc/resolve.conf,我可以找到以下内容。

search local
nameserver 127.0.0.11
options ndots:0

这个 127.0.0.11 是什么?是主机吗?

我在 "Docker for mac" v 1.12.1

127.0.0.11 是 docker 的内部 dns,允许容器通过名称直接相互通信('web' 和 'php')。

您可以使用 extra hosts 在 docker-compose.yml 中向 docker 添加额外条目。

In my php application I do curl to api.lan

不要那样做。使用 docker webphp 提供的主机名(您在 docker-compose.yml 中为服务提供的名称被创建为其他容器可以使用的主机名。

正如@Chris 指出的那样,我需要使用 docker 的 extra_hosts 并且我还需要创建一个网络并为每个 docker 容器分配 IP。

以下是我的全文docker-compose.yml

version: "2"

networks:
    lan_0:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 172.19.0.0/24
                  gateway: 172.19.0.21

services:
    php:
        build: ./phpfpm
        volumes:
            - ~/works/codes:/code
        extra_hosts:
            - "api.lan:172.19.0.21"
        networks:
            lan_0:
                ipv4_address: 172.19.0.22

    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ~/works/codes:/code
            - ./nginx/etc/conf.d/virtual.conf:/etc/nginx/conf.d/virtual.conf
            - ./nginx/var/log/nginx:/var/log/nginx
        links:
            - php
        networks:
            lan_0:
                ipv4_address: 172.19.0.21