【Docker】Docker compose ~ docker-compose.yml ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/04/11/000000

の続き。
今回は、docker-compose.yml の書き方について、掘り下げる。

目次

【1】docker-compose.yml の大項目
 1)version
 2)services
 3)networks
 4)volumes
【2】その他の構成
 1)depends_on
 2)ports
 3)enviroment / env_file
 4)privileged
 5)container_name
 6)image
 7)hostname
 8)build
【3】サンプル
 1)ファイル構成
 2)サンプル
 3)実行および確認

【1】docker-compose.yml の大項目

* 以下で構成。
~~~~~~
1)version
2)services
3)networks
4)volumes
~~~~~~

イメージ

version: "3" # Versionを書く
services: # コンテナ情報を書く
networks: # ネットワーク情報を書く
volumes: # ボリューム情報を書く

1)version

* docker-composeのバージョン
* 以下で最新を選べばよさそう

https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix

version: "3.8"

2)services

* 立ち上げる docker コンテナ(子要素に複数書く)

version: "3.8"
services:
  app: # サービス名 "app" を定義
    # ...
  db: # # サービス名 "db" を定義
    # ...

3)networks

* ネットワーク情報を記載

4)volumes

* パスをボリュームとしてマウント

【2】その他の構成

1)depends_on

* Serviceの依存関係

version: "3.8"
services:
  app:
    # ...
    # dbが依存していることを明示指定している
    depends_on:
      - db
  db:
    # ...

2)ports

* ポートの指定

    # ...
    ports:
      # ポート5000(外部)がきたら、ポート5000(内部)を使う
      - 5000:5000
    # ...
    ports:
      # ポート15432(外部)がきたら、ポート5432(内部)を使う
      - 15432:5432

3)enviroment / env_file

* どちらも環境変数の追加
* env_file は、外部ファイルから追加する

environment:
  - HELLO: "Hello"
  - WORLD: ${WORLD}
env_file:
  - ./enviroment.env

# [enviroment.env]
# USER_NAME="user001"
# USER_PASSWORD="password"

4)privileged

* 特権(privileged)モードになり、
 Dockerコンテナ内でさらにDockerコンテナを立てられる

privileged: true

5)container_name

* コンテナ名

container_name: "Hello-World"

6)image

* Docker イメージ名を指定
* ローカルに存在しなければ、イメージをリモートからpullする

7)hostname

* ホスト名を指定

hostname: "localhost"

8)build

* Dockerfile のあるディレクトリのパスを指定

【3】サンプル

1)ファイル構成

develop/
   |- docker-compose.yml
   |- Dockerfile
   |- requirements.txt
   |- app/
   |  |- app.py
   |- conf/
      |- db.env

2)サンプル

docker-compose.yml

version: "3.8"
services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    command: python3 app/app.py
    depends_on:
      - db
    volumes:
      - ./app:/app
    ports:
      - 5000:5000
  db:
    image: postgres:latest
    container_name: postgresql
    ports:
      - 15432:5432
    env_file:
      - ./conf/db.env
    environment:
      POSTGRES_USER: root
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
    restart: always
    user: root
    volumes:
      - ./initdb:/docker-entrypoint-initdb.d
volumes:
  database:
    driver: local

Dockerfile

FROM ubuntu:latest

RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false update && apt-get install python3 python3-pip -y

WORKDIR /code
ADD requirements.txt /code
RUN pip3 install -r requirements.txt

RUN mkdir /app

conf/db.env

POSTGRES_PASSWORD=password

requirements.txt

Flask

app/app.py

from flask import Flask
import os
import socket

app = Flask(__name__)

@app.route("/")
def hello():
  html = "<h3>Hello World!</h3>"
  return html.format()

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

3)実行および確認

[1] コンテナを立ち上げる

docker-compose up -d

[2] ブラウザで確認

* 以下のURLでブラウザ表示する

http://localhost:5000/

参考文献

https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04
https://y-ohgi.com/introduction-docker/3_production/docker-compose/

関連記事

Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000
Docker compose ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/05/21/222910
Docker compose ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000
Docker compose ~ docker-compose.yml ~
https://dk521123.hatenablog.com/entry/2020/12/18/152949
Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker ~ 基本編 / Dockerfile ~
https://dk521123.hatenablog.com/entry/2020/04/14/000000
Docker ~ 基本編 / dockerコマンド ~
https://dk521123.hatenablog.com/entry/2020/04/13/000000