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

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

はじめに

Dockerはアプリケーションをデプロイするための強力なツールですが、最初は複雑に見えるかもしれません。このチャレンジでは、Dockerコンテナをリンクさせてマルチコンテナアプリケーションを作成する方法をガイドします。シンプルな例から始め、徐々に複雑なアプリケーションへと進んでいきます。Dockerが初めての方でも、簡単に理解できるように構成されています。コンテナ同士を通信させる方法は、Dockerで堅牢なアプリケーションを構築するための基本的なスキルです。

Dockerfileを使用したイメージの作成

コンテナをリンクさせる前に、少なくとも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 app running in browser

2つのDockerコンテナをリンクする

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

タスク

ApacheとMySQLのサービスコンテナを起動し、両方のサービスにリンクするmy_appコンテナを起動して、my_app内からMySQL接続をテストします。

要件

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

ヒント

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

実行例

両方のサービスにリンクした後、my_appコンテナから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_PASSWORD環境変数をpasswordに設定した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コンテナの両方にリンクするmy_appコンテナを起動します。 注意:リンクはコンテナ設定で確認できます。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コマンドラインインターフェースにアクセスします(リンク方法が異なる場合はコマンドを適宜調整してください)。

    my_app内にMySQLクライアントをインストールし、リンクされた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)]>
    

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

前のステップを基に、このパートでは2つの新しいアイデアを追加します。1つのアプリケーションコンテナが両方のサービスにリンクし、コンテナが環境変数を通じて接続設定を受け取ります。ステップ2では、リンクされたコンテナ同士が到達可能であることを証明しただけでした。このステップでは、--linkオプションと、MySQLおよびApacheホストを記述する環境変数の両方を使用してmy_app2を起動する必要があります。

タスク

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

要件

  • 3つのDockerコンテナが必要です:Apache、MySQL、カスタムアプリケーション。
  • 両方のリンクと、以下の環境変数を指定してmy_app2を起動します:DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password, APACHE_HOST=apache
  • my-appイメージにはデフォルトで含まれていないため、Apache接続をテストする前にmy_app2内にcurlをインストールします。
  • マシンに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. my_app2に入り、curlをインストールし、curl http://apache/を実行して、リンクされたApacheコンテナに到達可能であることを確認します。

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

まとめ

このチャレンジでは、Dockerコンテナをリンクさせてマルチコンテナアプリケーションを作成する方法を学びました。単一のコンテナからリンクされたペア、そして最終的に3つのコンテナ構成へと進みました。これで、コンテナリンクとdocker execコマンドを活用して異なるサービス間で通信を許可し、より複雑なアプリケーションを構築する方法を理解できたはずです。引き続き実験を続け、楽しんでください!

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