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
不要那样做。使用dockerweb
和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服务器的请求。