GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Dockerコンテナを接続する方法

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のインストールと構成

  1. システムを更新します:

    sudo apt update && sudo apt upgrade
    
  2. PostGreSQLをインストールします:

    sudo apt install postgresql postgresql-contrib
    
  3. postgresを変更します ユーザーのパスワード:

    sudo passwd postgres
    
  4. postgresのパスワードを設定します データベースユーザー:

    su - postgres
    psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'newpassword';"
    
  5. サンプルアプリのデータベースを作成し、それに接続します:

    createdb nodejs
    psql nodejs
    
  6. データベースに「Helloworld」を追加します:

    nodejs=# CREATE TABLE hello (message varchar);
    nodejs=# INSERT INTO hello VALUES ('Hello world');
    nodejs=# \q
    
  7. 後で使用するためにデータベースのダンプを作成します:

    pg_dumpall > backup.sql
    
  8. postgresとしてサインアウトします Linuxユーザー:

    exit
    
  9. データダンプをホームディレクトリにコピーします:

    sudo cp /var/lib/postgresql/backup.sql ~/.
    
  10. コンテナ(locahost以外のIPアドレスを持つコンテナ)からこのデータベースに接続するため )、リモートアドレスからの接続を許可するようにPostgreSQL設定ファイルを編集する必要があります。 /etc/postgresql/9.5/main/postgresql.confを開きます テキストエディタで。 listen_addressesのコメントを解除します 行を「*」に設定します:

    ファイル:/ etc / postgresql / 9.5 / main / postgresql.conf
    1
    2
    3
    4
    5
    6
    7
    
    #------------------------------------------------------------------------------
    # CONNECTIONS AND AUTHENTICATION
    #------------------------------------------------------------------------------
    
    # - Connection Settings -
    
    listen_addresses = '*'                  # what IP address(es) to listen on;
  11. postgresqlを有効にして開始します サービス:

    sudo systemctl enable postgresql
    sudo systemctl start postgresql
    

HelloWorldアプリを作成する

  1. ノードとNPMのインストール:

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    sudo apt-get install nodejs
    
  2. ホームディレクトリに移動して、ディレクトリを作成します。

    cd
    mkdir app && cd app
    
  3. テキストエディタを使用して、app.jsを作成します 次のコンテンツを追加します:

    ファイル:app .js
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    const { Client } = require('pg')
    
    const client = new Client({
      user: 'postgres',
      host: 'localhost',
      database: 'nodejs',
      password: 'newpassword',
      port: 5432
    })
    
    client.connect()
    
    client.query('SELECT * FROM hello', (err, res) => {
      console.log(res.rows[0].message)
      client.end()
    })

    このアプリはpgを使用します 前のセクションで作成したデータベースに接続するためのNPMモジュール(node-postgres)。次に、「hello」テーブル(「Helloworld」メッセージを返す)にクエリを実行し、応答をコンソールに記録します。 'newpassword'を置き換えます postgresで 前のセクションで設定したデータベースユーザーのパスワード。

    pg モジュールは、環境変数を使用してクライアント接続を構成することもできます。これは、本番アプリに推奨されるオプションです。環境変数の詳細については、node-postgresのドキュメントをご覧ください。
  4. pgをインストールします モジュール:

    npm install pg
    
  5. アプリをテストする:

    node app.js
    

    データベースが正しく構成されている場合、「Helloworld」がコンソールに表示されます。

コンテナをDockerホストに接続します

このセクションでは、Node.jsアプリがDockerコンテナーから実行され、Dockerホストで実行されているデータベースに接続するユースケースを示します。

Dockerコンテナを設定する

  1. ホームディレクトリに戻る:

    cd
    
  2. Node.jsアプリを実行するDockerfileを作成します:

    ファイル:Dockerfile
    1
    2
    3
    4
    5
    6
    7
    
    FROM debian
    
    RUN apt update -y && apt install -y gnupg curl
    RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt install -y nodejs
    COPY app/ /home/
    
    ENTRYPOINT tail -F /dev/null
  3. このDockerfileから構築されたイメージは、app/をコピーします 新しい画像へのディレクトリ。 app.jsを編集します アプリがdatabaseに接続できるようにします localhostの代わりにホスト :

    ファイル:app /app.js
    1
    2
    3
    4
    5
    6
    7
    
    const client = new Client({
      user: 'postgres',
      host: 'database',
      database: 'nodejs',
      password: 'newpassword',
      port: 5432
    })
  4. Dockerfileからイメージを作成します:

    docker build -t node_image .
    

