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を理解する⑧[Docker Composeについて]

Last updated at Posted at 2025-01-09

はじめに

こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です。今回の記事はDocker Composeについてです。連続した記事ですので、まだDockerの基本の記事を読んでいない方はそちらから先に読んでいただけますと幸いです。

①はこちら

前回の記事はこちら

bb53937f-cf16-442c-9080-14defbe54afe_720.png

Docker Composeとは

Docker Composeとは、複数のコンテナを一括管理・実行してくれる便利なツールです。
前回の記事ではDockerfileを作成しましたが、あれは一つのコンテナのイメージを作るための仕組みでした。今度はもう必要なコンテナを全部まとめちゃえ!という考え方です。

エンジニアというのはめんどくさがりですね。大事な要素ですが。

YAMLファイル

Docker Composeを動かすためにはYAMLファイルを作成する必要があります。
YAMLファイルは様々な設定ファイルに使われています。Dockerfileとはまた書き方が違うので注意して細かく見ていきましょう。

YAMLファイルの基本的な構文を見ていきましょう。

基本構文
# キーと値の関係
key: value

# リスト(複数の値に順序をつけて表現しているもの)
# 以下のような形
fruits:
  - apple
  - peach
  - banana

# ネスト(インデントで階層を表現し、関連したデータをグループ化する)
# 以下のような形
customor:
  name: ikemura
  age: unknown
  address:
    city: tokyo

基本的には上記の書き方を覚えておきましょう。
インデント(空白)は2文字分で下の階層に降りるイメージです。

簡単なYAMLファイルを書いて、実際に動かしてみよう!

まずはものすごく簡単なサンプルを使ってみましょう。
どのディレクトリでもいいので(ホーム以外)、docker-compose.ymlというファイルを作成して、以下のサンプル内容を書き込んでください。

サンプル

サンプル
version: "3.9"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

各項目を見ていく前に動かしてみましょうか。

YAMLファイルを実行
docker compose up

image.png

ではブラウザで検証してみましょう。

以下のような実行結果になっていればOKです。

image.png

サーバーをストップする際はCtrl + c(Win)、control + c(Mac)をご利用ください。

YAMLファイルの中身をみていこう

では早速中身の書き方と要素を見ていきましょう。

1. version

こちらはDocker Composeファイルのバージョンになります。Composeを動かすためのファイルにはバージョンがあり、少しずつ改良されてきています。

  • バージョン1系列:非推奨(使わない)
  • バージョン2系列:このバージョンも使われてはいる
  • バージョン3系統:基本的にここを使っているファイルが多め

と、ちょっと説明しましたが、実はこの記述いらなくなりました(笑)

なんで説明したのかというと、後方互換がしっかり残っているからです。
というかまだ世の中のdocker-compose.ymlファイルにはこの記述が残っているので、業務上見る機会も多いかな?と思って紹介しました。

実はupした時にも警告は出ているはずです。

警告文
WARN[0000] /Users/ren/Training/Linux/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion

内容は

WARN[0000] /Users/ren/Training/Linux/docker-compose.yml: 属性 version は廃止されました。

というものです。先ほどのサンプルからバージョン指定を消すと、この警告は現れなくなります。お時間があったらお試しください。

2. services

この記述はコンテナで定義する各種サービスを定義しています。
今回のサンプルにはwebと書かれていますが、特に決まった記述が必要なわけではありません。ただ、わかりやすい名前をつけるのが基本になります。
今回はwebサーバーなので、webとつけました。
一応命名のルールはあります。

  • サービス名は任意だが、英数字とハイフン(-)を使うのが一般的
  • サービス名は同じYAMLファイル内で一意である必要がある(名前被っちゃだめ)
こんな書き方でも大丈夫です
services:
  frontend:
    image: nginx:latest
  backend:
    build: ./backend
  database:
    image: mysql:latest

image:コンテナイメージのことです。
build:後述します。

3. build

ご自身で作成したDockerfileを指定できるものです。

基本的な要素
build:
  context: ./backend
  dockerfile: Dockerfile

ここでいう . ですが、要するにdocker-compose.ymlファイルがある場所を指しています。

想定するディレクトリ構成は以下のような形です。

ディレクトリ構成
project/
├── backend/
│   ├── Dockerfile
│   ├── app.py
│   └── requirements.txt
├── docker-compose.yml

4. ports

次はportsですが、これは名前の通りポート番号を指定できるところですね。
今まで直接コマンドで打ち込んでいたポートフォワーディング部分です。

基本的な書き方
ports:
  - "ホストポート:コンテナポート"

# Nginxなら
"8080:80"

# Flaskなら
"5000:5000"

もうコマンドから解放されてスッキリです。

5. volumes

ここはボリュームですね。覚えていますか?ボリューム。
忘れいている方は以下のリンクから復習しましょう。

基本的な書き方
volumes:
  - "ホストパス:コンテナパス"

# Flaskの場合
services:
  flask:
    build:
      context: .
    ports:
      - "5000:5000"
    volumes:
      - ./src:/app

これは以下のディレクトリ構成を考えています。

ディレクトリ構成
flask_project/
├── src/
│   ├── app.py
│   ├── requirements.txt
├── docker-compose.yml
├── Dockerfile
  1. Dockerfileはdocker-compose.ymlファイルと同じディレクトリにあるので .
  2. Flaskのデフォルトポート番号なので5000をマッピング
  3. volumesはapp.pyがあるディレクトリと、バインドマウントしている

一旦ここまでの要素だけで、ひとつのコンテナをComposeで動かせるようになりました。では実際にこのディレクトリを作成してみて動かしてみましょう!

環境構築
mkdir -p flask_project/src && touch flask_project/src/app.py flask_project/src/requirements.txt flask_project/docker-compose.yml flask_project/Dockerfile

Dockerfileの中身は以下を記述してみて下さい。

Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY ./src /app

RUN pip install --no-cache-dir -r requirements.txt

CMD ["python", "app.py"]

次にdocker-compose.ymlファイルは以下です。

docker-compose.yml
services:
  flask:
    build:
      context: .
    ports:
      - "5001:5000"
    volumes:
      - ./src:/app

srcディレクトリの中のapp.pyは以下を記述しましょう。

app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello Qiita!!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

requirements.txtはFlaskだけ記述お願いします。

requirements.txt
Flask

これで準備は整ったので、動かしていきましょう。

いざ実行
docker compose up

以下のような結果になりましたか?
image.png

この状態でコンテナは動いていますので、また以下のリンクからブラウザにアクセスしてみて下さい。

画面にHello Qiita!と出ていれば成功です!

おわりに

まずはここまで、Composeの基礎は学べたかと思います。
記事がかなり長くなりそうだったので、複数コンテナの連携は省きました。
Docker Composeは複数コンテナを繋いでこそ本領発揮です。次回の記事ではそちらをじっくりみていきましょう。

余談

最近グミをよく食べています。美味しい

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?