container間の接続の確立

27739 ワード

Dockerの使用章では、network port接続を介してDocker containerで実行されるサービスについて説明します.しかし、ポート接続はDocker containerで実行されるサービスまたはアプリケーションとインタラクティブな方法にすぎません.このセクションでは、network port接続を確立する方法に簡単に返信し、container linkingという別のアクセス方法について説明します.
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つの機能があります.
  • このContainerの特定の機能を名前で表す方法で、覚えやすくします.たとえば、wenアプリケーションを含むContainerをwebと命名します.
  • では、他のコンテナを簡単にインデックスできるようにDockerのリファレンスポイントが用意されています.たとえば、webコンテナをdbコンテナに接続するように指定できます.

  • --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つの方法がある.
  • 環境変数
  • 更新/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コマンドを実行して指定したコンテナ環境変数を羅列できます.
        $ 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