はじめに
Docker はアプリケーションのデプロイに使える強力なツールですが、最初は複雑に感じることがあります。このチャレンジでは、Docker コンテナを link して複数コンテナで構成されるアプリケーションを作成する方法を学びます。まず簡単な例から始め、徐々に複雑なアプリケーションへ進みます。Docker が初めてでも、手順に沿って簡単に進められます。Docker で堅牢なアプリケーションを構築するうえで基本となる、コンテナ同士を通信させる方法を確認します。
Dockerfile でイメージを作成する
コンテナを link するには、まず少なくとも 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 コンテナを Link する
コンテナ化されたアプリケーションを用意できたので、次はコンテナの link に進みます。このステップでは、2 つの Docker コンテナを link して、相互に通信できるようにする方法を学びます。これは、Docker 上で複数サービスのアプリケーションを作成するための重要な手順です。
タスク
Apache と MySQL のサービスコンテナを起動し、両方のサービスに link する my_app コンテナを起動します。その後、my_app 内から MySQL に接続できることを確認します。
要件
- Apache を実行する Docker コンテナと、MySQL を実行する Docker コンテナが 1 つずつ必要です。
- Apache コンテナと MySQL コンテナに link する
my_appコンテナを追加で起動します。 - データベース接続をテストする前に、
my_app内へ MySQL クライアントをインストールします。 - お使いのマシンに Docker がインストールされていること。
ヒント
- 前のコンテナと競合しないように、新しいターミナルを開いてこのステップを開始してください。
実行例
両方のサービスに link した後、my_app コンテナから MySQL にアクセスします。
httpdイメージを基にmy_apacheという名前の Apache コンテナを起動し、ホストのポート80をコンテナのポート80にマッピングします。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_ROOT_PASSWORD環境変数をpasswordに設定し、mysqlイメージを使用して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 コンテナの両方に link する
my_appコンテナを起動します。 注:link の設定はコンテナの構成に表示されます。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 のコマンドラインインターフェイスにアクセスします(link の方法を変更した場合は、コマンドを適宜変更してください)。my_app内に MySQL クライアントをインストールしてから、link された 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 コンテナを Link し、環境変数を使用する
前のステップを発展させ、このパートでは 2 つの新しい要素を扱います。1 つのアプリケーションコンテナから両方のサービスに link することと、環境変数を使って接続設定をコンテナに渡すことです。ステップ 2 では、link されたコンテナが相互に到達できることだけを確認しました。このステップでは、2 つの --link オプションと、MySQL および Apache のホストを表す環境変数を指定して my_app2 を起動します。
タスク
Apache を実行するコンテナ、MySQL を実行するコンテナ、カスタムアプリケーションを実行するコンテナの 3 つを起動します。カスタムアプリケーションから MySQL と Apache の両方にアクセスできるようにします。
要件
- Apache、MySQL、カスタムアプリケーション用の 3 つの Docker コンテナが必要です。
- 2 つの link と、次の環境変数を指定して
my_app2を起動します:DB_HOST=mysql、DB_USER=root、DB_PASSWORD=password、APACHE_HOST=apache - Apache への接続をテストする前に、
my_app2内へcurlをインストールします。my-appイメージにはcurlがデフォルトで含まれていないためです。 - お使いのマシンに Docker がインストールされていること。
ヒント
- ステップ 2 のサービスコンテナを再利用してください。新しいアプリケーションコンテナの link や環境変数を確認する必要がある場合は、コンテナを調査してください。
実行例
ステップ 2 の説明に従って Apache コンテナと MySQL コンテナを起動します。
Apache と MySQL の両方にアクセスできる、
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/を実行し、link された Apache コンテナに到達できることを確認します。<html> <body> <h1>It works!</h1> </body> </html>
まとめ
このチャレンジでは、Docker コンテナ同士を link して、複数コンテナで構成されるアプリケーションを作成する方法を学びました。単一コンテナから、link された 2 つのコンテナ、そして最終的に 3 つのコンテナで構成される環境へと進みました。これで、コンテナ link と docker exec コマンドを活用して異なるサービス間の通信を可能にし、より複雑なアプリケーションを構築する方法を理解できました。引き続き試しながら、Docker を楽しんで学びましょう。



