【初学者向け】Docker Composeの基礎と実践
はじめに
今回は私の体験を基に、Docker Composeについて説明します。
私の動作環境
- Docker Desktop 4.32.0 (157355)
- Docker Engine 27.0.3
- Docker Compose v2.28.1-desktop.1
- MacOS Sonoma 14.5
Dockerコマンド一覧
Dockerのコマンド一覧は、以下のサイトに記載されています。このサイトは、Docker公式ドキュメントを有志の方々が日本語に翻訳してくれているものです。
公式による最新のドキュメントを確認したい人は、以下のリンクから飛ぶことができます。
Docker Composeとは?
Docker Composeは、複数のDockerコンテナを効率的に管理・実行するためのツールです。
Docker Composeを使用すると、複数のコンテナを1つのYAMLファイルで定義し、単一のコマンドで一括して起動・停止できます。
これにより、複数コンテナの一括管理ができます。
また、コンテナの設定やボリュームなどをYAMLファイルで宣言的に記述できるため、複雑な環境でも設定を簡潔に管理でき、サービスの複製や拡張も容易になります.
Docker Composeのコマンド一覧は、以下のリンクから参照できます。
ちなみに、Docker Desktopをインストールすると、Docker Composeも自動的にインストールされます。
既にDocker Desktopがインストールしてある私の環境で以下のコマンドを実行し、バージョン確認をしてみます。
docker compose version
別でインストールする必要がない
Docker Desktopって便利ですね〜!
Docker Composeを使ってみる
実際にDocker Composeを使って複数のコンテナを作成してみます。
1. 作業用ディレクトリを作成する
まず、「compose-test」という名前の作業用ディレクトリを作り、そこに移動します。
mkdir compose-test
cd compose-test
2. Dockerネットワークを作成する
移動したら、以下のコマンドで「mynetwork」という名前のDockerネットワークを作成します。
docker network create mynetwork
Dockerネットワークを新規作成
docker network ls
コマンドで確認すると、「mynetwork」が作成されていることが確認できました。
docker network ls
「mynetwork」が存在している
3. 「docker-compose.yml」を作成する
以下のような「docker-compose.yml」を作成してみます。
これはMySQLデータベースを使用したWordPress環境をセットアップするための記述です。
version: '3.8'
services:
wordpress-db:
image: mysql:5.7
platform: linux/amd64
networks:
- mynetwork
volumes:
- wordpress_db_volume:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpassword
MYSQL_DATABASE: wordpressdb
MYSQL_USER: wordpressuser
MYSQL_PASSWORD: wordpresspass
wordpress-app:
depends_on:
- wordpress-db
image: wordpress
networks:
- mynetwork
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: wordpress-db
WORDPRESS_DB_NAME: wordpressdb
WORDPRESS_DB_USER: wordpressuser
WORDPRESS_DB_PASSWORD: wordpresspass
networks:
mynetwork:
volumes:
wordpress_db_volume:
作成したdocker-compose.ymlの詳細
- WordPressデータベースサービス (
wordpress-db
):
-
MySQL 5.7
のイメージを使用しています。 -
platform
をlinux/amd64
に設定しています。 -
mynetwork
ネットワークに接続しています。 - データベースデータは
wordpress_db_volume
という名前のボリュームに保存され、永続化されます。 - コンテナが常に再起動するように設定しています。
- 環境変数で、MySQLのルートパスワード、データベース名、ユーザー名、パスワードを指定しています。
- WordPressアプリケーションサービス (
wordpress-app
):
-
wordpress-db
サービスに依存しています(つまり、wordpress-appはwordpress-db
が起動するまで待機します)。 - WordPressの公式イメージを使用しています。
-
mynetwork
ネットワークに接続しています。 - ホストのポート8080をコンテナのポート80にマッピングしており、ブラウザでhttp://localhost:8080にアクセスすることでWordPressに接続できるようになっています。
- 常に再起動するように設定されています。
- 環境変数で、WordPressが使用するデータベースのホスト、名前、ユーザー名、パスワードを指定しています。
- ネットワーク (
mynetwork
):
- ここで定義しているネットワークを介して、サービス同士が通信できるようになります。
- ボリューム (
wordpress_db_volume
):
- MySQLデータベースのデータを永続化するためのボリュームを定義しています。
4. Docker Composeでコンテナを稼働させる
docker compose up
コマンドでコンテナの作成と開始を行います。
また、-dで端末から切り離してバックグラウンドで実行させます。
docker compose up -d
実行画面
ここで「'version' is obsolete
」という警告が出ていますが、どうやら最新のDocker環境において、versionプロパティは非推奨らしいです。ビルド自体には問題ないそうなので、今回はこのまま続行します。
5. Docker Composeで何ができたのか確認する
以下のように、docker compose ps
コマンドでDocker Composeに関連するコンテナの一覧を表示してみると、二つのコンテナが稼働していることが確認できました。
docker compose ps
二つのコンテナが稼働している
Docker Composeで起動したコンテナ名は、「作業用ディレクトリ名_コンテナ名_1」というような命名規則になります。
docker ps
コマンドでも確認してみます。
docker ps
二つのコンテナが稼働していることが確認できた
次は、ネットワークについて確認してみます。
docker network ls
Docker Composeで作成したネットワークが存在している
実行結果から、Docker Composeではネットワークも作成することができるということがわかりました。
別にネットワークを作成する必要はなかったということですね。
また、ボリュームについても確認してみます。
docker volume ls
二つのボリュームが確認できた
このように、Docker Composeで稼動させたコンテナはDocker Composeとは関係ない形で稼動させたコンテナと遜色なく扱うことができることがわかりました。
6. WordPressの動作確認をする
コンテナが稼動しましたが、本当にしっかり稼動できているのか確認するためにWordPressの動作確認をしてみます。
ブラウザでhttp://localhost:8080にアクセスすると以下のような画面が表示されました。
「日本語」を選択し、「次へ」をクリックして進みます。
進んだら、サイトのタイトルやユーザー名、パスワードなどの必要事項を入力します。
入力したら、WordPressのインストールに成功した旨の画面が表示されます。「ログイン」をクリックして進みます。
進んだら、ユーザー名やパスワードを入力してログインします。
ログインすると、管理者画面が表示されます。
上記の作業により、WordPressを扱えるようになりました。
サイトが閲覧できる
これで、Docker Composeで作成したコンテナが正常に動作していることが確認できました。
7. Docker Composeでコンテナを停止させ、破棄する
では、起動したコンテナー式をdocker compose down
コマンドで停止させ、破棄してみます。
docker compose down
コマンドは、コンテナやネットワークを停止するだけでなく、それらを破棄するコマンドです。
ただしデフォルトでは、ボリュームは削除しないようになっています。もし、ボリュームが削除された場合、データが永続化されなくなるからです。
docker compose down
docker compose ps
で確認すると、コンテナが存在していないことが確認できました。
docker compose ps
docker ps -a
でも同様です。
次は、ネットワークについて確認してみます。
「compose-test_mynetwork」が存在しない
こちらもDocker Composeで作成したものが存在していないことが確認できました。
また、ボリュームについても確認してみます。
こちらは残っています。
そのため、もう一度、docker compose up
を実行した場合、このボリュームの内容はそのまま使われるため、マウントしているMySQLコンテナが保存しているデータベースのデータが失われることはありません。
8. 一つずつコンテナを操作する
このように、docker compose
コマンドではupとdownを指定することで、まとめて起動ならびに停止・破棄ができます。
しかし、一つずつコンテナを操作したいこともあるでしょう。
しかし、Docker Composeで管理されているものを、dockerコマンドで操作すると反故が生じる可能性もあります。(設定の不整合や依存関係の破損など)
こうした理由から、Docker Composeで起動したものは、Docker Composeから操作すべきです。
8.1 Docker Composeで起動する
まず、以下のコマンドで全て起動します。
docker compose up -d
8.2 コンテナの中身を確認する
起動したコンテナの内、wordpress-appのほうに入り込んでみます。
docker compose execを実行すると、任意のコマンドを実行できます。
docker compose exec wordpress-app /bin/bash
ここで、以下のコマンドを実行してみます、
ls /var/www/html
ls /var/www/html
コマンドは、指定されたディレクトリ/var/www/html
の内容をリスト表示します。このディレクトリは、通常、Webサーバーのデフォルトのドキュメントルートとして使用され、ウェブサイトのファイルが格納されています。
様々なものが格納されている
確認したので、exit
で終了します。
8.3 片方のコンテナだけを停止させる
ではここで、片方のコンテナだけを停止させてみます。
今回は、データベースの役割を持つwordpress-db
コンテナを停止させてみます。
docker compose stop wordpress-db
docker compose ps -a
で確認すると、片方だけが停止していることが確認できました。
8.4 再度、稼動させる
再度、稼動します。これには、二つの方法があります。
8.4.1 docker compose start
一つ目の方法は、docker compose start wordpress-db
を実行することです。
この場合、wordpress-dbだけが起動します。
docker compose ps -a
で確認すると、両方とも起動しているのが確認できた
8.4.2 docker compose up -d
二つ目の方法は、docker compose up -d
を実行することです。
まず、docker compose stop wordpress-db
で片方のコンテナだけを停止させます。
そして、docker compose up -d
を実行します。
この場合、「docker-compose.yml」の内容が再実行され、それに伴ってwordpress-db
も起動します。
docker compose ps -a
で確認すると、両方とも起動しているのが確認できた
9. 作業終了
docker compose down
を実行します。
さいごに
ざっくりまとめてみます。
-
「docker-compose.yml」に記述する
稼動させたいコンテナ、ネットワーク、ボリュームの情報を「docker-compose.yml」ファイルに記述します。 -
docker compose up
でまとめて起動する
docker-compose.ymlファイルを置いた場所をカレントディレクトリにし、docker-compose up
を実行すると、まとめて起動させることができます。 -
docker compose down
でまとめて停止・破棄する
docker compose down
を実行すると、まとめてコンテナが停止し、ネットワークと共に破棄されます。ただし、ボリュームは残ります。
ここまで記事を読んでくださり、ありがとうございました!
今回は、Docker Composeについて紹介しました。私もまだまだ慣れていないため、今後も知識を養いながら、色々なことにチャレンジしてみたいです。
皆さんも素敵なハッピーDockerライフを!!!🌸
Discussion