- Docker cpmposeとは
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose は YAML ファイルを使い、アプリケーションのサービスを設定します。コマンドを1つ実行するだけで、設定内容に基づいた全てのサービスを生成・起動します。
- 単一ホスト上で、複数の環境を 分離
Compose は プロジェクト名を使い、お互いの環境を 分離します。このプロジェクト名は、いくつもの異なる用途に利用できます。
- コンテナ作成時にボリューム データを保持
Compose は、サービスが利用するボリュームをすべて保持します。 docker-compose up の実行時、コンテナがそれ以前に実行されていたものであれば、以前のコンテナから現在のコンテナに向けてボリュームをコピーします。この処理において、ボリューム内に作成していたデータは失われません。
- 変更のあったコンテナのみ再作成
Compose はコンテナ生成時の設定情報をキャッシュに保存します。設定内容に変更のないサービスが再起動された場合、Compose はすでにあるコンテナを再利用します。コンテナの再利用とは、全体として環境への変更がすばやくできることを意味します。
主要なコマンド
- コンテナの作成、起動
docker compose up
docker compose up -d :デタッチモードで起動
docker compose up --no-start :イメージ作成のみで起動しない
docker compose up --build :コンテナ開始前にイメージを構築する
- コンテナの構築のみを行う
docker compose build
- コンテナの停止とコンテナの削除、ボリューム、イメージを削除
docker compose down
docker compose --remove-orphans :docker compose ps -a で表示される、docker compose downで削除されなかったコンテナを削除
- コンテナの停止
docker compose stop
+ 起動したコンテナへ任意コマンドの実行
docker exec サービス名 コマンド
ex: docker exec web sh :webに対して対話式プロンプトを実行
その他のコマンド:コマンドライン・リファレンス
- 実際にアプリケーション環境を構築する
- flask+redis環境:Try Docker Compose
- django+postgress環境:Quickstart: Compose and Django
- rails+postgress環境:Quickstart: Compose and Rails
- wordpress(php+mariadb環境):Quickstart: Compose and WordPress
ここでは一例でflask+redis環境を構築する
flask+redis環境構築
- プロジェクトディレクトリ作成
mkdir composetest
cd composetest
- Dockerfileの作成
vim Dockerfile
Dcokerfileの内容
# 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"]
- Composeファイル作成
vim compose.yaml
compose.yamlの内容
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
- pythonのソースコード(flaskで動作させるアプリ)とRequirements Fileを作成
requirements.txtはpipを使ってインストールするライブラリの一覧を記載する。
参考:pip User Guide
vim app.py
vim requirements.txt
app.pyの内容
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
requirements.txtの中身
flask
redis
- 作成した、DockerFile,Composeファイルをベースにコンテナを作成、起動
docker compose up
現状、ホストOS内のアプリのソースコード(app.py)を書き換えてもコンテナ内のファイルへ反映されないため、ホストOSのプロジェクトディレクトリをコンテナ内のボリュームとしてマウントして変更を反映されるようにする。
- Composeファイルの修正
修正後のcompose.yaml
services:
web:
build: .
ports:
- "8000:5000"
+ volumes:
+ - .:/code
+ environment:
+ FLASK_ENV: development
redis:
image: "redis:alpine"
- app.pyの修正
修正後のapp.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
- return 'Hello World! I have been seen {} times.\n'.format(count)
+ return 'Hello from Docker! I have been seen {} times.\n'.format(count)
- 既存のコンテナを停止、削除
docker compose down
- 変更を加えたコンテナの作成、起動
docker compose up