はじめに
Dockerはアプリケーションのデプロイに非常に強力なツールですが、最初は複雑に見えるかもしれません。このチャレンジでは、Dockerコンテナをリンクさせてマルチコンテナアプリケーションを作成する方法をガイドします。シンプルな例から始めて、徐々に複雑なアプリケーションへと進んでいきます。Dockerが初めての方でも、簡単に理解できるように構成されています。コンテナ同士を通信させる方法は、Dockerで堅牢なアプリケーションを構築するための基本的なスキルです。
Dockerfileによるイメージの作成
コンテナをリンクさせる前に、少なくとも1つのコンテナ化されたアプリケーションが必要です。このステップでは、my-appイメージ用のDockerfileを作成します。このDockerfileは、コンテナ内で実行される環境とアプリケーションを定義します。
タスク
このステップの目標は、my-appイメージ用のDockerfileを作成することです。
要件
- マシンにDockerがインストールされていること。
- コンテナ化したい既存の
my-appアプリケーションがあること。
実行例
チャレンジに必要なファイルを作成します。
/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.2labex: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- ベースイメージとして
docker buildコマンドを使用してmy-appイメージをビルドします。labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBmy-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/tcpWebブラウザを開き、
http://localhost:8080にアクセスして、アプリケーションが正しく動作していることを確認します。
2つのDockerコンテナをリンクする
コンテナ化されたアプリケーションができたので、次はコンテナのリンクに進みます。このステップでは、2つのDockerコンテナをリンクさせ、相互に通信できるようにする方法を学びます。このプロセスは、Docker内でマルチサービスアプリケーションを作成するための鍵となります。
タスク
Apache WebサーバーコンテナとMySQLデータベースコンテナをリンクさせます。
要件
- Apacheを実行するコンテナとMySQLを実行するコンテナの2つが必要です。
- マシンにDockerがインストールされていること。
ヒント
- 前のコンテナと競合しないように、このステップを開始する際は新しいターミナルを開くことを忘れないでください。
実行例
ApacheコンテナからMySQLにアクセスします。
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/tcpmysqlイメージを使用し、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_mysqlApacheコンテナを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_appdocker 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コンテナのリンクと環境変数の使用
前のステップを基に、このパートでは2つの新しいアイデアを追加します。1つのアプリケーションコンテナが両方のサービスにリンクし、コンテナが環境変数を通じて接続設定を受け取ります。ステップ2では、リンクされたコンテナ同士が到達可能であることを証明しただけでした。このステップでは、--linkオプションと、MySQLおよびApacheホストを記述する環境変数の両方を使用してmy_app2を起動する必要があります。
タスク
Apacheを実行するコンテナ、MySQLを実行するコンテナ、そしてカスタムアプリケーションを実行するコンテナの3つを起動します。カスタムアプリケーションは、MySQLとApacheの両方にアクセスできる必要があります。
要件
- Apache、MySQL、カスタムアプリケーションの3つのDockerコンテナが必要です。
my_app2を、両方のリンクと以下の環境変数で起動します:DB_HOST=mysql、DB_USER=root、DB_PASSWORD=password、APACHE_HOST=apachemy-appイメージにはデフォルトで含まれていないため、テスト前にmy_app2内でcurlをインストールしてください。- マシンにDockerがインストールされていること。
実行例
ステップ2で説明したように、ApacheコンテナとMySQLコンテナを起動します。
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_app2my_app2に入り、curlをインストールし、curl http://apache/を実行して、リンクされたApacheコンテナに到達可能であることを確認します。<html> <body> <h1>It works!</h1> </body> </html>
まとめ
このチャレンジでは、Dockerコンテナをリンクさせてマルチコンテナアプリケーションを作成する方法を学びました。単一のコンテナからリンクされたペア、そして最終的に3つのコンテナ構成へと進みました。コンテナのリンクとdocker execコマンドを活用して異なるサービス間で通信を可能にする方法を理解できたはずです。これにより、より複雑なアプリケーションを構築できるようになります。ぜひ実験を続けて、楽しんでください!



