Dockerネットワーク機能:ポートマッピングとコンテナ間通信

ポートマッピングによる外部からのアクセス

デフォルトでは、起動されたコンテナ内のアプリケーションはホストから直接アクセスできません。外部からネットワークリソースに接続するには、-P または -p オプションを使用してポートをマッピングします。

ランダムポートの自動割り当て(-P)

-P を指定すると、Docker がホスト側の空いているポートを自動的に選択し、コンテナ内のサービスポートにマップします。

$ docker run -d -P training/webapp python app.py

明示的なポートマッピング(-p)

-p を使用して特定のホストポートを指定できます。構文は以下の通りです:

  • hostPort:containerPort — ホストの指定ポートをコンテナポートにマッピング
  • ip:hostPort:containerPort — 特定のインターフェースアドレスにマッピング
  • ip::containerPort — 特定アドレスのランダムポートをコンテナポートにマッピング

例:ホストの5000番ポートをコンテナの5000番ポートにマッピング

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

複数のポートを同時にマッピングすることも可能:

$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

UDPポートのマッピング

UDPプロトコル用のポートマッピングも可能です:

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

マッピング状況の確認

docker port コマンドで現在のポートマッピング情報を確認できます:

$ docker port web_container

コンテナ間通信:リンク機能

コンテナ間の安全な通信は、--link オプションによって実現されます。これにより、ソースコンテナとターゲットコンテナ間に専用のネットワークトンネルが作成され、環境変数やホスト名解決を通じて相互参照が可能になります。

コンテナ名の設定

コンテナに意味のある名前を付けることで、リンク操作が容易になります。--name オプションで名前を指定:

$ sudo docker run -d -P --name web training/webapp python app.py

コンテナのリンク設定

データベースコンテナを別途起動し、ウェブコンテナとリンクします:

$ sudo docker run -d --name db training/postgres
$ sudo docker rm -f web
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

--link source:alias の形式で、接続元コンテナとエイリアス名を指定します。

リンクによる情報公開方法

Dockerは以下2つの方法でリンク情報を提供します:

  1. 環境変数:接続先コンテナの情報を含む環境変数が自動生成されます(例:DB_PORT, DB_HOST
  2. /etc/hostsファイルの更新:リンク先コンテナのホスト名が /etc/hosts に追加され、名前解決が可能になります

環境変数の確認:

$ docker run --rm --name web2 --link db:db training/webapp env

ホスト名解決の確認:

$ docker run -t -i --rm --link db:db training/webapp /bin/bash

このコマンドでシェルにアクセスし、ping db を実行することで、コンテナ間通信が成功しているか検証できます。結果として、db 名前が内部IPアドレス(例:172.17.0.24)に解決されるはずです。

タグ: Docker ポートマッピング コンテナリンク ネットワーク 環境変数

9月1日 13:36 投稿