container間の接続の確立
27739 ワード
Dockerの使用章では、network port接続を介してDocker containerで実行されるサービスについて説明します.しかし、ポート接続はDocker containerで実行されるサービスまたはアプリケーションとインタラクティブな方法にすぎません.このセクションでは、network port接続を確立する方法に簡単に返信し、container linkingという別のアクセス方法について説明します.
Network portマッピングレビュー
Dockerで章を使用して、Python Flaskアプリケーションを実行するためのcontainerを作成しました.
コンテナが作成されると、−Pは、ネットワークポートをホストの49153〜65535の間の任意のポートに自動的にマッピングするために使用される.次にdocker psを実行します
-pラベルを使用して構成する他の方法があります.デフォルトでは、-pラベルは、ホスト上のすべてのインタフェースに特定のポートをバインドします.しかし、localhostにのみバインドするなど、特定のインタフェースを指定することもできます.
または、コンテナの5000ポートをlocalhostに動的にバインドします.
これは、指定したポートの構成を表示するのに役立ちます.たとえば、コンテナのポートをホストのlocalhostにバインドしている場合.ではdocker portはこの結果を出力します.
Docker Container Linking
ネットワークポートのマッピングは、1つのcontainerを別のcontainerにアクセスさせる唯一の方法ではありません.Dockerにはlinking systemもあり、複数のcontainerを接続し、互いに接続情報を送信することができます.containerが接続されると、ソースcontainerに関する情報が受信containerに送信される.これは、受信情報がソースcontainerを見ることができる情報である.
Container naming
接続を確立するために、DockerはContainerの名前に依存します.各コンテナに自動的に作成された名前が表示されます.このContainerの名前を自分で命名することもできます.このコマンドには、次の2つの機能があります.このContainerの特定の機能を名前で表す方法で、覚えやすくします.たとえば、wenアプリケーションを含むContainerをwebと命名します. では、他のコンテナを簡単にインデックスできるようにDockerのリファレンスポイントが用意されています.たとえば、webコンテナをdbコンテナに接続するように指定できます.
--nameラベルを使用してコンテナの名前を付けることができます.たとえば、次のようにします.
Container Linking
接続はContainerにお互いを発見させ、安全に情報を伝送させる.接続を確立すると、ソースContainerと受信Containerの間にカテーテルを確立することができます.この受信者は、選択されたソースに関するデータにアクセスすることができる.接続を作成するには、--linkラベルを使用します.まず、データベースを含むコンテナを作成します.
Web Containerを削除して、代わりにlinked Containerを作成する必要があります.
これにより、以前に作成したdb Containerに新しいweb Containerが接続されます.この--linkラベルの形成:
別名がなぜ名前が縮小したのかが表示されます.
次に、接続されているContainerを確認し、docker inspectを使用します.
では、2つの接続のContainerは何をしましたか?接続時にソースContainerから受信Containerに情報が提供されます.我々の例では、受信者webは、ソース側dbに関する情報にアクセスすることができる.これを実現するために、dockerはコンテナ間に安全なチャネルを作成し、ポートを外部に露出する必要はありません.db Containerを起動するときは、-Pまたは-pラベルは使用されません.これが接続のメリットです.私はネットワークに私たちのソースContainerを暴露する必要はありません.ここでPostgreSQLデータベースです.
Dockerはソースコンテナの接続情報を受信コンテナに暴露し、2つの方法がある.環境変数 更新/etc/hostsファイル かんきょうへんすう
2つのコンテナが接続されている場合、Dockerはターゲットコンテナに環境変数を設定し、ソースコンテナの情報をプログラム化する必要があります.
まず、Dockerは_を設定します.NAME環境変数は、各ターゲットコンテナの別名を指定し、--linkパラメータで使用します.では、例えば、新しいコンテナをwebと呼び、データベースコンテナdbと接続し、db:webdbを介してwebコンテナでWEB BdB_NAME=/web/webdb.
Dockerはまた、各ソースコンテナが露出するポートとして定義し、一連の環境変数を定義することもできる.スタイルは次のとおりです. _PORT__このポートにURLをインデックスします.は、--linkパラメータで指定された別名(例えばwebdb)、露出されたポート番号、TCPまたはUDPです.URLの形式は以下の通りです://:(例えばtcp://172.17.0.82:8080).このURLは使いやすいように3つの環境変数に分けられる: _PORT___ADDRは、URLのIPアドレス(例えば、WEB BD_PORT_8080_TCP_ADDR=172.17.0.82)を含む. ._PORT_PORTは、URLポート番号(例えば、WEB BD_PORT_80_TCP_PORT=8080)を含む. ._PORT_PRPTOは、URLプロトコル(例えば、WEB BD_PORT_80_TCP_PROTO=tcp)を含む. .
複数のポートが露出している場合、上記の環境変数の設定は各ポートに設定されます.
最後に、_PORTと呼ばれる環境変数は、最初のソースコンテナが露出したURLを含む.例えば、WEBD_PORT=tcp://172.17.0.82:8080.この例では、「first」は、露出された最小ポート番号として定義されます.ポートがtcpおよびudpに使用される場合、tcpポートが指定されます.
私たちのデータベースの例に戻ると、envコマンドを実行して指定したコンテナ環境変数を羅列できます.
Similarly, some daemons (such as
) will scrub them when spawning shells for connection.
注意:/etc/hostsファイルのhostエントリとは異なり、IPアドレスは環境変数に格納されており、ソースContainerが再起動した場合は自動的に更新できません.したがって、/etc/hosts/のhostエントリを使用して接続されたコンテナ間のIP問題を解決することをお勧めします.
dbコンテナに関する有用な情報を作成する環境変数が表示されます.各環境変数には、指定した別名に由来する接頭辞DB_が付きます.aliasがdb 1の場合、変数はDB 1_を接頭辞とします.これらの環境変数を使用して構成されたアプリケーションを使用して、dbコンテナ上のデータベースに接続できます.この接続は安全でプライベートです.接続されたWeb容量のみ器はdbコンテナと通信できる.
/etc/hostsファイルの更新
環境変数に加えて、Dockerはソースコンテナ、/etc/hostsファイルにhost entityを追加できます.これはwebコンテナのディレクトリです.
ここではpingコマンドを使用してdbコンテナをpingし、そのhostディレクトリを使用して172.17.0.5に解析します.このhostエントリを使用してアプリケーションを構成し、dbコンテナを使用することができます.
注意:複数の受信コンテナを単一のソースに接続できます.たとえば、dbコンテナに複数の異なる名前のwebコンテナを接続できます.
ソースコンテナを再起動すると、接続されたコンテナ/etc/hostsファイルが自動的に新しいソースコンテナのIPアドレスに更新され、通信を継続します.
Network portマッピングレビュー
Dockerで章を使用して、Python Flaskアプリケーションを実行するためのcontainerを作成しました.
$ sudo docker run -d -P training/webapp python app.py
注:containersには内部ネットワークとIPアドレスがあります(docker inspectコマンドを使用してcontainerのIPアドレスを表示します).Dockerには異なるネットワーク構成があります.ここでネットワーク構成を確認できます.コンテナが作成されると、−Pは、ネットワークポートをホストの49153〜65535の間の任意のポートに自動的にマッピングするために使用される.次にdocker psを実行します
$ sudo docker ps nostalgic_morse
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
-pラベルを使用して、containerポートにバインドされているホストポートを指定することもできます.$ sudo docker run -d -p 5000:5000 training/webapp python app.py
これは良いアイデアではありません.これは、この特定のポートに1つのコンテナしか指定できないことを制約しているからです.-pラベルを使用して構成する他の方法があります.デフォルトでは、-pラベルは、ホスト上のすべてのインタフェースに特定のポートをバインドします.しかし、localhostにのみバインドするなど、特定のインタフェースを指定することもできます.
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
これはcontainerの内部5000ポートをホスト上のインタフェースlocalhostまたは127.0にバインドする.0.1のインタフェースの5000ポート.または、コンテナの5000ポートをlocalhostに動的にバインドします.
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker portショートカットを使用して、現在バインドされているポートをクエリーできます.これは、指定したポートの構成を表示するのに役立ちます.たとえば、コンテナのポートをホストのlocalhostにバインドしている場合.ではdocker portはこの結果を出力します.
$ sudo docker port nostalgic_morse 5000
127.0.0.1:49155
注:-pラベルは、複数のポートを構成するために複数回使用できます.Docker Container Linking
ネットワークポートのマッピングは、1つのcontainerを別のcontainerにアクセスさせる唯一の方法ではありません.Dockerにはlinking systemもあり、複数のcontainerを接続し、互いに接続情報を送信することができます.containerが接続されると、ソースcontainerに関する情報が受信containerに送信される.これは、受信情報がソースcontainerを見ることができる情報である.
Container naming
接続を確立するために、DockerはContainerの名前に依存します.各コンテナに自動的に作成された名前が表示されます.このContainerの名前を自分で命名することもできます.このコマンドには、次の2つの機能があります.
--nameラベルを使用してコンテナの名前を付けることができます.たとえば、次のようにします.
$ sudo docker run -d -P --name web training/webapp python app.py
はContainerを起動し、--nameというコンテナをwebと名付けた.docker psコマンドを使用して、このコンテナの名前を表示できます.$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
はdocker inspectを使用してContainerの名前を返すことができる.$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web
注:Containerの名前はユニークでなければなりません.では、WebとしてContainerという名前しか付けられません.コンテナ名を再使用する場合は、同じ名前の新しいContainerを作成するには、元のContainer(docker rm)を削除する必要があります.代替案としてdocker runコマンドで--rmラベルを使用します.これはContainerが停止した直後に削除されます.Container Linking
接続はContainerにお互いを発見させ、安全に情報を伝送させる.接続を確立すると、ソースContainerと受信Containerの間にカテーテルを確立することができます.この受信者は、選択されたソースに関するデータにアクセスすることができる.接続を作成するには、--linkラベルを使用します.まず、データベースを含むコンテナを作成します.
$ sudo docker run -d --name db training/postgres
は、PostgreSQLデータベースを含むtraining/postgresイメージからのdbという新しいContainerを作成しました.Web Containerを削除して、代わりにlinked Containerを作成する必要があります.
$ sudo docker rm -f web
で、db Containerに接続されたWeb Containerが作成されます.$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
これにより、以前に作成したdb Containerに新しいweb Containerが接続されます.この--linkラベルの形成:
--link <name or id>:alias
nameはContainerに接続したい名前で、aliasはlinkの名前の別名です.別名がなぜ名前が縮小したのかが表示されます.
次に、接続されているContainerを確認し、docker inspectを使用します.
$ sudo docker inspect -f "{{ .HostConfig.Links }}" web
[/db:/web/db]
Web Containerがdb ContainerとWeb/dbの接続を確立していることがわかります.これにより、web ContainerがdbContainerの情報にアクセスできるようになります.では、2つの接続のContainerは何をしましたか?接続時にソースContainerから受信Containerに情報が提供されます.我々の例では、受信者webは、ソース側dbに関する情報にアクセスすることができる.これを実現するために、dockerはコンテナ間に安全なチャネルを作成し、ポートを外部に露出する必要はありません.db Containerを起動するときは、-Pまたは-pラベルは使用されません.これが接続のメリットです.私はネットワークに私たちのソースContainerを暴露する必要はありません.ここでPostgreSQLデータベースです.
Dockerはソースコンテナの接続情報を受信コンテナに暴露し、2つの方法がある.
2つのコンテナが接続されている場合、Dockerはターゲットコンテナに環境変数を設定し、ソースコンテナの情報をプログラム化する必要があります.
まず、Dockerは_を設定します.NAME環境変数は、各ターゲットコンテナの別名を指定し、--linkパラメータで使用します.では、例えば、新しいコンテナをwebと呼び、データベースコンテナdbと接続し、db:webdbを介してwebコンテナでWEB BdB_NAME=/web/webdb.
Dockerはまた、各ソースコンテナが露出するポートとして定義し、一連の環境変数を定義することもできる.スタイルは次のとおりです.
複数のポートが露出している場合、上記の環境変数の設定は各ポートに設定されます.
最後に、_PORTと呼ばれる環境変数は、最初のソースコンテナが露出したURLを含む.例えば、WEBD_PORT=tcp://172.17.0.82:8080.この例では、「first」は、露出された最小ポート番号として定義されます.ポートがtcpおよびudpに使用される場合、tcpポートが指定されます.
私たちのデータベースの例に戻ると、envコマンドを実行して指定したコンテナ環境変数を羅列できます.
$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_PROTO=tcp
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
. . .
注意:これらの環境変数は、Containerに構成された最初のプロセスにすぎません.Similarly, some daemons (such as
sshd
) will scrub them when spawning shells for connection.
注意:/etc/hostsファイルのhostエントリとは異なり、IPアドレスは環境変数に格納されており、ソースContainerが再起動した場合は自動的に更新できません.したがって、/etc/hosts/のhostエントリを使用して接続されたコンテナ間のIP問題を解決することをお勧めします.
dbコンテナに関する有用な情報を作成する環境変数が表示されます.各環境変数には、指定した別名に由来する接頭辞DB_が付きます.aliasがdb 1の場合、変数はDB 1_を接頭辞とします.これらの環境変数を使用して構成されたアプリケーションを使用して、dbコンテナ上のデータベースに接続できます.この接続は安全でプライベートです.接続されたWeb容量のみ器はdbコンテナと通信できる.
/etc/hostsファイルの更新
環境変数に加えて、Dockerはソースコンテナ、/etc/hostsファイルにhost entityを追加できます.これはwebコンテナのディレクトリです.
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
172.17.0.5 db
には、2つの関連するhostディレクトリが表示されます.1つ目のディレクトリは、WebコンテナがContainer IDをホスト名として使用します.2つ目のディレクトリは、接続別名を使用してdbコンテナのIPアドレスにインデックスされます.pingというホスト名を使用できます.root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
注意:この例では、初期の容器にこれが含まれていないため、pingをインストールする必要があります.ここではpingコマンドを使用してdbコンテナをpingし、そのhostディレクトリを使用して172.17.0.5に解析します.このhostエントリを使用してアプリケーションを構成し、dbコンテナを使用することができます.
注意:複数の受信コンテナを単一のソースに接続できます.たとえば、dbコンテナに複数の異なる名前のwebコンテナを接続できます.
ソースコンテナを再起動すると、接続されたコンテナ/etc/hostsファイルが自動的に新しいソースコンテナのIPアドレスに更新され、通信を継続します.
$ sudo docker restart db
db
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
172.17.0.9 db