Link を使ってコンテナを接続する

DockerBeginner
オンラインで実践に進む

はじめに

Docker はアプリケーションのデプロイに使える強力なツールですが、最初は複雑に感じることがあります。このチャレンジでは、Docker コンテナを link して複数コンテナで構成されるアプリケーションを作成する方法を学びます。まず簡単な例から始め、徐々に複雑なアプリケーションへ進みます。Docker が初めてでも、手順に沿って簡単に進められます。Docker で堅牢なアプリケーションを構築するうえで基本となる、コンテナ同士を通信させる方法を確認します。

Dockerfile でイメージを作成する

コンテナを link するには、まず少なくとも 1 つのコンテナ化されたアプリケーションが必要です。このステップでは、my-app イメージ用の Dockerfile を作成します。この Dockerfile で、コンテナ内に構築する環境と実行するアプリケーションを定義します。

タスク

このステップの目標は、my-app イメージ用の Dockerfile を作成することです。

要件

  • お使いのマシンに Docker がインストールされていること。
  • コンテナ化したい既存の my-app アプリケーションがあること。

ヒント

  • コンテナをビルドして実行する前に、イメージの入力を定義してください。

実行例

  1. チャレンジに必要なファイルを作成します。

    /home/labex/project/Dockerfile という名前の新しいファイルを作成し、次の内容を記述します。

    • ベースイメージとして python:3.7-slim を使用します。
    • 作業ディレクトリを /app に設定します。
    • カレントディレクトリの内容をコンテナ内の /app にコピーします。
    • 必要なパッケージをインストールします。
    • 外部に対してポート 80 を公開します。
    • 環境変数を定義します(この例では使用しませんが、この命令は残します)。
    • コンテナの起動時に app.py を実行します。

    プロジェクトディレクトリ /home/labex/project/app.py というファイルを作成し、次の内容を記述します。

    import os
    
    os.system("wssh --address='0.0.0.0' --port=80")
    

    プロジェクトディレクトリ /home/labex/project/requirements.txt というファイルを作成し、次の内容を記述します。

    webssh==1.6.2
    
    labex:project/ $ pwd
    /home/labex/project
    labex:project/ $ ll
    total 12K
    -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py
    -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile
    -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt
    
  2. docker build コマンドを使用して、my-app イメージをビルドします。

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. my-app イメージを使って新しいコンテナを起動し、ポートマッピングを確認します。

    labex:project/ $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp
    
  4. Web ブラウザーを開き、http://localhost:8080 にアクセスして、アプリケーションが正しく実行されていることを確認します。

    ブラウザーで実行中の Web アプリ

コンテナ化されたアプリケーションを用意できたので、次はコンテナの link に進みます。このステップでは、2 つの Docker コンテナを link して、相互に通信できるようにする方法を学びます。これは、Docker 上で複数サービスのアプリケーションを作成するための重要な手順です。

タスク

Apache と MySQL のサービスコンテナを起動し、両方のサービスに link する my_app コンテナを起動します。その後、my_app 内から MySQL に接続できることを確認します。

要件

  • Apache を実行する Docker コンテナと、MySQL を実行する Docker コンテナが 1 つずつ必要です。
  • Apache コンテナと MySQL コンテナに link する my_app コンテナを追加で起動します。
  • データベース接続をテストする前に、my_app 内へ MySQL クライアントをインストールします。
  • お使いのマシンに Docker がインストールされていること。

ヒント

  • 前のコンテナと競合しないように、新しいターミナルを開いてこのステップを開始してください。

実行例

両方のサービスに link した後、my_app コンテナから MySQL にアクセスします。

  1. httpd イメージを基に my_apache という名前の Apache コンテナを起動し、ホストのポート 80 をコンテナのポート 80 にマッピングします。

    labex:project/ $ docker ps | grep my_apache
    a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp
    
  2. MYSQL_ROOT_PASSWORD 環境変数を password に設定し、mysql イメージを使用して my_mysql という名前の MySQL コンテナを起動します。

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
    
  3. MySQL コンテナと Apache コンテナの両方に link する my_app コンテナを起動します。 注:link の設定はコンテナの構成に表示されます。docker inspect my_app で確認できます。

    labex:project/ $ docker ps | grep my_app
    859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app
    
  4. docker exec コマンドを使用して、my_app コンテナから MySQL のコマンドラインインターフェイスにアクセスします(link の方法を変更した場合は、コマンドを適宜変更してください)。

    my_app 内に MySQL クライアントをインストールしてから、link された MySQL サービスに接続します。

    labex:project/ $ docker exec -it my_app bash
    root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client
    root@859c201b7267:/app## mysql -h mysql -uroot -ppassword
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
    

前のステップを発展させ、このパートでは 2 つの新しい要素を扱います。1 つのアプリケーションコンテナから両方のサービスに link することと、環境変数を使って接続設定をコンテナに渡すことです。ステップ 2 では、link されたコンテナが相互に到達できることだけを確認しました。このステップでは、2 つの --link オプションと、MySQL および Apache のホストを表す環境変数を指定して my_app2 を起動します。

タスク

Apache を実行するコンテナ、MySQL を実行するコンテナ、カスタムアプリケーションを実行するコンテナの 3 つを起動します。カスタムアプリケーションから MySQL と Apache の両方にアクセスできるようにします。

要件

  • Apache、MySQL、カスタムアプリケーション用の 3 つの Docker コンテナが必要です。
  • 2 つの link と、次の環境変数を指定して my_app2 を起動します:DB_HOST=mysqlDB_USER=rootDB_PASSWORD=passwordAPACHE_HOST=apache
  • Apache への接続をテストする前に、my_app2 内へ curl をインストールします。my-app イメージには curl がデフォルトで含まれていないためです。
  • お使いのマシンに Docker がインストールされていること。

ヒント

  • ステップ 2 のサービスコンテナを再利用してください。新しいアプリケーションコンテナの link や環境変数を確認する必要がある場合は、コンテナを調査してください。

実行例

  1. ステップ 2 の説明に従って Apache コンテナと MySQL コンテナを起動します。

  2. Apache と MySQL の両方にアクセスできる、my_app2 という名前のカスタムアプリケーションコンテナを起動します。

    labex:project/ $ docker ps | grep app2
    8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2
    
  3. my_app2 に入り、curl をインストールしてから curl http://apache/ を実行し、link された Apache コンテナに到達できることを確認します。

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

まとめ

このチャレンジでは、Docker コンテナ同士を link して、複数コンテナで構成されるアプリケーションを作成する方法を学びました。単一コンテナから、link された 2 つのコンテナ、そして最終的に 3 つのコンテナで構成される環境へと進みました。これで、コンテナ link と docker exec コマンドを活用して異なるサービス間の通信を可能にし、より複雑なアプリケーションを構築する方法を理解できました。引き続き試しながら、Docker を楽しんで学びましょう。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習