コンテンツにスキップ

Docker

開発時の注意

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

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

更新が反映されない

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

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

マルチステージビルドによる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実行

  • 下記のrazorpagesは何でもよい.
1
2
docker build -t razorpages .
docker run -it --rm -p 80:80 razorpages

dokcer

build M1 Macx86_64ビルドする

1
2
3
4
5
6
docker build -t webapi --target final .
docker run -it --rm -p 80:80 webapi


docker buildx build -t webapi --platform linux/amd64 --target final .
docker run -it --rm -p 80:80 webapi

Linuxコンテナにログインする

1
docker container exec -it <container-name> bash
  • 次のコマンドでもコンテナにログインできる
1
docker run --rm -it --name <container-name> <image-name> bash

イメージからコンテナを実行

1
docker run --rm --name <container-name> <image-name> <command>

稼働中のコンテナでコマンドを発行

1
2
docker container exec <container-id> <command>
docker container exec -it <container-id> bash

コンテナ情報の確認

1
2
docker container ls
docker container ls -a # 停止しているコンテナも表示する

コンテナを実行

1
docker run --rm <image-tag-name>

コンテナの削除

1
2
docker ps -a
docker rm <container-id>

コンテナをビルド: タグつき

  • .はカレントディレクトリのDockerfileを使うという意味.
1
docker build -t <tag-name> .

docker compose

run/up/build/createの違い

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

基本コマンド

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 Network not Found

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

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

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

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

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

nginx+node.jsの連携

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

コンテナをリビルドする

1
docker compose up --build

コンテナにログインする

  • URL
  • docker psで立ち上がっているコンテナを調べる
  • Namesの値を調べる
  • docker exec -it <container-name> /bin/bashでログインできる

ビルド時に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

ローカル開発用にメールサーバーを立てる

  • MailCatcher
  • 1025ポートあてにメールを送ると1080ポートに立ったサイトでメールが確認できる
1
2
3
4
5
6
7
8
version: '2'
services:
 smtp:
  image: schickling/mailcatcher
  container_name: 'smtp'
  ports:
   - "1080:1080"
   - "1025:1025"
1