Curl Docker自定义容器之间的dns解析

Curl Docker自定义容器之间的dns解析,curl,docker,dns,docker-compose,docker-networking,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

我有以下
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
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
我在web容器中安装了2个虚拟主机

app.lan
api.lan
在我的
php
应用程序中,我确实使用了
api.lan
。但它抛出
无法解析主机:api.lan

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

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

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

172.18.0.5 api.lan
但我如何在docker compose上实现这一点的自动化呢。或者其他对此的最佳实践

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

search local
nameserver 127.0.0.11
options ndots:0
这是什么127.0.0.11?是主机吗


我在“Docker for mac”
v1.12.1

127.0.0.11是Docker的内部dns,允许容器通过名称直接相互通信(在您的例子中是“web”和“php”)


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

127.0.0.11是docker的内部dns,允许容器通过名称直接相互通信(在您的示例中为“web”和“php”)

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

在我的php应用程序中,我使用curl到
api.lan

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

在我的php应用程序中,我使用curl到
api.lan


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

正如@Chris所指出的,我需要使用docker的
额外的\u主机
,我还需要创建一个网络并为每个docker容器分配IP

以下是我的完整
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
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

正如@Chris指出的,我需要使用docker的
额外的\u主机
,还需要创建一个网络,并为每个docker容器分配IP

以下是我的完整
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
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

我试过了,但它不起作用。因为我在同一个
web
容器中运行多个虚拟主机。我试过了,但它不起作用。因为我在同一个
web
容器中运行多个虚拟主机。但是在这种情况下,您需要手动添加每个主机,当IP发生变化时,您将在每个docker重新启动时做什么。Dockers内部dns为您完成了这项工作,您可以使用容器的名称始终指向它的最新IP地址。是的,但在当前情况下,您需要通过nginx访问php。您无法直接从php容器接收响应。因此,您需要api1.com路由到nginx:80端口,而不是php。php容器只有php:9000守护进程侦听器,谁将仅处理来自Web服务器的请求。但在这种情况下,您需要手动添加每个主机,以及在IP发生更改时,每次docker重新启动时您将执行什么操作。docker内部dns为您执行此操作,您可以使用容器的名称始终指向其最新的IP地址。是的,但在当前情况下,您需要通过nginx访问php。您无法收到响应所以您需要api1.com路由到nginx:80端口,而不是php。php容器只有php:9000守护进程侦听器,它只处理来自Web服务器的请求。