0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Dcoker composeで遊ぶ

Last updated at Posted at 2023-05-05
  • Docker cpmposeとは

Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose は YAML ファイルを使い、アプリケーションのサービスを設定します。コマンドを1つ実行するだけで、設定内容に基づいた全てのサービスを生成・起動します。

  • 単一ホスト上で、複数の環境を 分離

Compose は プロジェクト名を使い、お互いの環境を 分離します。このプロジェクト名は、いくつもの異なる用途に利用できます。

  • コンテナ作成時にボリューム データを保持

Compose は、サービスが利用するボリュームをすべて保持します。 docker-compose up の実行時、コンテナがそれ以前に実行されていたものであれば、以前のコンテナから現在のコンテナに向けてボリュームをコピーします。この処理において、ボリューム内に作成していたデータは失われません。

  • 変更のあったコンテナのみ再作成

Compose はコンテナ生成時の設定情報をキャッシュに保存します。設定内容に変更のないサービスが再起動された場合、Compose はすでにあるコンテナを再利用します。コンテナの再利用とは、全体として環境への変更がすばやくできることを意味します。

引用:Docker Compose 概要


主要なコマンド

  • コンテナの作成、起動
docker compose up
docker compose up -d :デタッチモードで起動
docker compose up --no-start :イメージ作成のみで起動しない
docker compose up --build :コンテナ開始前にイメージを構築する

参考:docker compose up

  • コンテナの構築のみを行う
docker compose build

参考:docker compose build

  • コンテナの停止とコンテナの削除、ボリューム、イメージを削除
docker compose down
docker compose --remove-orphans :docker compose ps -a で表示される、docker compose downで削除されなかったコンテナを削除

参考:docker-compose down

  • コンテナの停止
docker compose stop

参考:docker compose stop

+ 起動したコンテナへ任意コマンドの実行

docker exec サービス名 コマンド
ex: docker exec web sh :webに対して対話式プロンプトを実行

その他のコマンド:コマンドライン・リファレンス

  • 実際にアプリケーション環境を構築する
  1. flask+redis環境:Try Docker Compose
  2. django+postgress環境:Quickstart: Compose and Django
  3. rails+postgress環境:Quickstart: Compose and Rails
  4. 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"]

参考:Dockerfile reference

  • 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
  • アプリの動作確認として「localhost:8000」へアクセス
    image.png

現状、ホスト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
  • アプリの動作確認として「localhost:8000」へアクセス
    image.png
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?