1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロから始めるDocker+Kubernetes実践 #2:docker-composeで複数コンテナを動かそう

Posted at

こんにちは!花木です。「ゼロから始めるDocker+Kubernetes実践」シリーズ第2回目は、複数のコンテナをまとめて管理する便利なツール、 docker-compose について解説します。


1. なぜdocker-composeを使うのか?

前回の記事では、docker runコマンドを使ってNginxコンテナを動かしました。
しかし、もしWebサイトのバックエンドにデータベース(例:MySQL)が必要になったらどうでしょう?

  1. まずNginxコンテナを起動し
  2. 次にMySQLコンテナを起動し
  3. 最後にそれぞれのコンテナ同士が通信できるように設定する…

というように、手動で複数のコンテナを管理するのは非常に手間がかかります。
また、コマンドが複雑になり、チームでの共有も難しくなります。

docker-composeは、これらの問題を解決するために生まれました。
YAML(ヤムル)形式の定義ファイルを一つ作成するだけで、複数のコンテナの起動、停止、通信設定などを一括で管理できるようになります。
これにより、アプリケーション全体を単一のコマンドで簡単に立ち上げられるようになります。


2. YAML形式の定義ファイルdocker-compose.ymlの定義項目一覧

docker-compose.ymlファイルは、主に以下の3つのキーで構成されます。

  1. version
    Composeファイルのフォーマットバージョンを指定します

  2. services
    実際に起動するコンテナ群の定義を行います

  3. volumes / networks
    コンテナ間で共有するデータやネットワークの設定を行います

ここでは、各キーに含まれる主要な定義項目を解説します。

version

versionキーには、Docker Composeのバージョンを指定します。バージョンによって利用できる機能が異なるため、適切なバージョン(例: '3.8')を選びます。


services

servicesキーには、起動したいコンテナをサービスとして定義します。各サービスは、**imageports**などの設定を持ちます。

  • build: Dockerfileからイメージをビルドする場合に、そのパスを指定します。context(Dockerfileの場所)やdockerfile(Dockerfileのファイル名)を詳細に指定することも可能です

  • image: コンテナのベースとなるDockerイメージ名を指定します。Docker Hubから自動でダウンロードされます

  • container_name: コンテナに任意の名前を付けます。指定しない場合は自動で生成されます

  • ports: ホストOS(サーバー)のポートとコンテナのポートを紐づけます。書式は"ホストポート:コンテナポート"です

  • volumes: コンテナとホストOSのファイルシステムを共有(マウント)します。書式は"ホストパス:コンテナパス"です
    コンテナは一時的な環境として設計されているため、一度停止したり削除したりすると、その内部に保存されたデータは消えてしまいます
    しかし、データベースのデータや、WEBアプリケーションのソースコードなど、永続的に保存したいデータも当然あります
    volumesを使うことで、ホストOS(サーバー)上の特定のディレクトリと、コンテナ内のディレクトリを紐付け、コンテナが削除されても、データはホストOS上に残り続けるため、何度でも同じデータを新しいコンテナで利用できます

  • environment: コンテナ内で使用する環境変数を設定します。パスワードなどの機密情報を渡す際によく利用されます

  • env_file: 環境変数をenvファイルから読み込みます。複数の環境変数を管理する場合に便利です

  • networks: サービスが参加するネットワークを指定します。同じネットワークに所属するコンテナは、互いに名前で通信できます

  • depends_on: コンテナの起動順序を指定します。例えば、Webサーバーが起動する前にデータベースが起動するように設定できます

  • command: コンテナ起動時に実行するコマンドを上書きします

  • entrypoint: コンテナのデフォルトの実行コマンドを上書きします

  • restart: コンテナが停止した際の再起動ポリシーを指定します

    • no: 再起動しない(デフォルト)
    • always: 常に再起動する
    • on-failure: エラーで終了した場合のみ再起動する
    • unless-stopped: ユーザーが手動で停止した場合を除き、常に再起動する
  • secrets: コンテナに機密情報(APIキー、パスワードなど)を安全に渡すための仕組みです

  • labels: コンテナにメタデータ(ラベル)を追加します。コンテナの分類や管理に役立ちます


volumes

volumesキーでは、データを永続化するためのボリュームを名前付きで定義します


networks

networksキーでは、コンテナ間の通信を可能にするためのネットワークを定義します


networksvolumesの「定義」と「利用」

docker-compose.ymlファイルには、**トップレベル(ファイル全体)volumesnetworksのセクションがあり、その一方で、各servicesの中にも同じ名前の項目があります。この違いは、「定義」「利用」**という概念で理解すると非常に分かりやすくなります。

  • トップレベルのvolumesnetworks
    これは、プロジェクト全体で使う共通の「リソース」を定義する場所です。例えるなら、家を建てるときに、家全体で使える「水道管」や「電気配線」を敷設する作業にあたります

  • サービス内のvolumesnetworks
    これは、トップレベルで定義した「リソース」を、個々のコンテナ(サービス)がどのように利用するかを指定する場所です。先ほどの例で言えば、「キッチン」や「お風呂場」といった個々の部屋に、敷設した「水道管」から蛇口を繋いだり、コンセントを設置したりする作業にあたります

