fbpx

Ebook連載:『5分x10回で学ぶ 開発者のためのDocker コンテナ入門』第6章–コンテナネットワークとコンテナのポートの開設 #docker #DX #Mirantis

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

コンテナ化はDXの第一歩に最適な取り組みです。本シリーズでは10回にわたってMirantis社が発行するEbook「Learn Containers 5 Minutes at a Time An introductory guide for developers」 (Eric Gregory著)を翻訳・編集し、チャプターごとにCL LABで公開しています。本稿はその第6章です。皆さまのクラウドネイティブジャーニーやアプリケーションのモダナイズの一助になれば幸いです。

  • 第1章 コンテナとは?
  • 第2章 コンテナの作成・調査・削除
  • 第3章 Dockerfile でのコンテナイメージのビルド
  • 第4章 イメージレジストリ
  • 第5章 ボリュームと永続的なストレージ
  • 第6章 コンテナネットワークとコンテナのポートの開設
  • 第7章 コンテナ化アプリの実行
  • 第8章 ユーザ定義ネットワーク上のマルチコンテナアプリケーション
  • 第9章 Docker Compose
  • 第10章 Webアプリをコンテナサービスとして構築する

 

第6章: コンテナネットワークとコンテナのポートの開設

前章では永続的なストレージをもつアプリケーションをコンテナ化し、高度なアプリケーションを構築するために不可欠な要素を学びました。この章では、アプリケーションを外部からのアクセスが可能な状態にする方法を学びましょう。

隔離していてもアクセス可能

 

コンテナは設計上、隔離を目的としたシステムですが、アプリケーションの機能を孤立させることを望んでいるわけではありません。アプリケーション同士を分離させつつも、外部のリクエストにはアクセス可能な状態にしたいです。

ここまで学んできた限りでは、コンテナ内のサービスにアクセスするには、対話式の shell セッションを起動してコンテナ内で作業する方法、または、Docker コンテナからターミナルへの出力を調査する方法がありました。しかし残念ながら、これらの方法はWebブラウザからアクセスするグラフィカルユーザーインターフェース(GUI)を持つWebアプリケーションではあまり役に立ちません。

ホストマシンに情報を送るだけでなく、アプリケーションが外の世界と交流できるようにするには、コンテナネットワークを理解する必要があります。

コンテナネットワークとは?

 

コンテナネットワークは、コンテナに一意のアドレスと情報を送受信するための経路が割り当てられるシステムです。コンテナ化されたアプリケーションは、次のような経路で通信する必要がある場合があります。

  • コンテナとコンテナ
  • コンテナとホストマシン
  • コンテナとホストマシン外からの要求

いずれの場合も基本的なコンセプトは同じです。まず Docker は各コンテナにインターネットプロトコル(IP)アドレスを割り当てます。コンテナのIPアドレスを確認するには、次のコマンドを使用します。

% docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

inspect コマンドで、JavaScript Object Notation(JSON)配列に格納してあるコンテナインスタンスに関する情報を Docker に問い合わせます。--format の引数 は、取得したい特定の詳細情報、今回は IP アドレスを指定しています。デフォルトでは、Docker は172.17.0...で始まるアドレスの範囲を使用しています。実行中のコンテナに inspect を実行すると、次のようなアドレスが出力されるはずです。

172.17.0.2

コンテナのIPアドレスは、ローカルサブネット上に作成されます。つまり初期状態では、割り当てられたIPアドレスは同じホスト上のコンテナ同士にしか通用しません。少なくともそのアドレスを使用して、他のマシンやホストマシンからアクセスすることはできません。

docker network ls コマンドを使えば、Docker のネットワーク環境を上位階層で見ることができます。出力は次のようになるはずです。

NETWORK ID NAME DRIVER SCOPE<br />099f55813274 bridge bridge locale9c31cf63c20 host host localeb6d55a56ee3 none null local

出力には複数のネットワークが表示されます。host ネットワークと none ネットワークは Docker ネットワークスタックの一部です。Docker を実行するための装置ですが、私たちが直接操作することはありません。しかし bridge ネットワークは操作可能です。これはコンテナ IP アドレスがデフォルトで配置されているコンテナネットワークです。時として docker0 bridge(訳注:ドッカーゼロブリッジ) と呼ばれます。 bridge ネットワークは設定可能で、bridge ネットワークは設定可能でアプリケーションが存在する、我々の目的にとって最も重要なネットワークです。

「ちょっと待って!自分のコンテナネットワークの作り方を教えてほしい!」という方へ

 

