読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Docker

学習記録 Docker

第2章 Dockerの利用方法

(基本的な使い方の部分は省略)

複数コンテナの連携活用

ここでは,複数のコンテナを連携したアプリケーションを構築する方法を説明する。
例として,MySQLとnode.jsを別々のコンテナで実行して,MySQLをnode.jsのバックエンドDBとする環境を構築する。

コンテナ内のアプリケーションに外部から接続する際には,ポートフォワーディングの設定を用いて,ホストLinuxが受信したパケットをコンテナ内に転送するようにしてきた。

// ホストの8000番ポートとコンテナの80番ポートを接続
# docker run -itd -p 8000:80 rails01 rails:ver1.0

一方,同一のホストLinux上で稼働するコンテナ同士で通信する場合,ホストLinux上のコンテナ同士は仮想ブリッジを経由して直接通信することができる。
ただし,通信先のコンテナ内の仮想NICが持つIPアドレスを指定して接続する必要がある。このIPアドレスはコンテナの起動時に割当てられるため,この部分は少し工夫が必要となる。
ここでは,DockerfileのEXPOSE命令とrunコマンドの--linkオプションを組み合わせた手法を紹介する。
また,場合によっては,異なるホスト上のコンテナ同士を連携する必要も出てくる。この場合も,コンテナイメージの作り方を工夫することで対応できる。このような例についても併せて紹介する。

同一ホスト上でのコンテナ連携

まずは,バックエンドのDBとなるMySQLのコンテナを生成する。その際,Dockerfile中で「EXPOSE 3306」を記述し,ポート3306番を公開する。これはMySQLが接続を受け付けるポート番号で,同じサーバ上の他のコンテナから直接アクセスするために必要な指定になる。

続いて,node.jsで動作するアプリケーションのコンテナを用意する。
その際,起動時に--linkオプションでMySQLのコンテナ名を指定する。

# docker run -itd -p 8000:80 --link mysql01:db --name ap01 shorturl:ver1.0

このオプションは,既に起動しているmysql01というコンテナに対してdbというエイリアス名を付け,起動するコンテナ内に次の環境変数をセットアップする。

これらの環境変数をアプリケーションで使用することで,アプリケーション上でDBコンテナへの接続指定が可能となる。

異なるホスト間でのコンテナ連携

先ほどと同様MySQLとnode.jsの組み合わせで,MySQLのコンテナのみセキュリティを考慮してファイアウォールの背後にある別のホストで稼働させる場合を考える。
この場合,node.jsのコンテナからMySQLのコンテナへは,通常の外部ネットワークを経由して接続することになるので,MySQLコンテナが稼働するホストLinuxIPアドレスと,コンテナ起動時に指定したポートフォワーディングのポート番号を指定してアクセスすることになる。
先ほどと同じように,DB_PORT_3306_TCP_ADDR/PORTという環境変数を使用している場合,コンテナの起動時にこの環境変数を設定する必要がある。

# docker run -itd -p 8000:80 --name ap01 \
  -e DB_PORT_3306_TCP_ADDR=<MySQLコンテナのホストLinuxのIPアドレス> \
  -e DB_PORT_3306_TCP_PORT=<MySQLコンテナのポートフォワードされたポート番号> \
  shorturl:ver1.0