如何在Docker容器中提供自定义名称解析

时间:2018-07-18 12:12:35

标签: docker dns docker-compose virtual-hosts name-resolution

假设我具有以下文件结构

.                                  
├── 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 builddocker-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网络配置的解决方案...

2 个答案:

答案 0 :(得分:1)

好吧,在Docker Slack频道的帮助下,我找到了一个解决方案,实际上甚至是两个...

使用Docker网络别名

第一个解决方案使用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网络链接

第二个解决方案使用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)

如果我正确理解。 您可以按容器之间的容器名称进行解析。