コンテナ間のリンクによる接続

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

はじめに

Docker はアプリケーションをデプロイするための強力なツールですが、最初は複雑に感じるかもしれません。このチャレンジでは、Docker コンテナをリンク(連携)させて、複数のコンテナで構成されるアプリケーションを構築する方法をガイドします。簡単な例から始めて、徐々に実用的な構成へと進めていきます。Docker に触れるのが初めての方でも、スムーズに理解できる内容です。コンテナ同士を通信させる方法を学ぶことは、Docker で堅牢なアプリケーションを構築する上での基本となります。

Dockerfile によるイメージの作成

コンテナをリンクさせる前に、まずはコンテナ化されたアプリケーションを用意する必要があります。このステップでは、my-appイメージを作成するための Dockerfile を作成します。この Dockerfile には、コンテナ内で実行される環境とアプリケーションの定義を記述します。

タスク

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

要件

  • マシンに Docker がインストールされていること。
  • コンテナ化するためのmy-appアプリケーションのソースファイルが用意されていること。

実行例

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

    /home/labex/project/ パスに Dockerfile という名前の新しいファイルを以下の内容で作成してください。

    • ベースイメージとして python:3.7-slim を使用する。
    • 作業ディレクトリを /app に設定する。
    • カレントディレクトリの内容をコンテナ内の /app にコピーする。
    • 必要なパッケージをインストールする。
    • ポート 80 を外部に公開(Expose)する。
    • 環境変数を定義する(この例では直接使用しませんが、命令として記述してください)。
    • コンテナ起動時に 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 アプリ
✨ 解答を確認して練習

2 つの Docker コンテナのリンク

アプリケーションのコンテナ化が完了したので、次はコンテナ間のリンクに進みます。このステップでは、2 つの Docker コンテナをリンクさせ、互いに通信できるようにする方法を学びます。このプロセスは、Docker 内でマルチサービス・アプリケーションを構築するための鍵となります。

タスク

Apache Web サーバーコンテナと MySQL データベースコンテナをリンクさせます。

要件

  • Apache を実行するコンテナと MySQL を実行するコンテナの 2 つが必要です。
  • マシンに Docker がインストールされていること。

ヒント

  • 前のステップのコンテナと競合しないよう、このステップを開始する際は新しいターミナルを開くことを忘れないでください。

実行例

Apache コンテナから MySQL にアクセスする:

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

    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 イメージを使用し、環境変数 MYSQL_ROOT_PASSWORDpassword に設定した 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. Apache コンテナを MySQL コンテナにリンクさせます。
    注:このステップでは直接的なコマンド出力はありませんが、リンクの状態はコンテナの環境変数で確認できます。docker inspect my_apache コマンドでコンテナの詳細を確認できます。

    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 コマンドラインインターフェースにアクセスします(リンクの方法に合わせてコマンドを調整してください)。

    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)]>
✨ 解答を確認して練習

複数の Docker コンテナのリンクと環境変数の活用

前のステップをさらに発展させ、複数のコンテナをリンクし、設定に環境変数を活用する方法を学びます。このステップでは、より複雑で柔軟なマルチコンテナ環境の構築方法を示します。

タスク

Apache、MySQL、およびカスタムアプリケーションの 3 つのコンテナを起動します。カスタムアプリケーションは、MySQL と Apache の両方にアクセスできる必要があります。

要件

  • Apache、MySQL、カスタムアプリケーションの 3 つの Docker コンテナが必要です。
  • マシンに Docker がインストールされていること。

実行例

  1. ステップ 2 で説明した手順で、Apache コンテナと MySQL コンテナを起動します。

  2. MySQL と Apache の両方にアクセス可能な 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. curl を使用して、カスタムアプリケーションから Apache コンテナにアクセスします。

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
✨ 解答を確認して練習

まとめ

このチャレンジでは、Docker コンテナをリンクさせてマルチコンテナアプリケーションを作成する方法を学びました。単一のコンテナから始まり、コンテナ同士のペアリング、そして最終的には 3 つのコンテナを組み合わせたセットアップへと進みました。コンテナのリンク機能と docker exec コマンドを活用して異なるサービス間で通信させる方法を理解したことで、より複雑なアプリケーションを構築する準備が整いました。引き続き実験を重ねて、Docker の活用を楽しんでください!