ITや趣味など気軽に投稿しています。

【Docker】Docker Composeを用いたコンテナ操作

今回は、Docker composeを用いたコンテナ操作を紹介します。

Docker Composeとは

Docker Composeとは、複数のDockerコンテナを同時に立ち上げるためのツールです。

以前Dockerfileから単一コンテナを起動する方法を紹介しましたが、実用面を考えると、複数コンテナを組み合わせた利用が多いのではないでしょうか。

Docker Composeでは、複数コンテナの起動をYAMLファイルに定義し、コマンド1つでまとめて起動することができます。

Docker Compose実践

では、Docker Composeを実践してみましょう。Docker Composeは、Dockerをインストールした際に一緒にインストールされているはずです。docker composeを実行してhelpが表示されることを確認してください。

docker compose

>>
Usage:  docker compose [OPTIONS] COMMAND

Define and run multi-container applications with Docker

Options:
      --all-resources              Include all resources, even those not
                                   used by services
....

今回は、Nginx+MySQLで簡易Webサーバーを構築してみます。

必要ファイルの準備

今回は、以下ファイル構成を準備します。

docker-compose.ymlには起動するコンテナを定義します。

demo-compose/
├── docker-compose.yml
├── nginx/
│   └── index.html
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx:/usr/share/nginx/html:ro
    depends_on:
      - db
    networks:
      - demo-net

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: demo_db
      MYSQL_USER: demo_user
      MYSQL_PASSWORD: demopass
    ports:
      - "3306:3306"
    networks:
      - demo-net

networks:
  demo-net:
    driver: bridge

各コンテナの定義はserviceで定義します。今回はweb(nginx)とdb(mysql)を定義しています。両者は通信できることが前提になるので、demo-netというネットワークを定義し、両コンテナをブリッジしています。

今回は、Docker Hubで公開されているイメージを利用します。

<!DOCTYPE html>
<html>
<head>
  <title>Docker Compose Demo</title>
</head>
<body>
  <h1>Hello, Docker Compose with Nginx and MySQL!</h1>
</body>
</html>

起動

Docker Composeの起動は、docker-compose.ymlのディレクトリで以下コマンドを実行します。

docker compose up -d

作成されたイメージを確認してみます。

docker images

>>
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        8.0       bfeba808a667   11 days ago   1.07GB
nginx        latest    84ec966e61a8   2 weeks ago   279MB

作成されたコンテナを確認してみます。

docker ps -a

>>
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS          PORTS                               NAMES
eba54eeefc46   nginx:latest   "/docker-entrypoint.…"   16 hours ago   Up 10 seconds   0.0.0.0:8080->80/tcp                docker_compose-web-1
670d149771c8   mysql:8.0      "docker-entrypoint.s…"   16 hours ago   Up 10 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   docker_compose-db-1

Dockerイメージ及びコンテナが作成され、起動していることが確認できました。

http://localhost:8080にアクセスすると、index.htmlの内容が表示されます。

http://localhost:8080

このように、複数のコンテナ起動をコマンド1つで実行できるのがDocker Composeのメリットです。

Docker Composeを使わない場合

上記の処理は、Docker Composeを使わずとも再現可能です。その場合のコマンドをご紹介します。

まず、ネットワークを作成します。

docker network create demo-net

続いて、MySQLコンテナを起動します。

docker run -d --name demo-mysql --network demo-net -e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_DATABASE=demo_db -e MYSQL_USER=demo_user -e MYSQL_PASSWORD=demopass -p 3306:3306 mysql:8.0

最後にNginxコンテナを起動します。

docker run -d --name demo-nginx --network demo-net -p 8080:80 -v "$(pwd)/nginx:/usr/share/nginx/html:ro" nginx:latest

このように、3つのコマンドが必要になるほか、コマンド内に環境変数等の定義が必要となり、複雑なコマンドになりがちです。

環境変数等もdocker-compose.ymlに定義でき、コマンド自体を簡素化できる点もDocker Composeの利点といえるでしょう。

まとめ

Docker Composeのメリットと、簡単な使い方を紹介しました。

複数コンテナを扱う際は必須となる場合が多いので、是非活用してください。