1. ホーム
  2. nginx

[解決済み] Docker Networking - nginx: [emerg] ホストがアップストリームで見つかりません

2022-08-03 03:44:42

質問

最近、Docker 1.9とDocker-Compose 1.5のネットワーク機能に移行し、リンクを使用することを置き換え始めました。

これまでリンクでは、nginx が 1 つのグループ内の別のサーバーにある私の php5-fpm fastcgi サーバーに docker-compose を介して接続することに問題はなかったのです。しかし、最近 docker-compose --x-networking up を実行すると php-fpm、mongo、nginx の各コンテナが起動しますが、nginx はすぐに [emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16

しかし、phpとmongoのコンテナが動いている(nginxが終了している)状態で再度docker-composeコマンドを実行すると、nginxが起動し、それ以降は問題なく動作しています。

これは私の docker-compose.yml ファイルです。

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

これは私の default.conf をnginx用にしたものです。

server {
    listen  80;

    root /var/www/test;

    error_log /dev/stdout debug;
    access_log /dev/stdout;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        # Referencing the php service host (Docker)
        fastcgi_pass waapi_php_1:9000;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # We must reference the document_root of the external server ourselves here.
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;

        fastcgi_param HTTPS off;
    }
}

docker-composeを1回呼び出すだけでnginxを動作させるにはどうしたらよいでしょうか?

どのように解決するのですか?

後述するdepends_on機能が導入されるまでの間、回避策として"volumes_from"を使用する可能性があります。docker-composeのファイルを以下のように変更するだけです。

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
  volumes_from:
    - php

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

上記の方法の大きな注意点は、phpのボリュームがnginxに公開されることで、これは望ましいことではありません。しかし、現時点では、これは使用可能な 1 つの docker 固有の回避策です。

depend_on機能 これはおそらく未来的な回答でしょう。なぜなら、この機能はまだDockerに実装されていないからです(1.9現在)。

Dockerで導入された新しいネットワーク機能で、"depends_on"を導入する案があるそうです。しかし、同@については長い間議論が続いています。 https://github.com/docker/compose/issues/374 したがって、それが実装されれば、コンテナの起動を順序付けるためにdepends_on機能を使用することができますが、現時点では、次のいずれかに頼る必要があります。

  1. php サーバーが立ち上がるまで nginx をリトライさせる - 私はこの方法を好みます。
  2. 上記のように volums_from を使用する - 不要なコンテナにボリュームが漏れるので、私はこれを使用しないようにします。