web-dev-qa-db-ja.com

docker-composeのextra_hostsオプションでコンテナー名を解決する

別のコンテナーから自分のAPIをカールする必要があります。コンテナー1はnginxと呼ばれ、コンテナー2はfpmと呼ばれます

FPMコンテナーをbashしてnginxコンテナーをカールできるようにする必要があります。

構成:

services:

  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    links:
      - fpm


  fpm:
    build:
      context: .
      dockerfile: ./docker/fpm/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
      - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
    env_file:
      - ./docker/mysql/mysql.env
      - ./docker/fpm/conf/dev/fpm.env
    links:
      - mysql
    shm_size: 256M
    extra_hosts:
      - myapi.docker:nginx

私の最初の考えは、extra_hostsオプションのような:

extra_hosts:
  - myapi.docker:nginx

しかし、docker-compose upは次のエラーで失敗します:

エラー:apiwip_fpm_1の場合サービスfpmのコンテナを作成できません:add-Host: "nginx"のIPアドレスが無効です

Dockerのネットワーク構成を使用している人の例をいくつか見ましたが、アドレスを解決するだけでは上回っています。

文字通り単に渡すのではなく、コンテナのIPアドレスを解決または評価するにはどうすればよいですか?

9
Edward
    services:

      nginx:
        build:
          context: .
          dockerfile: ./docker/nginx/Dockerfile
        volumes:
          - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
        ports:
          - 8080:80
        networks:
          my_network:
            aliases:
              - myapi.docker
              - docker_my_network

      fpm:
        build:
          context: .
          dockerfile: ./docker/fpm/Dockerfile
        volumes:
          - .:/var/www/html
          - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
          - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
        env_file:
          - ./docker/mysql/mysql.env
          - ./docker/fpm/conf/dev/fpm.env
        links:
          - mysql
        shm_size: 256M
        extra_hosts:
          - myapi.docker:nginx
        networks:
          - my_network

      networks:
        my_network:
          driver: bridge
  • カスタムネットワークを追加し、そのネットワークにコンテナーを追加する
  • デフォルトでは、fpmからnginxコンテナーをカールする場合、localhostをカールするため、nginx構成でサーバー名と同じになるようにエイリアスを追加する必要があります
  • このソリューションを使用すると、fpmコンテナーからmyapi.dockerをカールできます

@edwardは、この解決策があなたのために働いたかどうか私に知らせます

3
Denis Kovacevic

ドッカーのドキュメントから、

https://docs.docker.com/compose/networking/

Dockerネットワーク内からホスト名としてサービス名(この場合はnginx)を使用できるはずです。したがって、私のFPMコンテナーをbashしてcurl nginxを呼び出すと、Dockerが解決します。お役に立てれば。

1
zstate

クイックフィックスは、Dockerによって生成された動的IPをポイントすることです。これは変更されるかもしれませんが...ええ。

ネットワークを探す:docker network ls

NETWORK ID          NAME                 DRIVER              SCOPE
72fef1ce7a50        apiwip_default       bridge              local <-- here
cdf9d5b885f6        bridge               bridge              local
2f4f1e7038fa        Host                 Host                local
a96919eea0f7        mgadmin_default      bridge              local
30386c421b70        none                 null                local
5457b953fadc        website2_default     bridge              local
1450ebeb9856        anotherapi_default   bridge              local

ネットワークIDをコピーする

docker network inspect 72fef1ce7a50

"Containers": {
            "345026453e1390528b2bb7eac4c66160750081d78a77ac152a912f3de5fd912c": {
                "Name": "apiwip_nginx_1",
                "EndpointID": "6504a3e4714a6ba599ec882b21f956bfd1b1b7d19b8e04772abaa89c02b1a686",
                "MacAddress": "02:42:ac:14:00:05",
                "IPv4Address": "172.20.0.5/16", <-- CIDR block
                "IPv6Address": ""
            },
            "ea89d3089193825209d0e23c8105312e3df7ad1bea6b915ec9f9325dfd11736c": {
                "Name": "apiwip_fpm_1",
                "EndpointID": "dc4ecc7f0706c0586cc39dbf8a05abc9cc70784f2d44c90de2e8dbdc9148a294",
                "MacAddress": "02:42:ac:14:00:04",
                "IPv4Address": "172.20.0.4/16",
                "IPv6Address": ""
            }
        },

そのCIDRブロックのIPアドレスをextra_hostsオプションに追加します。

extra_hosts:
  - myapi.docker:172.20.0.5
0
Edward