Dockerを使用してアプリケーションをコンテナ化する場合、アプリケーションの各コンポーネントを個別のコンテナで実行するのが一般的な方法です。たとえば、ウェブサイトにウェブサーバー、アプリケーション、データベースがあり、それぞれが独自のコンテナで実行されているとします。
相互に通信するようにコンテナを構成し、ホストマシンを構成するのは難しい場合があります。このガイドでは、簡単なサンプルアプリを使用して、Dockerコンテナ通信の基本を示します。このアプリは、PostgreSQLデータベースからデータを読み取るNode.jsアプリで構成されます。
始める前に
DockerCEをインストールする
このガイドの手順に従うには、DockerCEがインストールされたLinodeが必要です。
Docker CE(Community Edition)をインストールするには、以下のいずれかのガイドの手順に従ってください。
-
UbuntuとDebianへのDockerのインストールと使用
-
CentOSとFedoraへのDockerのインストールと使用
さらに多くのLinuxディストリビューションの詳細については、Dockerの公式ドキュメントの「Dockerエンジンのインストール」セクションを参照してください。
サンプルNode.jsアプリケーション
このガイド全体で使用されるサンプルアプリは、PostgreSQLデータベースから「Helloworld」を読み取り、コンソールに出力する単純なNode.jsアプリです。このセクションでは、コンテナを使用せずにLinodeでアプリをビルドしてテストします。
PostgreSQLのインストールと構成
-
システムを更新します:
sudo apt update && sudo apt upgrade
-
PostGreSQLをインストールします:
sudo apt install postgresql postgresql-contrib
-
postgres
を変更します ユーザーのパスワード:sudo passwd postgres
-
postgres
のパスワードを設定します データベースユーザー:su - postgres psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'newpassword';"
-
サンプルアプリのデータベースを作成し、それに接続します:
createdb nodejs psql nodejs
-
データベースに「Helloworld」を追加します:
nodejs=# CREATE TABLE hello (message varchar); nodejs=# INSERT INTO hello VALUES ('Hello world'); nodejs=# \q
-
後で使用するためにデータベースのダンプを作成します:
pg_dumpall > backup.sql
-
postgres
としてサインアウトします Linuxユーザー:exit
-
データダンプをホームディレクトリにコピーします:
sudo cp /var/lib/postgresql/backup.sql ~/.
-
コンテナ(
locahost
以外のIPアドレスを持つコンテナ)からこのデータベースに接続するため )、リモートアドレスからの接続を許可するようにPostgreSQL設定ファイルを編集する必要があります。/etc/postgresql/9.5/main/postgresql.conf
を開きます テキストエディタで。listen_addresses
のコメントを解除します 行を「*」に設定します:- ファイル:/ etc / postgresql / 9.5 / main / postgresql.conf
-
postgresql
を有効にして開始します サービス:sudo systemctl enable postgresql sudo systemctl start postgresql
HelloWorldアプリを作成する
-
ノードとNPMのインストール:
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install nodejs
-
ホームディレクトリに移動して、ディレクトリを作成します。
cd mkdir app && cd app
-
テキストエディタを使用して、
app.js
を作成します 次のコンテンツを追加します:- ファイル:app .js
このアプリは
pg
を使用します 前のセクションで作成したデータベースに接続するためのNPMモジュール(node-postgres)。次に、「hello」テーブル(「Helloworld」メッセージを返す)にクエリを実行し、応答をコンソールに記録します。'newpassword'
を置き換えますpostgres
で 前のセクションで設定したデータベースユーザーのパスワード。注 pg
モジュールは、環境変数を使用してクライアント接続を構成することもできます。これは、本番アプリに推奨されるオプションです。環境変数の詳細については、node-postgresのドキュメントをご覧ください。 -
pg
をインストールします モジュール:npm install pg
-
アプリをテストする:
node app.js
データベースが正しく構成されている場合、「Helloworld」がコンソールに表示されます。
コンテナをDockerホストに接続します
このセクションでは、Node.jsアプリがDockerコンテナーから実行され、Dockerホストで実行されているデータベースに接続するユースケースを示します。
Dockerコンテナを設定する
-
ホームディレクトリに戻る:
cd
-
Node.jsアプリを実行するDockerfileを作成します:
- ファイル:Dockerfile
-
このDockerfileから構築されたイメージは、
app/
をコピーします 新しい画像へのディレクトリ。app.js
を編集します アプリがdatabase
に接続できるようにしますlocalhost
の代わりにホスト :- ファイル:app /app.js
-
Dockerfileからイメージを作成します:
docker build -t node_image .
コンテナをデータベースに接続
-
Dockerは、デフォルトのブリッジネットワークを自動的に設定します 、
docker0
からアクセス ネットワークインターフェース。ifconfig
を使用します またはip
このインターフェースを表示するには:ifconfig docker0
出力は次のようになります。
Dockerホスト(Linode)の内部IPアドレスは172.17.0.1です。docker0 Link encap:Ethernet HWaddr 02:42:1e:e8:39:54 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:1eff:fee8:3954/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3848 errors:0 dropped:0 overruns:0 frame:0 TX packets:5084 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:246416 (246.4 KB) TX bytes:94809688 (94.8 MB)
-
PostgreSQLがDockerインターフェースからの接続を受け入れることを許可します。
/etc/postgresql/9.5/main/pg_hba.conf
を開きます テキストエディタで次の行を追加します:- ファイル:/ etc / postgresql / 9.5 / main / pg_hba.conf
172.17.0.1はDockerホストのIPであるため、ホスト上のすべてのコンテナーのIPアドレスは172.17.0.0/16の範囲になります。
-
データベースを再起動します:
sudo systemctl restart postgresql
-
コンテナを起動します:
docker run -d --add-host=database:172.17.0.1 --name node_container node_image
--add-host
オプションはdatabase
を定義します ホスト。DockerホストのIPアドレスを指します。database
の宣言 アプリでIPアドレスをハードコーディングするのではなく、実行時にホストを使用すると、コンテナーを再利用可能に保つことができます。 -
コンテナ内から、
ping
を使用しますdatabase
への接続をテストします ホスト:docker exec -it node_container ping database
-
各Dockerコンテナには、172.17.0.0/16ブロック内から独自のIPアドレスも割り当てられます。
ip
を使用してこのコンテナのIPアドレスを検索します :docker exec -it node_container ip addr show eth0
Dockerホストからこのアドレスにpingを実行することで、この接続をテストできます。
-
アプリを実行します:
docker exec -it node_container node home/app.js
構成が成功すると、プログラムは以前と同じように「Helloworld」コンソール出力を表示するはずです。
2つのコンテナを接続する
このセクションでは、アプリとデータベースの両方が別々のコンテナーで実行されます。 Docker Hubの公式postgresイメージを使用して、前に作成したSQLダンプを読み込むことができます。
注意 Dockerコンテナ内に本番データベースデータを保存しないでください。コンテナは一時的なエンティティとして扱う必要があります。コンテナが予期せずクラッシュしたり再起動したりすると、データベース内のすべてのデータが失われます。
-
Node.jsコンテナを停止して削除します:
docker stop node_container docker rm node_container
-
postgres
をプルします 画像:docker pull postgres
-
backup.sql
を確認してください ファイルが現在の作業ディレクトリにある場合は、postgres
を実行します 画像:docker run -d -v `pwd`:/backup/ --name pg_container postgres
-v
オプションは、現在の作業ディレクトリを/backup/
にマウントします 新しいコンテナのディレクトリ。 -
新しいコンテナは自動的にpostgresデータベースを起動し、postgresユーザーを作成します。コンテナに入り、SQLダンプをロードします:
docker exec -it pg_container bash cd backup psql -U postgres -f backup.sql postgres exit
-
ノードイメージを再度実行します。今回は、
--add-host
の代わりに 、--link
を使用します コンテナをpg_containerに接続するオプション:docker run -d --name node_container --link=pg_container:database node_image
これにより、
pg_container
がリンクされます ホスト名database
の下 。 -
/etc/hosts
を開きます node_containerで、リンクが作成されたことを確認します:docker exec -it node_container cat /etc/hosts
次のような行があるはずです:
- ファイル:/ etc / hosts
これは、
pg_container
IPアドレス172.17.0.2に割り当てられており、ホスト名database
を介してこのコンテナにリンクされています 、予想どおり。 -
Node.jsアプリは、
database
上のPostgreSQLデータベースに接続することを引き続き期待しているため ホスト、それ以上の変更は必要ありません。以前と同じようにアプリを実行できるはずです:docker exec -it node_container node home/app.js
DockerComposeの使用
--link
を使用する または--host
コンテナを起動するたびのオプションは面倒な場合があります。サーバーまたはいずれかのコンテナがクラッシュした場合は、手動で再接続する必要があります。これは、一定の可用性を必要とするアプリケーションにとって理想的な状況ではありません。幸い、Dockerは Docker Composeを提供します 複数のコンテナを管理し、起動時に自動的にリンクします。このセクションでは、Docker Composeを使用して、前のセクションの結果を再現します。
注 Docker Composeのより包括的な説明と、 docker-compose.yml
の記述方法については 構成ファイルについては、completeDocker作成ガイドを参照してください。
-
Docker Composeをインストールします:
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
-
Dockerfileと同じディレクトリに、
docker-compose.yml
を作成します 次の内容のファイル:- ファイル:docker -compose.yml
このファイルを使用してDockerComposeを実行すると、
pg_container
が作成されます。 およびnode_container
前のセクションから。以前と同様に、データベースコンテナは公式のPostgreSQLイメージを使用しますが、アプリコンテナはDockerfileから構築されます。links
エントリは、--link
と同じ機能を果たしますrun
のオプション 以前に使用したコマンド。 -
Docker Composeでは環境値を設定することもできるため、値をハードコーディングするのではなく、アプリを単純化してこれらを使用することができます。
app.js
を編集します これらの値を削除するには:- ファイル:app .js
-
以前のコンテナを削除します:
docker rm -f node_container pg_container
-
Docker Composeを使用して、コンテナーを起動します。
docker-compose up -d
-
サンプルデータを新しいコンテナにロードします:
docker cp backup.sql pg_container:/ docker exec -it pg_container psql -U postgres -f backup.sql postgres
-
app.js
を実行します アプリコンテナから:docker exec -it node_container node home/app.js
アプリは以前と同じように実行されます。
結論
デフォルトでは、Dockerは各コンテナとDockerホストにIPアドレスを自動的に割り当てます。これらのアドレスを使用して、コンテナ間でサービスを手動で接続できます(ファイアウォールが接続を許可していることを前提としています)。
ただし、Dockerには、接続プロセスを高速化および簡素化するのに役立つ、これらの接続の便利なラッパーも多数用意されています。 Dockerホストを一意のホスト名を持つコンテナーに接続するか、2つのコンテナーを直接リンクすることができます。 Docker Composeを使用すると、docker-compose.yml
で接続を宣言できるため、このプロセスをさらに簡素化できます。 コンテナが持ち上がったときに自動的に確立されるようにファイルします。
このガイドでカバーされていない他の接続オプションがあります。たとえば、--net="host"
を使用してコンテナを実行できます 、そのコンテナのネットワークスタックをDockerホストと共有します:localhost
コンテナ上でlocalhost
を指します Dockerホスト上。各Dockerコンテナのポートを公開したり、柔軟性を高めるためにデフォルトのブリッジネットワークを構成したりすることもできます。これらのオプションの詳細については、以下の「詳細情報」セクションのリンクを参照してください。
詳細情報
このトピックの詳細については、次のリソースを参照してください。これらは有用であることを期待して提供されていますが、外部でホストされている資料の正確性や適時性を保証することはできません。
- Docker:コンテナ通信を理解する
- コンテナのリンク
- コンテナの接続