Help us understand the problem. What is going on with this article?

docker-compose で別の docker-compose.yml で作ったコンテナとリンクする (ネットワークを繋げる)

More than 3 years have passed since last update.

バーチャルホストのように、1つのサーバーに複数のWebアプリを置いておきたい場合があります。
その際に、nginxと各アプリにはそれぞれの docker-compose.yml を作って別々に管理したいと思います。

  • nginx (リバースプロキシ)
    • Webアプリ1 (PHP http)
    • Webアプリ2 (Python uWSGI)
    • ...

この場合に、 nginx から Webアプリ1Webアプリ2 にリンクするように作りたいのですが、
docker-compose で作ったコンテナはネットワークが分かれている?ので、
ネットワークを指定してあげないといけないみたいです。

方法

  • 方法1: nginxから、各ネットワークに入るように設定する
    • メリット
      • 各アプリのdocker-compose.ymlでネットワークの定義を書かなくて良い
    • デメリット
      • アプリが増えるとnginxのdocker-compose.ymlに書く設定が増える
      • アプリの追加と削除時に毎回docker-compose.ymlを変更する必要がある
      • 各アプリのネットワーク名が変わった場合は、nginxのdocker-compose.ymlを直す必要がある(プロジェクト名が変わった時など)
  • 方法2: 共通リンク用のネットワークを作成して、nginxと各アプリでそのネットワークに入るように設定する
    • メリット
      • アプリの追加と削除時にdocker-compose.ymlを変更する必要がない
    • デメリット
      • ネットワークを1個作っておく必要がある
      • 各アプリのdocker-compose.ymlにネットワークの設定を書く必要がある

方法1: nginxから、各ネットワークに入るように設定する

nginxのdocker-compose.ymlにネットワークの設定を書きます。

nginx

version: '2'
services:
    nginx:
        image: nginx:latest
        container_name: nginx
        ports:
            - '80:80'
            - '443:443'
        volumes:
            - ./volumes/conf.d:/etc/nginx/conf.d
            - ./volumes/certs:/etc/nginx/certs
        networks:
            - default
            - webapp1_default
            - webapp2_default
networks:
    webapp1_default:
        external: true
    webapp2_default:
        external: true

このように、2箇所に networks の定義を追加してあげると、そのネットワークを見れるようになります。

ネットワーク名の調べ方

docker network ls

docker network ls を使用すると、現在 docker に存在するネットワークの一覧が出てきます。

$ docker network ls
NETWORK ID          NAME                   DRIVER
xxxxxxxxxxxx        bridge                 bridge              
xxxxxxxxxxxx        host                   host                
xxxxxxxxxxxx        nginx_default          bridge              
xxxxxxxxxxxx        webapp1_default        bridge              
xxxxxxxxxxxx        webapp2_default        bridge              

docker-compose up -d

docker-compose up -d を実行した時にも出てきます。

$ docker-compose up -d
Creating network "webapp1_default" with the default driver
Creating webapp1

方法2: 共通リンク用のネットワークを作成して、nginxと各アプリでそのネットワークに入るように設定する

まず、共通で使うネットワークを作成します。
名前はとりあえず、 common_link で作ります。
参考: http://docs.docker.jp/engine/userguide/networking/dockernetworks.html#id3

docker network create --driver bridge common_link

作成したら、 docker network ls で確認出来ます。

$ docker network ls
NETWORK ID          NAME                   DRIVER
...
xxxxxxxxxxxx        common_link            bridge              
...

次に、nginxと各アプリのdocker-compose.ymlにネットワークの設定を書きます。

アプリ1

version: '2'
services:
    webapp1:
        〜色々な設定省略〜
        networks:
            - common_link
networks:
    common_link:
        external: true

nginx

version: '2'
services:
    nginx:
        image: nginx:latest
        container_name: nginx
        ports:
            - '80:80'
            - '443:443'
        volumes:
            - ./volumes/conf.d:/etc/nginx/conf.d
            - ./volumes/certs:/etc/nginx/certs
        networks:
            - common_link
networks:
    common_link:
        external: true

networks の設定を書けばOKです。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away