是否可以通过主机而不是 IP 来卷曲外部容器?

Is it possible to curl external container by host instead of IP?

我有两个独立的 docker 堆栈。从堆栈 1,我想知道是否可以使用容器名称而不是其 IP 地址从堆栈 2 卷曲容器?

当访问 IP 地址时,我收到了 HTTP 代码 200 的响应。 当卷曲命名时,我收到 HTTP 400 Bad Request。

我尝试了几种不同的 docker-compose 配置。这是最新消息:

堆栈 A

version: '3'
services:
    php:
        build:
            context: .
            dockerfile: ./dev.dockerfile
        container_name: arm_php
        ports:
          - "8000:8000"
        volumes:
            - ./:/app
        links:
            - maildev:maildev
            - redis:redis
        external_links:
            - a25_mysql_1:a25_mysql
        networks: 
            - default
            - a25dashboardad_default
    maildev:
        image: djfarrelly/maildev
        hostname: residencia-maildev
        container_name: arm_maildev
        ports:
          - "1025:25"
          - "1080:80"
    redis:
        image: "redis"
        container_name: arm_redis
        ports:
            - "6379:6379"
networks:
    a25dashboardad_default:
        external: true

堆栈 B

version: '3'
services:
    php:
        image: armcanada/php7-mssql
        container_name: a25_php
        ports:
          - "8001:8000"
        volumes:
            - ./:/app
        links:
            - maildev:maildev
            - database:database
    database:
        image: mysql:5.7.18
        container_name: a25_mysql
        environment:
            - "MYSQL_DATABASE=a25_db"
            - "MYSQL_USER=user"
            - "MYSQL_PASSWORD=password"
            - "MYSQL_ROOT_PASSWORD=password"
        ports:
            - "33060:3306"
        volumes:
             - db:/var/lib/mysql
    maildev:
        image: djfarrelly/maildev
        hostname: residencia-maildev
        container_name: a25_maildev
        ports:
          - "1026:25"
          - "1081:80"
volumes:
    db:
networks:
    default:
        driver: bridge

来自arm_php:

作品:curl 172.19.0.4:8000/api/dmt

无效:curl a25_php:8000/api/dmt?key=8009829dedabad1e44263cf845484f14

我终于能够通过将用户定义的网络与别名结合使用来使其工作。详情如下:

堆栈 A

version: '3'
services:
    php:
        build:
            context: .
            dockerfile: ./dev.dockerfile
        container_name: arm_php
        ports:
          - "8000:8000"
        volumes:
            - ./:/app
        links:
            - maildev:maildev
            - redis:redis
        external_links:
            - a25_mysql_1:a25_mysql
        networks: 
            - default
            - a25dashboardad_default
            - a25dashboardad_armnet
    maildev:
        image: djfarrelly/maildev
        hostname: residencia-maildev
        container_name: arm_maildev
        ports:
          - "1025:25"
          - "1080:80"
    redis:
        image: "redis"
        container_name: arm_redis
        ports:
            - "6379:6379"
networks:
    a25dashboardad_default:
        external: true
    a25dashboardad_armnet:
        external: true

堆栈 B

version: '3'
services:
    php:
        image: armcanada/php7-mssql
        container_name: a25_php
        networks:
          default:
            aliases:
                - default
          armnet:
            aliases:
              - a25php
        ports:
          - "8001:8000"
        volumes:
            - ./:/app
        links:
            - maildev:maildev
            - database:database
    database:
        image: mysql:5.7.18
        container_name: a25_mysql
        ports:
            - "33060:3306"
        volumes:
             - db:/var/lib/mysql
    maildev:
        image: djfarrelly/maildev
        hostname: residencia-maildev
        container_name: a25_maildev
        ports:
          - "1026:25"
          - "1081:80"
volumes:
    db:
networks:
  armnet:
    driver: bridge

然后我可以使用 curl a25php:8000.

卷曲形式 arm_php

原因如文档所说: Docker 不支持默认桥接网络上的自动服务发现。如果您希望容器能够通过容器名称解析 IP 地址,您应该改用用户定义的网络。 https://docs.docker.com/v17.09/engine/userguide/networking/#user-defined-networks