この分業によって、設定ファイルがすっきりし、どのリソースが複数のサービスで共有されているかが一目でわかるようになります。


3. 演習:WordPressを動かしてみよう

WordPressはWebアプリケーションとデータベースが連携して初めて動作します。docker-composeを使ってこの構成を簡単に立ち上げてみましょう。

手順

docker-compose.ymlファイルの作成

プロジェクトのディレクトリを作成し、その中にdocker-compose.ymlというファイルを作成します。

mkdir my-web-app
cd my-web-app
vim docker-compose.yml

vimで開いたdocker-compose.ymlに以下の内容を書き込みます。

version: '3.8'  

services:
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db

volumes:
  db_data:
  wordpress_data:

この設定ファイルでは、dbwordpressという2つのサービスを定義しています。wordpressは、WORDPRESS_DB_HOSTという環境変数で、データベースであるdbコンテナにアクセスするよう設定しています。

YAMLファイルの主な設定項目解説:

  • services:

    • このセクションには、アプリケーションを構成する個々のサービス(コンテナ)を定義します。今回は、dbwordpressという2つのサービスがあります
  • dbサービス:

    • image: mysql:8.0: MySQLのバージョン8.0イメージをベースとして使用します
    • restart: always: データベースは常に稼働しているべきサービスなので、コンテナが停止したら常に自動で再起動するように設定します
    • environment: コンテナ内の環境変数を設定します。ここでは、WordPressがデータベースに接続するために必要な、ルートパスワードデータベース名などを指定しています
    • volumes: トップレベルで定義したdb_dataという名前のボリュームを、コンテナ内の/var/lib/mysqlというディレクトリにマウントしています。これにより、データベースのデータがコンテナから削除されても永続的に保存されます
  • wordpressサービス:

    • image: wordpress:latest: WordPressの最新版イメージを使用します
    • restart: always: ウェブアプリケーションも常に稼働しているべきなので、dbサービスと同様に自動再起動を設定します
    • ports: "8080:80": ホストOSの8080番ポートへのアクセスを、コンテナ内の80番ポートに転送します
    • environment: WordPressアプリケーションがデータベースに接続するための設定を環境変数で渡します
      • WORDPRESS_DB_HOST: db:3306: ここが最も重要なポイントです。**db**は、docker-composeが自動的に作成するネットワーク内で、データベースコンテナの名前として機能します。これにより、WordPressコンテナはIPアドレスを気にすることなく、dbという名前でデータベースにアクセスできます。3306はMySQLのデフォルトポートです
    • volumes: トップレベルで定義したwordpress_dataボリュームを、コンテナ内の/var/www/htmlにマウントしています。WordPressのアップロードファイルやプラグインはこの場所に保存されます
    • depends_on: - db: wordpressサービスはdbサービスが起動してからでないと動作できないため、起動の依存関係を定義しています
  • volumes:

    • db_data:wordpress_data:という、名前付きのボリュームを定義しています。これらのボリュームは、ホストOS上にボリューム名と同じ名前のディレクトリが作成され、コンテナが削除されてもデータが消えないようにします

② コンテナの起動

docker-compose.ymlを保存したら、以下のコマンドを実行します。

sudo docker compose up -d
  • up: docker-compose.ymlに定義されたすべてのサービスを起動します
  • -d: コンテナをバックグラウンドで実行(detached mode)します

③ 動作確認

起動したコンテナの状態を確認します。

sudo docker compose ps

Staterunningになっていれば成功です。

Webブラウザから http://[あなたのサーバーのIPアドレス]:8080 にアクセスしてみてください。WordPressの初期設定画面が表示されるはずです。この時点で、wordpressコンテナがdbコンテナに接続して動作していることが確認できます。

停止と削除

コンテナを停止して削除するには、以下のコマンドを実行します。

sudo docker compose down

4. まとめと次のステップ

今回は、docker-composeを使って複数のコンテナをまとめて管理する方法を学びました。複雑なコマンドを何度も打つ必要がなくなり、チームでの開発・運用が格段に効率化されることを実感できたのではないでしょうか。

次回は、このシリーズの最終章として、Kubernetesを導入し、docker-composeでは管理しきれない大規模なシステムを、より高度な方法で管理する方法を解説します。Dockerで作成したコンテナを、Kubernetesという強力なオーケストレーションツールで管理する方法を学びましょう。お楽しみに!


👤 プロフィール

セントラルソフト株式会社
DXビジネス事業本部 所属
花木 光司

  • 🚴 サイクリング好き
  • 🪡 レザークラフト初心者
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?