はじめに
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とMySQLのサービスコンテナを起動し、両方のサービスにリンクするmy_appコンテナを起動して、my_app内からMySQL接続をテストします。
要件
- 2つのDockerコンテナが必要です:1つはApacheを実行し、もう1つはMySQLを実行します。
- ApacheコンテナとMySQLコンテナにリンクする追加の
my_appコンテナを起動します。 - データベース接続をテストする前に、
my_app内にMySQLクライアントをインストールします。 - マシンにDockerがインストールされていること。
ヒント
- 前のコンテナと競合しないように、このステップを開始する際は新しいターミナルを開くことを忘れないでください。
実行例
両方のサービスにリンクした後、my_appコンテナから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_mysqlMySQLコンテナと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_appdocker 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がインストールされていること。
実行例
ステップ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コマンドを活用して異なるサービス間で通信を許可し、より複雑なアプリケーションを構築する方法を理解できたはずです。引き続き実験を続け、楽しんでください!



