💫

【初学者向け】Docker Composeの基礎と実践

2024/08/17に公開

はじめに

今回は私の体験を基に、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公式ドキュメントを有志の方々が日本語に翻訳してくれているものです。

https://docs.docker.jp/engine/reference/commandline/index.html

公式による最新のドキュメントを確認したい人は、以下のリンクから飛ぶことができます。

https://docs.docker.com/

Docker Composeとは?

Docker Composeは、複数のDockerコンテナを効率的に管理・実行するためのツールです。

Docker Composeを使用すると、複数のコンテナを1つのYAMLファイルで定義し、単一のコマンドで一括して起動・停止できます。
これにより、複数コンテナの一括管理ができます。
また、コンテナの設定やボリュームなどをYAMLファイルで宣言的に記述できるため、複雑な環境でも設定を簡潔に管理でき、サービスの複製や拡張も容易になります.

Docker Composeのコマンド一覧は、以下のリンクから参照できます。

https://docs.docker.jp/v1.12/compose/reference/overview.html#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環境をセットアップするための記述です。

docker-compose.yml
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の詳細
  1. WordPressデータベースサービス (wordpress-db):
  • MySQL 5.7のイメージを使用しています。
  • platformlinux/amd64に設定しています。
  • mynetworkネットワークに接続しています。
  • データベースデータはwordpress_db_volumeという名前のボリュームに保存され、永続化されます。
  • コンテナが常に再起動するように設定しています。
  • 環境変数で、MySQLのルートパスワード、データベース名、ユーザー名、パスワードを指定しています。
  1. WordPressアプリケーションサービス (wordpress-app):
  • wordpress-dbサービスに依存しています(つまり、wordpress-appはwordpress-dbが起動するまで待機します)。
  • WordPressの公式イメージを使用しています。
  • mynetworkネットワークに接続しています。
  • ホストのポート8080をコンテナのポート80にマッピングしており、ブラウザでhttp://localhost:8080にアクセスすることでWordPressに接続できるようになっています。
  • 常に再起動するように設定されています。
  • 環境変数で、WordPressが使用するデータベースのホスト、名前、ユーザー名、パスワードを指定しています。
  1. ネットワーク (mynetwork):
  • ここで定義しているネットワークを介して、サービス同士が通信できるようになります。
  1. ボリューム (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を実行します。

さいごに

ざっくりまとめてみます。

  1. 「docker-compose.yml」に記述する
    稼動させたいコンテナ、ネットワーク、ボリュームの情報を「docker-compose.yml」ファイルに記述します。

  2. docker compose upでまとめて起動する
    docker-compose.ymlファイルを置いた場所をカレントディレクトリにし、docker-compose upを実行すると、まとめて起動させることができます。

  3. docker compose downでまとめて停止・破棄する
    docker compose downを実行すると、まとめてコンテナが停止し、ネットワークと共に破棄されます。ただし、ボリュームは残ります。

ここまで記事を読んでくださり、ありがとうございました!

今回は、Docker Composeについて紹介しました。私もまだまだ慣れていないため、今後も知識を養いながら、色々なことにチャレンジしてみたいです。

皆さんも素敵なハッピーDockerライフを!!!🌸

GitHubで編集を提案

Discussion