スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【TODOリスト 第9回】本番デプロイ用のDocker環境

久しぶりにTODOリストを作っていきます。

yushi-dev.hatenablog.com

今回は、本番デプロイができるようなDocker環境を用意します。

開発環境用のDocker環境

そもそもですが、Dockerは開発環境用と本番環境用で2つの使い方ができると思っています。

開発環境用では、最低限言語(Go、node.js、...)が動く環境があれば十分です。

それ以外のプロダクトコードなどは、docker-composeを使ってマウントします。

今回のプロジェクトだと、フロントエンドは生のnodeイメージ、バックエンドもgolangイメージにライブラリだけをinstallしたものです。

(docker-compose.yml)

services:
  frontend:
    image: node:14-alpine
    ports:
      - 3000:3000
    volumes:
      - ./frontend:/frontend:cached
    tty: true
    working_dir: /frontend

  backend:
    build: ./docker/backend
    ports:
      - 8000:8000
    volumes:
      - ./backend:/go/src/app:cached
    tty: true
    working_dir: /go/src
(開発環境の、backendのDockerfile)

FROM golang:1-alpine

RUN apk add --no-cache git

RUN go get -u github.com/go-sql-driver/mysql \
  github.com/gin-gonic/gin \
  github.com/gin-contrib/cors

本番環境のDockerfile

一方本番環境用のDocker環境では、イメージだけでサーバが動作するように作ります。

ここで活用するのがDockerのマルチステージビルドです。

https://docs.docker.com/develop/develop-images/multistage-build/

マルチステージビルドでは、実際にデプロイするイメージ(下記の例の、deploy-stage)と、デプロイするファイルを用意するイメージ(build-stage)を分けるものです。

デプロイするイメージに含めるファイルを最低限にすることができます。

本番環境・Backend

下記は、backendのDockerfileです。

build-stageステージでは、依存ライブラリをダウンロードし実行ファイルを生成します。Goの場合は、deploy-stageにはGoの動作環境が不要なため、alpineイメージで十分です。

(本番環境の、backendのDockerfile)

# build-stage

FROM golang:1-alpine as builder

RUN apk add --no-cache git

RUN go get -u github.com/go-sql-driver/mysql \
  github.com/gin-gonic/gin \
  github.com/gin-contrib/cors

WORKDIR /go/src

COPY backend/todo /go/src/todo

RUN go build -o /go/bin/todo todo


# deploy-stage

FROM alpine

COPY --from=builder /go/bin/todo /app

ENTRYPOINT ["/app"]

本番環境・Frontend

フロントエンドでも同様にマルチステージビルドを行います。

build-stageではnpmライブラリのダウンロードとviteによるbuildを行います。

deploy-stageでは、nginx(Webサーバ)を使ってbuildした静的ファイルの公開を行います。

(本番環境の、frontendのDockerfile)

# ref. https://cli.vuejs.org/guide/deployment.html#docker-nginx

# build-stage

FROM node:14-alpine as builder

RUN mkdir /frontend

WORKDIR /frontend

COPY frontend .

RUN yarn && yarn build


# deploy-stage

FROM nginx:1-alpine

COPY --from=builder /frontend/dist /frontend

COPY docker/prod/frontend/nginx.conf /etc/nginx/nginx.conf

まとめ

Docker環境の使い分けやマルチステージビルドの実例を紹介しました。