English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Docker 容器接続

前に、dockerコンテナ内で動作するサービスにネットワークポートを通じてアクセスする方法を実装しました。

コンテナ内でネットワークアプリケーションを実行できます。これらのアプリケーションに外部からのアクセスを許可するには、 -P または -p 引数でポートマッピングを指定します。

次に、ポートを通じてDockerコンテナに接続する方法を実装します。

ネットワークポートマッピング

私たちはpythonアプリケーションのコンテナを作成しました。

w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

また、コンテナにバインドするネットワークアドレスを指定できます。例えば、バインドする 127.0.0.1。

私たちは使用します -P 引数でコンテナを作成するときに使用します。 docker ps コンテナポートが見えます。 5000 ホストポートにバインド 32768。

w3codebox@w3codebox:~$ docker ps
CONTAINER ID	IMAGE				COMMAND	...			...			PORTS	...		...	NAMES
fce072cc88ce	training/webapp		"python app.py"		...		0.0.0.0:32768->5000/tcp	grave_hopper

以下のように使用することもできます。 -p 識別子を指定してコンテナポートがホストポートにバインドされるように指定します。

この二つの方法の違いは:

  • -P :はコンテナ内ポートランダムホストにマッピングされるハイポート。

  • -p : はコンテナ内ポートがホストポートにバインドされる指定のホストポート。

w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps
CONTAINER ID		IMAGE				COMMAND				...				PORTS										NAMES
33e4523d30aa        training/webapp		"python app.py"		...		0.0.0.0:5000->5000/tcp	berserk_bartik
fce072cc88ce        training/webapp		"python app.py"		...		0.0.0.0:32768->5000/tcp	grave_hopper

また、コンテナにバインドするネットワークアドレスを指定できます。例えば、バインドする 127.0.0.1。

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
w3codebox@w3codebox:~$ docker ps
CONTAINER ID		IMAGE				COMMAND				...				PORTS											NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp		"python app.py"		...		0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp             grave_hopper

このようにして、アクセスを通じて 127.0.0.1:5001 コンテナにアクセスするための 5000 ポート。

上記の例では、デフォルトでtcpポートにバインドされています。UDPポートにバインドする場合は、ポートの後に「,」を追加でアクセスできます。 /udp

w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
w3codebox@w3codebox:~$ docker ps
CONTAINER ID       IMAGE               COMMAND           ...   PORTS                               NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp             grave_hopper

docker port コマンドは、ポートのバインド状況を簡単に確認することができます。

w3codebox@w3codebox:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Dockerコンテナの接続

ポートマッピングは、dockerを別のコンテナに接続する方法の一つに過ぎません。

dockerには、複数のコンテナを接続して共有情報を共有するための接続システムがあります。

dockerの接続は、親コンテナが子コンテナの情報を見ることができる親子関係を作成します。

コンテナの命名

コンテナを作成する際に、dockerは自動的に名前を付けます。また、以下のように使用することもできます --name 識別子を使用してコンテナに名前をつけることができます。例えば:

w3codebox@w3codebox:~$ docker run -d -P --name w3codebox training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

私たちは以下のように使用できます docker ps コマンドを使用してコンテナの名前を確認します。

w3codebox@w3codebox:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...       0.0.0.0:32769->5000/tcp   w3codebox

新しいネットワーク

まず新しいDockerネットワークを作成します。

$ docker network create -d bridge test-net

パラメータ説明:

-d:パラメータはDockerネットワークタイプを指定します。bridge、overlayがあります。

overlayネットワークタイプはSwarmモード用で、このセクションでは無視してください。

コンテナの接続

新しいtestに接続するコンテナを実行します。-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

新しいターミナルを開き、testに新しいコンテナを追加します。-net 网络:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

画像をクリックして拡大表示:

以下でpingを使用してtest1 コンテナと test2 コンテナが相互接続されました。

もしtest1、test2 コンテナ内にpingコマンドがない場合、以下のコマンドを実行してpingをインストールします(即学即用:1つのコンテナでインストールし、コンテナをイメージに提交し、新しいイメージで上記の2つのコンテナを再起動します)。

apt-get update
apt install iputils-ping

test1 コンテナに以下のコマンドを入力します:

画像をクリックして拡大表示:

同様に、test2 コンテナも成功して接続されます:

画像をクリックして拡大表示:

このように、test1 コンテナと test2 コンテナが相互接続されました。

複数のコンテナ間で相互接続が必要な場合は、Docker Composeを使用することをお勧めします。後で紹介します。

DNSの設定

ホストマシン上で以下の場所に配置するDNSを設定できます: /etc/docker/daemon.jsonファイルに以下の内容を追加してすべてのコンテナのDNSを設定します:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

設定後、コンテナのDNSは自動的に以下のように設定されます 114.114.114.114 を使用します。 8.8.8.8。

設定が完了したら、dockerを再起動する必要があります。

コンテナのDNSが有効かどうかを確認するには以下のコマンドを使用できます。それはコンテナのDNS情報を出力します:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf

画像をクリックして拡大表示:

コンテナの設定を手動で指定する

指定のコンテナにDNSを設定するだけなら、以下のコマンドを使用できます:

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

パラメータ説明:

--rm:コンテナが終了した際にコンテナ内のファイルシステムを自動的にクリーンアップします。

-h HOSTNAME または --hostname=HOSTNAME:コンテナのホスト名を設定します。設定されたホスト名はコンテナ内の /etc/hostname および /etc/hosts に追加します。

--dns=IP_ADDRESS:DNS サーバーをコンテナの /etc/resolv.conf 内で、コンテナがこのサーバーを使用してすべての不在 /etc/hosts 内のホスト名。

--dns-search=DOMAIN:コンテナの検索ドメインを設定します。検索ドメインが .example.com に設定されている場合、ホスト名 host を検索する際には、host.example.com も検索されます。

画像をクリックして拡大表示:

もしコンテナの起動時に指定されていない場合 --dns を使用します。 --dns-search、Docker はデフォルトでホストマシンの /etc/resolv.conf を使用してコンテナの DNS を設定します。