ポートマッピングによる外部からのアクセス
デフォルトでは、起動されたコンテナ内のアプリケーションはホストから直接アクセスできません。外部からネットワークリソースに接続するには、-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つの方法でリンク情報を提供します:
- 環境変数:接続先コンテナの情報を含む環境変数が自動生成されます(例:
DB_PORT,DB_HOST) - /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)に解決されるはずです。