【Docker】 Docker ~ 基本編 / docker-compose.yml ~

■ はじめに

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

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

目次

【1】docker-compose.yml の書き方
 01)version
 02)services
 03)depends_on
 04)ports
 05)enviroment / env_file
 06)privileged
 07)container_name
 08)image
 09)hostname
 10)volumes
 11)build

【2】サンプル
 A)ファイル構成
 B)サンプル
 C)実行および確認

【1】docker-compose.yml の書き方

01)version

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

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

version: "3.8"

02)services

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

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

03)depends_on

* Serviceの依存関係

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

04)ports

* ポートの指定

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

05)enviroment / env_file

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

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

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

06)privileged

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

privileged: true

07)container_name

* コンテナ名

container_name: "Hello-World"

08)image

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

09)hostname

* ホスト名を指定

hostname: "localhost"

10)volumes

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

11)build

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

【2】サンプル

A)ファイル構成

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

B)サンプル

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)

C)実行および確認

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 ~ 基礎知識編 ~
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
Docker ~ 基本編 / docker-compose ~
https://dk521123.hatenablog.com/entry/2020/04/11/000000