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 web
和 php
提供的主机名(您在 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
我关注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 web
和 php
提供的主机名(您在 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