假设我具有以下文件结构
.
├── docker-compose.yml
└── webserver
├── Dockerfile
├── html
│ ├── test1
│ │ └── index.html
│ └── test2
│ └── index.html
└── vhosts.conf
4 directories, 5 files
与docker-compose.yml
:
version: "3.1"
services:
webserver:
build: webserver
container_name: web
working_dir: /application
volumes:
- ./webserver/html/:/application
ports:
- "80:80"
other:
image: php:7.2.7
container_name: other
tty: true
与Dockerfile
:
FROM php:7.2.7-apache
COPY vhosts.conf /etc/apache2/sites-enabled/000-default.conf
与vhosts.conf
:
<VirtualHost *:80>
ServerName test1.localhost
DocumentRoot /application/test1
<Directory /application/test1>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName test2.localhost
DocumentRoot /application/test2
<Directory /application/test2>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
和index.html
文件,只是带有一些内容以区别它们。
此外,我在 docker主机的 /etc/hosts
文件中添加了以下几行:
127.0.0.1 test1.localhost
127.0.0.1 test2.localhost
现在,我可以运行docker-compose build
和docker-compose up
来设置和运行容器。在主机或curl test1.localhost
容器上运行web
时,我得到了index.html
的预期内容。但是,如果我从other
容器运行相同的命令,则会得到:
curl: (7) Failed to connect to test1.localhost port 80: Connection refused
我在https://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/找到了以下引言:
在没有--dns = IP_ADDRESS ...,--dns-search = DOMAIN ...或--dns-opt = OPTION ...选项的情况下,Docker使用/etc/resolv.conf主机(运行docker守护程序的主机)。
因此,据我所知,容器内部的名称解析仅使用docker host的hosts文件中的条目。但是,此操作在other
容器上失败,因为/etc/hosts
文件将名称解析为127.0.0.1
,但是other
容器未运行网络服务器。我希望将other
上的名称放到web
容器中。
这显然是一个最小的示例。对于Web应用程序的开发设置,我需要这种行为,我想从与运行Apache主机的容器不同的容器中运行cronjobs。 cronjobs运行的脚本向容器中的不同主机执行http请求。
我怀疑以某种方式使用docker网络配置的解决方案...
答案 0 :(得分:1)
好吧,在Docker Slack频道的帮助下,我找到了一个解决方案,实际上甚至是两个...
第一个解决方案使用docker network aliases。本质上,我明确阐明了两个容器都属于的默认网络,并为Web服务器容器创建了一些别名。
docker-compose-yml
:
version: "3.1"
services:
webserver:
build: webserver
container_name: web
working_dir: /application
volumes:
- ./webserver/html/:/application
ports:
- "80:80"
networks:
default:
aliases:
- test1.localhost
- test2.localhost
other:
image: php:7.2.7
container_name: other
tty: true
networks:
- default
networks:
default:
第二个解决方案使用docker network links。反之亦然。对于每个依赖容器(其他),您可以指定应转发到Web服务器的其他链接/名称。
docker-compose-yml
:
版本:“ 3.1”
services:
webserver:
build: webserver
container_name: web
working_dir: /application
volumes:
- ./webserver/html/:/application
ports:
- "80:80"
other:
image: php:7.2.7
container_name: other
tty: true
links:
- "webserver:test1.localhost"
- "webserver:test2.localhost"
答案 1 :(得分:0)
如果我正确理解。 您可以按容器之间的容器名称进行解析。