【问题标题】:How can I add hostnames to a container on the same docker network?如何将主机名添加到同一 docker 网络上的容器中?
【发布时间】:2015-11-13 15:04:04
【问题描述】:

假设我有一个包含两个容器的 docker compose 文件。两者都在其 /etc/hosts 文件中相互引用。容器 A 具有容器 B 的引用,反之亦然。而这一切都是自动发生的。现在我想在 A 的 hosts 文件中为 B 添加一个或多个主机名。我该怎么做呢?有没有一种特殊的方法可以在 Docker Compose 中实现这一点?

例子:

172.0.10.166 service-b my-custom-hostname

【问题讨论】:

    标签: docker hostname docker-compose


    【解决方案1】:

    是的。在您的撰写文件中,您可以指定network aliases

    services:
      db:
        networks:
          default:
            aliases:
              - database
              - postgres
    

    在本例中,默认网络上的其他容器可以使用dbdatabasepostgres 访问db 服务。

    您也可以使用带有--alias= 选项的docker network connect 命令add aliases to running containers

    【讨论】:

    • 您确定可以在容器运行时添加 DNS 别名吗?我已经实现的最接近的选择是仍然断开容器与网络的连接并使用别名再次添加它。命令:docker network listdocker network disconnect dns-alias-network my-centos-containerdocker network connect --alias my-centos-alias dns-alias-network my-centos-container。有什么办法可以避免断开容器? - Error response from daemon: endpoint with name my-centos already exists in network dns-alias-network
    • @Laimis 是的,您可以在容器运行时为其设置别名;断开它与网络的连接不会停止容器。不过,我不知道是否有办法在不断开容器的情况下添加别名。
    • @Steve 是的,断开和连接的技巧奏效了。如果这是硬网络故障,会很好奇。例如,问题是 TCP 连接是否只是延迟了几毫秒/是否优雅地重新连接。
    【解决方案2】:

    Docker compose 有一个extra_hosts 功能,允许将额外的条目添加到容器的主机文件中。

    示例

    docker-compose.yml

    web1:
      image: tomcat:8.0
      ports:
        - 8081:8080
      extra_hosts:
        - "somehost:162.242.195.82"
        - "otherhost:50.31.209.229"
    web2:
      image: tomcat:8.0
      ports:
        - 8082:8080
    web3:
      image: tomcat:8.0
      ports:
        - 8083:8080
    

    演示主机文件条目

    使用新的docker 1.9 networking feature 运行 docker compose:

    $ docker-compose --x-networking up -d
    Starting tmp_web1_1
    Starting tmp_web2_1
    Starting tmp_web3_1
    

    并查看第一个容器中的 hosts 文件。显示其他容器,以及额外的自定义条目:

    $ docker exec tmp_web1_1 cat /etc/hosts 
    ..
    172.18.0.4  web1
    172.18.0.2  tmp_web2_1
    172.18.0.3  tmp_web3_1
    50.31.209.229   otherhost
    162.242.195.82  somehost
    

    【讨论】:

    • 关闭!感谢您的写作。我真正想要的是:172.18.0.2 tmp_web2_1 otherhost somehost
    • 我想引用一个容器而不是某个静态 IP 地址
    • @saada 啊,你想要别名。不要认为这是受支持的
    • @saada 您可以通过指定容器名称来伪造它:docs.docker.com/compose/compose-file/#container-name
    • 啊,但是使用容器名称会限制缩放功能,这对我来说是一个不可用的功能。我想这值得放在撰写问题上
    【解决方案3】:

    如果我正确理解您的问题,您可以通过 --add-host 标志传递您主机的 /etc/hosts 文件中引用的主机名:

    $ docker run ... --add-host="droid" 
    

    您主机的 /etc/hosts 需要以下条目: xx.xx.xx.xx 机器人

    当然,xx.xx.xx.xx 需要可以从您刚刚使用“docker run”命令启动的容器内部访问。您可以拥有一个或多个 --add-host="xyz"。

    更多关于 --add-host 的细节在这里:

    http://docs.docker.com/v1.8/reference/commandline/run/

    【讨论】:

    • 这种格式如何定义另一个容器的运行时ip地址?
    • 您可以添加多个 --add-host 标志。所有值都可以放在该容器主机的 /etc/hosts 中(或者它们可以在本地名称服务器中)。
    • 我正在尝试引用动态 IP 而不是静态 IP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多