コンテンツにスキップ

Docker

Dockerfile prod/dev切り替え

  • URL
  • Dockerfile.prodDockerfile.devを作る
  • docker composeを使うならdocker-compose-prod.yamldocker-compose-dev.yamlを作る
  • yamlの中で.prod.devを適切に呼び分ける
  • コンテナの作成・起動でもファイルを指定する
1
2
docker compose -f docker-compose-dev.yaml  up -d
docker compose -f docker-compose-prod.yaml up -d

Dockerfile 更新が反映されない

  • URL
  • 次のコマンドでビルドし直す
1
2
docker compose build --no-chache
docker compose up --build

Dockerfile ベストプラクティスTop20: 2021

Dockerfile マルチステージビルドによるprod/dev切り替え

  • URL
  • 次のようなDockerfileを作ればよい
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
FROM python:3.6 as base
RUN apt-get update && apt-get upgrade -y
RUN pip install pipenv pip
COPY Pipfile ./


FROM base as dev
RUN pipenv install --system --skip-lock --dev
ENV FLASK_ENV development
ENV FLASK_DEBUG 1

FROM base as prod
RUN pipenv install --system --skip-lock
ENV FLASK_ENV production

docker compose run/up/build/createの違い

コマンド 処理内容 備考
run イメージ・コンテナを作成・起動 1つのサービスだけ
(1つのサービスに対して1つのコマンドだけ)
up イメージ・コンテナを作成・起動 depends_onやlinksで紐づいているコンテナもまとめて起動
build イメージ作成
create コンテナ作成

docker compose 基本コマンド

1
2
3
4
5
6
docker compose up -d   # 起動
docker compose logs -f # ログの確認
docker compose stop    # コンテナ停止
docker compose down    # コンテナ停止・削除
docker compose exec app bash # appコンテナにログイン
docker compose exec mysql mysql -uroot -p # mysqlサーバーにログイン

docker compose Docker Network not Found

  • URL
  • docker-compose up --force-recreateで治ったことがある

docker compose MySQLでテスト用にデータベースを複数生成する

  • 参考
  • initスクリプトを使う

docker compose MySQLの起動を待つ

  • 参考
  • 起動を待つ側のdepends_oncondition: service_healthyをつける
  • データベース側では次のようなヘルスチェック設定をつける
1
2
3
4
5
6
  dbc:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uuser", "-ppass"]
      timeout: 20s
      retries: 10

docker compose nginx+node.js(express)+mysql(prisma)連携の参考

docker compose nginx+node.jsの連携

docker compose 複数のデータベースを作る

docker compose コンテナをリビルドする

1
docker compose up --build

開発時の注意

  • 当たり前のことをきちんとやる
  • docker compose upのログをきちんと見て問題を一つずつ潰す
  • docker psでどのコンテナが立ち上がっているか確認する
    • M1 MacのDockerでそもそもMySQLのコンテナが起動していなかったことがある

ビルド時にno matching manifest for linux/arm64/v8 in the manifest list entries

  • URL
  • M1 Macでの問題: M1のCPUはlinux/arm64/v8で使おうとしたimageがこれに対応していない
  • docker-compose.ymlを適切に修正
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: "3"

services:
  mysql:
    image: mysql:5.6
    platform: linux/amd64 # ここを追加
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: rootpass