はじめに
Docker はアプリケーションをデプロイするための強力なツールですが、最初は複雑に感じるかもしれません。このチャレンジでは、Docker コンテナをリンク(連携)させて、複数のコンテナで構成されるアプリケーションを構築する方法をガイドします。簡単な例から始めて、徐々に実用的な構成へと進めていきます。Docker に触れるのが初めての方でも、スムーズに理解できる内容です。コンテナ同士を通信させる方法を学ぶことは、Docker で堅牢なアプリケーションを構築する上での基本となります。
Docker はアプリケーションをデプロイするための強力なツールですが、最初は複雑に感じるかもしれません。このチャレンジでは、Docker コンテナをリンク(連携)させて、複数のコンテナで構成されるアプリケーションを構築する方法をガイドします。簡単な例から始めて、徐々に実用的な構成へと進めていきます。Docker に触れるのが初めての方でも、スムーズに理解できる内容です。コンテナ同士を通信させる方法を学ぶことは、Docker で堅牢なアプリケーションを構築する上での基本となります。
コンテナをリンクさせる前に、まずはコンテナ化されたアプリケーションを用意する必要があります。このステップでは、my-appイメージを作成するための Dockerfile を作成します。この Dockerfile には、コンテナ内で実行される環境とアプリケーションの定義を記述します。
このステップの目標は、my-appイメージ用の Dockerfile を作成することです。
my-appアプリケーションのソースファイルが用意されていること。チャレンジに必要なファイルを作成します。
/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
docker build コマンドを使用して my-app イメージをビルドします。
labex:project/ $ docker images | grep my-app
my-app latest 266edf714faf 30 seconds ago 170MB
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
Web ブラウザを開き、http://localhost:8080 にアクセスして、アプリケーションが正しく動作していることを確認します。

アプリケーションのコンテナ化が完了したので、次はコンテナ間のリンクに進みます。このステップでは、2 つの Docker コンテナをリンクさせ、互いに通信できるようにする方法を学びます。このプロセスは、Docker 内でマルチサービス・アプリケーションを構築するための鍵となります。
Apache Web サーバーコンテナと MySQL データベースコンテナをリンクさせます。
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/tcp
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
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
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)]>
前のステップをさらに発展させ、複数のコンテナをリンクし、設定に環境変数を活用する方法を学びます。このステップでは、より複雑で柔軟なマルチコンテナ環境の構築方法を示します。
Apache、MySQL、およびカスタムアプリケーションの 3 つのコンテナを起動します。カスタムアプリケーションは、MySQL と Apache の両方にアクセスできる必要があります。
ステップ 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_app2
curl を使用して、カスタムアプリケーションから Apache コンテナにアクセスします。
<html>
<body>
<h1>It works!</h1>
</body>
</html>
このチャレンジでは、Docker コンテナをリンクさせてマルチコンテナアプリケーションを作成する方法を学びました。単一のコンテナから始まり、コンテナ同士のペアリング、そして最終的には 3 つのコンテナを組み合わせたセットアップへと進みました。コンテナのリンク機能と docker exec コマンドを活用して異なるサービス間で通信させる方法を理解したことで、より複雑なアプリケーションを構築する準備が整いました。引き続き実験を重ねて、Docker の活用を楽しんでください!