入門docker 復習(8)

プロダクションでの活用

プロダクションへの導入

  1. ローカル環境のDocker化

    • チームの開発環境を統一する
  2. テスト/CIへの導入

  3. ステージングへの導入
    • 本番前に動作確認する
  4. 本番への導入

Tips

docker-compose

環境変数への読み込み

  • docker-composeの起動時に渡す
    • docker-compose up -e MYSQL_PASSWORD=mypassword
  • docker-compose.yamlへ記述
version: '3.7'

services:
  app:
    build: .
+   environment:
+     - MYSQL_PASSWORD=mypassword  
  • シェル変数から読み込み
version: '3.7'

services:
  app:
    build: .
    environment:
-     - MYSQL_PASSWORD=mypassword
+     - MYSQL_PASSWORD=${MYSQL_PASSWORD}
$ export MYSQL_PASSWORD=mypassword
$ docker-compose up
  • ファイルから読み込む
version: '3.7'

services:
  app:
    build: .
-   environment:
-     - MYSQL_PASSWORD=mypassword
+   env_file:
+     - .env
#.env
MYSQL_PASSWORD=mypassword
$ docker-compose up

ホストとコンテナ間のファイル共有の速度向上

オプション

  • consistend(default)

    • ホストとコンテナ間の一貫性を担保するオプション
    • オーバーヘッドが大きいため、ファイルの更新が発生する場合は非推奨
  • cached

    • ホストの更新を優先する
    • サービスコードのようにホスト側で更新するケース
  • delegated

    • コンテナ側の更新を優先する
    • MYSWLのようにコンテナからホストへの書き込みしかしないケース
    • コンテナ上からライブラリのインストールをするコマンド(composer install,npm install)を使用する場合

標準入力を有効にする

  • デバッグに使用したい場合、明示的に設定可能
  services:
    rails:
      build: .
  +   tty: true
  +   stdin_open: true
      ports:
        - '3000:3000'
      volumes:
        - './:/app:cached'

Multi-Stage Buildのローカル活用

  • 過去のレイヤーを使用したい場合、明示的に設定可能
ersion: '3.7'

services:
  app:
    build:
      context: .
+     target: build
    volumes:
      - ./:/go/app
    command: go run main.go

docker-compose間のnetworkの共有

  • マイクロサービス化によってフロントとバックバックエンドでリポジトリが異なる場合がある
  • ネットワークを共有する必要がある

backend

  • internalとexternalのネットワークを用意する
    • internalはリポジトリ内の内部的な通信ネットワーク(MySQLのようにデータストアを不用意に用意しないために使用)
    • externalはリポジトリ外へ公開するためのネットワーク
version: '3.7'

services:
  api:
    build: .
    ports:
      - 8000:80
+   networks:
+     - internal
+     - external

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
+   networks:
+     - internal

+networks:
+  internal:
+    internal: true
+  external:
+    name: api_network

web

version: '3.7'

services:
  web:
    #XXX APIアクセスはcurlで代用。
    image: amazonlinux:2
    command: curl api:80

+networks:
+  default:
+    external:
+      name: api_network