Table of Contents
はじめに
Dockerは、コンテナでアプリケーションプロセスを管理するプロセスを簡素化します。コンテナは仮想マシンに似ていますが、より軽量でリソースフレンドリーです。これにより、開発者はアプリケーション環境を複数の孤立したサービスに分解することができます。
複数のサービスに依存するアプリケーションの場合、すべてのコンテナを一緒に整理、起動、通信、シャットダウンすると、たちまち手に負えなくなることがあります。Docker Composeは、YAMLファイルの定義に基づいてマルチコンテナアプリケーション環境を実行できるツールです。サービス定義を使用して、ネットワークやデータ量を共有できる複数のコンテナで完全にカスタマイズ可能な環境を構築します。
本ガイドでは、Ubuntu 20.04サーバーにDocker Composeをインストールし、このツールを使用する方法を説明します。
前提条件
次のものを準備してください。
- sudo権限を持つroot以外のユーザーとして、Ubuntu 20.04ローカルマシンまたは開発サーバーにアクセス。リモートサーバーを使用している場合、アクティブなファイアウォールをインストールしておくことをお勧めします。これらのセットアップは、Ubuntu 20.04の初期サーバー設定ガイドを参照してください。
- お使いのサーバーまたはローカルマシンインストールされたDocker。インストール方法は、Ubuntu 20.04へのDockerのインストールおよび使用方法のステップ1と2に従ってください。
ステップ1— Docker Composeをインストールする
Docker Composeの最近更新された安定バージョンを取得するために、公式のGithubリポジトリからこのソフトウェアをダウンロードします。
まず、リリースページで利用可能な最新バージョンを確認します。この執筆時点では、最新の安定バージョンは1.26.0です。
次のコマンドは、1.26.0リリースをダウンロードし、実行ファイルを/usr/local/bin/docker-composeに保存することで、このソフトウェアをdocker-composeとしてグローバルにアクセス可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/<^>1.26.0<^>/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
次に、docker-composeコマンドが実行可能になるように、正しい権限を設定します。
sudo chmod +x /usr/local/bin/docker-compose
インストールが成功したことを確認するには、以下を実行します。
docker-compose --version
次のような出力が表示されます。
[secondary_label Output]
docker-compose version <^>1.26.0<^>, build 8a1c60f6
Docker Composeがシステムに正常にインストールされました。次のセクションでは、docker-compose.ymlファイルをセットアップし、コンテナ化された環境を取得し、このツールを使用して実行する方法を示します。
ステップ2 —docker-compose.ymlファイルをセットアップする
docker-compose.ymlファイルをセットアップし、Docker Composeで作業する方法を実証するために、パブリックのCockerレジストリであるDocker Hubから、公式Nginxイメージを使用してWebサーバー環境を作成します。このコンテナ化された環境は、単一の静的HTMLファイルの処理に役立ちます。
まずはホームフォルダ内に新しいディレクトリを作成し、そこに移動することから始めましょう。
mkdir <^>~/compose-demo<^>
cd <^>~/compose-demo<^>
このディレクトリでは、Nginx環境のドキュメントルートとして機能するアプリケーションフォルダをセットアップします。
mkdir <^>app<^>
優先テキストエディタを使用すると、アプリフォルダに 新しいindex.htmlファイルが作成されます。
nano app/index.html
次のコンテンツをこのファイルに配置します。
[label ~/compose-demo/app/index.html]
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Docker Compose Demo</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>
<h1>This is a Docker Compose Demo Page.</h1>
<p>This content is being served by an Nginx container.</p>
</body>
</html>
完了したら、ファイルを保存して閉じます。nanoを使用している場合、CTRL+X、Y、ENTERとタイプして確認できます。
次に、docker-compose.ymlファイルを作成します。
nano docker-compose.yml
docker-compose.ymlに次のコンテンツを挿入します。
[label docker-compose.yml]
version: '3.7'
services:
web:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app:/usr/share/nginx/html
docker-compose.ymlファイルは、通常、バージョン定義から開始します。こうすることで、私たちが使用しているDocker Composeに設定バージョンが伝えられます。
すると、この環境の一部であるサービスをセットアップするサービスブロックが現れます。私たちの場合、Webという単一サービスがあります。このサービスではnginx:alpineイメージを使用し、ポートディレクティブでポートのリダイレクトを設定します。ホストマシン(Docker Composeを実行しているシステム)のポート8000へのすべてのリクエストは、Nginxが実行するポート80のWebコンテナにリダイレクトされます。
ボリュームディレクティブにより、ホストマシンとコンテナ間の共有ボリュームが作成されます。これにより、ローカルアプリフォルダがコンテナと共有され、ボリュームはコンテナ内の/usr/share/nginx/htmlに配置され、Nginxのデフォルトドキュメントルートを上書きします。
ファイルを保存して閉じます。
デモページとdocker-compose.ymlファイルがセットアップされ、コンテナ化されたWebサーバー環境が作成されました。次のステップでは、この環境をDocker Composeで立ち上げます。
ステップ3 — Docker Composeを実行する
docker-compose.ymlファイルが所定の位置に配置されたら、Docker Composeを実行して環境を立ち上げられます。次のコマンドでは、必要なDockerイメージをダウンロードし、Webサービスのコンテナが作成され、コンテナ化された環境をバックグラウンドモードで実行します。
docker-compose up -d
Docker Composeは、ローカルシステムで定義されたイメージを最初に探し、イメージが見つらない場合、Docker Hubからイメージをダウンロードします。出力は次のようになります。
[secondary_label Output]
Creating network "<^>compose-demo_default<^>" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating <^>compose-demo_web_1<^> ... done
環境は、バックグラウンドで実行されています。コンテナがアクティブであることを確認するために、以下を実行できます。
docker-compose ps
このコマンドでは実行中のコンテナとその状態だけでなく、現在所定の位置に配置されたポートリダイレクトに関する情報が表示されます。
[secondary_label Output]
Name Command State Ports
----------------------------------------------------------------------------------
<^>compose-demo_web_1<^> /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
これで、ローカルマシンでこのデモを実行している場合はlocalhost:8000に、またはリモートサーバーでこのデモを実行している場合は<^>your_server_domain_or_IP<^>:8000にブラウザを指し示すことで、デモアプリケーションにアクセスできるようになりました。
以下のページが表示されます。
共有ボリュームはdocker-compose.ymlファイル内部でセットアップしされたため、アプリフォルダファイルは引き続きコンテナのドキュメントrootと同期し続けます。index.htmlファイルに変更を加えると、コンテナに自動的に取り上げられ、ページをリロードするときにブラウザに反映されます。
次のステップでは、Docker Composeコマンドでコンテナ化された環境を管理する方法が表示されます。
ステップ4 — Docker Composeコマンドに精通する
これまではdocker-compose.ymlファイルがセットアップされ、環境をdocker-compose upで立ち上げる方法を見てきました。ここでは、Docker Composeコマンドを使用してコンテナ化された環境を管理しやり取りする方法を見てみましょう。
Nginxコンテナにより生成されたログをチェックするために、logsコマンドを使用できます。
docker-compose logs
次のような出力が表示されます。
[secondary_label Output]
Attaching to <^>compose-demo_web_1<^>
web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"
コンテナの現在の状態を変更せずに環境実行を一時停止したい場合は、以下を使用します。
docker-compose pause
[secondary_label Output]
Pausing <^>compose-demo_web_1<^> ... done
一時停止を発行した後で実行を再開するには、以下を実行します。
docker-compose unpause
[secondary_label Output]
Unpausing <^>compose-demo_web_1<^> ... done
stopコマンドは、コンテナ実行を終了しますが、コンテナに関連付けられたデータは破棄されません。
docker-compose stop
[secondary_label Output]
Stopping <^>compose-demo_web_1<^> ... done
このコンテナ化された環境に関連付けられたコンテナ、ネットワーク、ボリュームを削除する場合は、downコマンドを使用します。
docker-compose down
[secondary_label Output]
Removing <^>compose-demo_web_1<^> ... done
Removing network <^>compose-demo_default<^>
このコマンドはDocker Composeが使用するベースイメージを削除せずに環境をスピンアップさせることに注意してください(この場合はnginx:alpine)。このように、docker-compose upで環境を再び立ち上げるときには常にイメージがシステム上にすでにあるため、プロセス速度がはるかに上がります。
システムからベースイメージを削除したい場合も、以下を使用できます。
docker image rm nginx:alpine
[secondary_label Output]
Untagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a
注:Dockerコマンドの詳細なリファレンスについては、Dockerのインストールと使用方法で当社のガイドを参照してください。
まとめ
本ガイドでは、Docker Composeをインストールし、Nginx Webサーバーイメージに基づいてコンテナ化された環境を設定する方法をご紹介しました。また、Composeコマンドを使用して、この環境を管理する方法も学びました。
利用可能なすべてのdocker-composeコマンドについての詳細は、公式ドキュメントを参照してください。