Docker は、docker network create コマンドを使用して、さまざまなユースケースに対応した高度な設定が可能なネットワークを作成することができます。実際、ユーザ定義のネットワークは必要不可欠なツールです。デフォルトの bridge ネットワークは、ドメインネームシステム(DNS)サービスの検出が無効です。つまり、このネットワーク上のコンテナは、名前ではなく、特定のIPアドレスで互いに通信する必要があります。これはスケーラビリティに大きな影響を与えます。この章での演習は、デフォルトの brige に留めますが、ユーザー定義のネットワークは、マルチコンテナアプリケーションの接続に適した方法であり、8章ではその方法を学びます。

コンテナ内で稼働する Web サービスは、コンテナ内の特定のポートを介して情報を送受信します。このポートは、ちょうど港のように、船旅の始まりと終わりの場所です。ポートは、IPアドレスのコロンの後に付けられた一連の数字で定義されます。次の表記は、特定のIPアドレスの8000番ポートを表しています。

172.17.0.2:8000

実際に調査してみましょう。

演習: ポートマッピング

 

Docker Hub の NGINX ウェブサーバー用 Official Image を基に、新しいコンテナを作成してみましょう。

% docker run --name nginx-test -d nginx

-d の引数は、コンテナを「デタッチドモード」で実行していることを示しています。プロセスはターミナルセッションから切り離され、バックグラウンドで実行しています。これを確認するには、次のコマンドを実行します。

% docker container ls

上記のコマンドの出力は次のようになるはずです。

CONTAINER ID  IMAGE ... PORTS  NAMES<br />nginx ... 80/tcp nginx-test

NGINX はコンテナ内の80番ポートで実行していることに注意しましょう。アプリケーションをホストマシンの80番ポートで実行している場合、ウェブブラウザで localhost:80 にアクセスできます。早速、試してみましょう。

上記のような結果が出力されたはずです。では、コンテナのIPアドレスを調べて、アクセスしてみましょう。

% docker container inspect --format '{{ .NetworkSettings.IPAddress }}' nginx-test 172.17.0.2

ブラウザはそのアドレスを読み込もうとしますが、上記のような出力になるでしょう。

バックグラウンドで実行中のコンテナを停止し、コンテナを削除して、最初からやり直してみましょう。

% docker stop nginx-test<br />% docker rm nginx-test

何が問題なのでしょうか。

コンテナのネットワークアドレスがホストマシンから分離されているため、ポートにアクセスすることができません。これは、ポートを "公開 "することで解決できます。この機能は「ポートマッピング」や「ポートバインディング」と呼ばれます。仮想マシンが仮想ポートを通じて外部ネットワークに接続する方法をご存知の方はお分かりになると思いますが、同じような考え方がここでも使われています。

コンテナのポートをホストマシン上のポートに接続することで、NGINX コンテナをホストマシンからアクセスできるようにします。Docker には様々なオプションがありますが、ここではシンプルに、ホストマシンの8000番ポートと nginx-test コンテナの80番ポートを接続します。

% docker run --name nginx-test -d -p 8000:80 nginx

-p の引数は、ホストマシンのポートであるコロンの左側にある8000を使用して、コンテナのポートであるコロンの右側にある 80 にアクセスすることを指定しています。このコマンド文は、コンテナ内でボリュームとディレクトリを接続する方法と少し似ています。

上記のコマンドを実行した後、localhost:8000 をブラウザーで開いて、アクセスできるかどうかテストしてみましょう。

成功しました。これで、ホストマシン上でコンテナ化されたアプリケーションにアクセスできるようになりました。適切な設定を行えば、アプリケーションを外部に提供することができます。ただし、アプリケーションを本番環境にデプロイするには、コンテナオーケストレーションのようなシステムを使用することになるでしょう。オーケストレーションシステムについては、最終章で詳しく説明します。

最後に、この章で作成したコンテナを停止し削除してください。

% docker stop nginx-test<br />% docker rm nginx-test

次章では、これまで学んだことを組み合わせて、永続的なボリュームと公開ポートを持つもう少し複雑なWebアプリケーションを実行することにします。

 

 

 

※Docker Enterprise事業は2019年11月14日にMirantis社によって買収されました。
当時のDocker Enterprise製品は、現在は下記のように名称変更されています。

Mirantis製品に関するお問い合わせはこちら

Mirantisについて
Mirantisは、Fortune 1000 企業の 2/3 以上にコンテナやマルチクラウドの導入を加速させ、データセンター運用のストレスを取り除く支援をしています。日本では、クリエーションラインと提携し、Kubernetes、OpenStack、その他のオープンクラウドテクノロジーを、現地語でのサポートやサービスとともに提供しています。Mirantis Kubernetes Engine(旧Docker Enterprise)および関連製品を含む、深い技術的専門知識とベンダーにとらわれない柔軟なプラットフォームが、お客様から選ばれています。
詳細は www.mirantis.com でご確認ください。

新規CTA