コンテナをデータベースに接続

  1. Dockerは、デフォルトのブリッジネットワークを自動的に設定します 、docker0からアクセス ネットワークインターフェース。 ifconfigを使用します またはip このインターフェースを表示するには:

    ifconfig docker0
    

    出力は次のようになります。

    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)
    Dockerホスト(Linode)の内部IPアドレスは172.17.0.1です。

  2. PostgreSQLがDockerインターフェースからの接続を受け入れることを許可します。 /etc/postgresql/9.5/main/pg_hba.confを開きます テキストエディタで次の行を追加します:

    ファイル:/ etc / postgresql / 9.5 / main / pg_hba.conf
    1
    
    host    all             postgres        172.17.0.0/16           password

    172.17.0.1はDockerホストのIPであるため、ホスト上のすべてのコンテナーのIPアドレスは172.17.0.0/16の範囲になります。

  3. データベースを再起動します:

    sudo systemctl restart postgresql
    
  4. コンテナを起動します:

    docker run -d --add-host=database:172.17.0.1 --name node_container node_image
    

    --add-host オプションはdatabaseを定義します ホスト。DockerホストのIPアドレスを指します。 databaseの宣言 アプリでIPアドレスをハードコーディングするのではなく、実行時にホストを使用すると、コンテナーを再利用可能に保つことができます。

  5. コンテナ内から、pingを使用します databaseへの接続をテストします ホスト:

    docker exec -it node_container ping database
    
  6. 各Dockerコンテナには、172.17.0.0/16ブロック内から独自のIPアドレスも割り当てられます。 ipを使用してこのコンテナのIPアドレスを検索します :

    docker exec -it node_container ip addr show eth0
    

    Dockerホストからこのアドレスにpingを実行することで、この接続をテストできます。

  7. アプリを実行します:

    docker exec -it node_container node home/app.js
    

構成が成功すると、プログラムは以前と同じように「Helloworld」コンソール出力を表示するはずです。

2つのコンテナを接続する

このセクションでは、アプリとデータベースの両方が別々のコンテナーで実行されます。 Docker Hubの公式postgresイメージを使用して、前に作成したSQLダンプを読み込むことができます。

注意 Dockerコンテナ内に本番データベースデータを保存しないでください。コンテナは一時的なエンティティとして扱う必要があります。コンテナが予期せずクラッシュしたり再起動したりすると、データベース内のすべてのデータが失われます。
  1. Node.jsコンテナを停止して削除します:

    docker stop node_container
    docker rm node_container
    
  2. postgresをプルします 画像:

    docker pull postgres
    
  3. backup.sqlを確認してください ファイルが現在の作業ディレクトリにある場合は、postgresを実行します 画像:

    docker run -d -v `pwd`:/backup/ --name pg_container postgres
    

    -v オプションは、現在の作業ディレクトリを/backup/にマウントします 新しいコンテナのディレクトリ。

  4. 新しいコンテナは自動的にpostgresデータベースを起動し、postgresユーザーを作成します。コンテナに入り、SQLダンプをロードします:

    docker exec -it pg_container bash
    cd backup
    psql -U postgres -f backup.sql postgres
    exit
    
  5. ノードイメージを再度実行します。今回は、--add-hostの代わりに 、--linkを使用します コンテナをpg_containerに接続するオプション:

    docker run -d --name node_container --link=pg_container:database node_image
    

    これにより、pg_containerがリンクされます ホスト名databaseの下 。

  6. /etc/hostsを開きます node_containerで、リンクが作成されたことを確認します:

    docker exec -it node_container cat /etc/hosts
    

    次のような行があるはずです:

    ファイル:/ etc / hosts
    172.17.0.2  database  pg_container

    これは、pg_container IPアドレス172.17.0.2に割り当てられており、ホスト名databaseを介してこのコンテナにリンクされています 、予想どおり。

  7. 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作成ガイドを参照してください。
  1. 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
    
  2. Dockerfileと同じディレクトリに、docker-compose.ymlを作成します 次の内容のファイル:

    ファイル:docker -compose.yml
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    version: '3'
    
    services:
      database:
        image: postgres
        container_name: pg_container
        volumes:
           - pgdata:/var/lib/postgresql/data
    
      app:
        build: .
        container_name: node_container
        links:
         - database
        environment:
          - PGPASSWORD=newpassword
          - PGUSER=postgres
          - PGDATABASE=nodejs
          - PGHOST=database
          - PGPORT=5432
        depends_on:
          - database
    
    volumes:
      pgdata: {}

    このファイルを使用してDockerComposeを実行すると、pg_containerが作成されます。 およびnode_container 前のセクションから。以前と同様に、データベースコンテナは公式のPostgreSQLイメージを使用しますが、アプリコンテナはDockerfileから構築されます。 links エントリは、--linkと同じ機能を果たします runのオプション 以前に使用したコマンド。

  3. Docker Composeでは環境値を設定することもできるため、値をハードコーディングするのではなく、アプリを単純化してこれらを使用することができます。 app.jsを編集します これらの値を削除するには:

    ファイル:app .js
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    const express = require('express')
    const { Client } = require('pg')
    
    const client = new Client()
    
    client.connect()
    
    client.query('SELECT * FROM hello', (err, res) => {
      console.log(res.rows[0].message)
      client.end()
    })
  4. 以前のコンテナを削除します:

    docker rm -f node_container pg_container
    
  5. Docker Composeを使用して、コンテナーを起動します。

    docker-compose up -d
    
  6. サンプルデータを新しいコンテナにロードします:

    docker cp backup.sql pg_container:/
    docker exec -it pg_container psql -U postgres -f backup.sql postgres
    
  7. 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:コンテナ通信を理解する
  • コンテナのリンク
  • コンテナの接続

Docker
  1. 実行中のDockerコンテナを自動的に更新する方法

  2. Dockerコンテナをエクスポートおよびインポートする方法

  3. DockerComposeの使用方法

  1. 環境変数をDockerコンテナに渡す方法

  2. Dockerコンテナを一覧表示する方法

  3. すべての Docker コンテナーを削除する方法

  1. Dockerコンテナを管理する方法は?ベストプラクティス

  2. DockerとKubernetes

  3. 未使用のDockerリソースを整理する方法