久しぶりにTODOリストを作っていきます。
今回は、本番デプロイができるような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環境の使い分けやマルチステージビルドの実例を紹介しました。