Docker:【Dockerファイル,composeファイル】の例


はじめに

ここに書いたこと

  • Dockerファイルとcomposeファイルの例
  • 内容の説明については概要レベル
  • それぞれDockerで重要な構成ファイルの具体例からイメージを広げる

2つのファイルの概要

  • Dockerファイル
    • アプリ環境を定義する
    • して、どこでも再現できるようにする
    • このファイルの記述に沿ってコンテナが作成される
  • composeファイル
    • アプリを構成するサービスを定義する
    • 分離された環境(コンテナなど)をつなぐ
    • そうすると一緒に実行できるようになる

Dockerファイルの例

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
  • ベース環境
    • Python3.7がインストールされているAlpine(Linux)
    • Docker HUBから入手する
  • 環境変数を設定
    • Webフレームワークのflaskの設定
  • 必要なツールをインストール
    • requirements.txtに記載
    • pip install 実行
    • ここではflaskとredis
  • Webのリスンポート設定
    • 5000
  • コンテナ既定のコマンド
    • flaskの実行を設定
  • このDockerファイルの記述に沿ってDockerイメージを作成する
  • 補足
    • flask …… シンプルなWebフレームワーク
    • redis …… インメモリDB

composeファイルの例

web+db(最もシンプル)

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
  • webの設定
    • buildの場所は「.」
    • portを8000→Dockerファイルでenvにしていた5000
  • redisの設定
    • 使うコンテナイメージ設定

web+db(ちょっとカスタマイズ程度)

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
  • volumesの設定
    • プロジェクトのディレクトリとして「/code」マウント
    • イメージを再構築することなくコードをリアルタイムで変更できるようになる
      • ここにプログラムを入れておけばいい
  • environmentの設定
    • 環境変数の設定
    • flaskが使うFLASK_ENVに「development」を指定
      • 「flask run」の時に、「development」で実行
      • つまり、毎回コードをリロードしてから実行するようになる

web+db(規模が大きいとこんな感じ)

version: "3.9"
   
services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db
  • 例えば、Django+PostgreSQLのような構成にできる
  • さっきの
    • flaskがDjango
      • Django …… Pythonで作られたwebフレームワーク
    • redisがPostgreSQL
      • PostgreSQL …… 普通のDB

リファレンス


Posted by futa