Docker自定义dns在容器

时间:2016-10-13 04:16:34

标签: curl docker dns docker-compose docker-networking

我关注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

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

127.0.0.1 app.lan
127.0.0.1 api.lan

我可以毫无问题地从docker主机到api.lan卷曲。但似乎web容器无法从docker主机解析名称。

如果我找到web容器的ip并将其放入php容器的hosts文件中,如下所示。

172.18.0.5 api.lan

但是如何在docker compose上自动执行此操作。或者其他任何最佳做法?

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

search local
nameserver 127.0.0.11
options ndots:0

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

我正在使用“Docker for mac”v 1.12.1

3 个答案:

答案 0 :(得分:1)

127.0.0.11是docker的内部dns,它允许容器通过名称直接相互通信(' web'以及' php'在你的情况下)。

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

答案 1 :(得分:1)

正如@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

答案 2 :(得分:0)

  

在我的php应用程序中,我卷曲到api.lan

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