もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

別々のdocker-composeで作成したコンテナに接続する

はじめに

こんばんは。

ちょっとした小ネタといういうか、調べた事があったのでブログに書き残しておきます。

現在携わっている案件では、docker-composeを使用して、ローカル開発環境(LAMP + KVS)コンテナ群を立ち上げて開発をしています。

そして、それとは別に、別のタスク(FW完全リプレイス案件)も降ってきています。

FW自体がガラッと変わるタスクなので、そもそもレポジトリ自体を分けています。

今までは、検証環境用のテストDB(RDB)にVPN経由で接続して、ビルトインサーバーを立ち上げてリプレイス案件は対応していました。

ただ、もうそれめんどくさいなと思って、ローカル環境作ることにしたのですが、DatabaseとKVS(Redis)は、既存の旧docker開発環境のものを共有して使いたいと思いました。

表側のFWの構成のみ変わるので、インフラ層は変わらないからです。

なんかそんなのないかなーと探していると、

このあたりのやつを使えば行けそうな気がしたので、やってみました。

やってみた

現状立ち上がっている旧docker開発環境のAPサーバと同じネットワークにする事が必要なので、現状立ち上がっているdockerコンテナのネットワーク設定を調べられるものがないかを探してみました。

http://docs.docker.jp/engine/reference/commandline/network_ls.html#network-ls

なんかそれっぽいのがあったので実行してみます。

$ docker network ls
NETWORK ID          NAME                      DRIVER              SCOPE
aaaaaaaaaaaa        bridge                    bridge              local
bbbbbbbbbbbb        host                      host                local
cccccccccccc        none                      null                local
dddddddddddd        xxxxxxx_default           bridge              local

出てきました。

一覧の一番下に、共有したい対象の旧docker開発環境のAPサーバの名前がありました。 _defaultっていうsuffixが付いてるのは、なんでだろうと調べてると、なんかそれっぽい一文を見つけました。

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

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

When you run docker-compose up, the following happens:

  1. A network called myapp_default is created.
  2. A container is created using web’s configuration. It joins the network myapp_default under the name web.
  3. A container is created using db’s configuration. It joins the network myapp_default under the name db.

Let's Google翻訳

docker-composeを実行すると、次のようになります。

myapp_defaultというネットワークが作成されます。 コンテナは、Webの構成を使用して作成されます。これは、webという名前でmyapp_defaultというネットワークに参加します。 コンテナは、dbの構成を使用して作成されます。 myapp_defaultという名前のネットワークにdbという名前で参加します。

特に指定しないと、_defaultのsuffixがつくみたいです。たぶん。

というわけで作ってみました。

version: '3'

services:
  replace_app:
    tty: true
    container_name: replace_container
    build:
      context: ./docker_files/
      dockerfile: ./Dockerfile
      args:
        - ENVIRONMENT=local
    ports:
      - 5260:80
    volumes:
      - ./:/var/www/project:cached
    networks:
      - xxxxxxx_default

networks:
  xxxxxxx_default:
    external: true

networksで、対象のコンテナのネットワーク名を指定して、トップレベルのnetworksキーで対象のネットワークの定義をしています。

externalをtrueにすることで、外へのアクセスが可能になり、dockerが別でネットワークの作成をすることがなくなります。

これで、実際に新コンテナから、旧コンテナ群のmysqlに接続することが出来ました。

終わりに

ネットワーク系は全く知識ないんですが、ドキュメント見ればなんとかなりますね。

ローカルで使用するだけのコンテナだから、おかしかったら捨てりゃいいので、心理的ストレスもなくよかったです。

すごいなーと思ってたら、全く同じことをしていた人がいて、世の中狭いなとなりました。

おやすみなさい。