React、Go言語で作ったアプリをDockerで構築する。
いままで作ってきたアプリ(Go, React)を、Dockerizeしていきます。
Dockerfileなどを作る中で、下記のリンクを参考にしました。
- Node公式サイトのDockerize方法
https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ - ReactアプリのDockerlize
https://medium.com/ai2-blog/dockerizing-a-react-application-3563688a2378 - Go言語のアプリとDockerで行うテスト、デプロイ方法
https://semaphoreci.com/community/tutorials/how-to-deploy-a-go-web-application-with-docker# - GoとPostgreSQLの連携をDockerで構築
https://github.com/variadico/hellodocker - Docker image, container, volumeのremoveの仕方
https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430
Reactの場合
前提として、いままで作ってきたReactアプリの殆どは、create-react-appを通して出来たものになっています。
また今回は、npm-shrinkwrap.json(依存ライブラリーのversionの統一ファイル)は、考えないで行います。
Dockerfile
FROM node:6.9.4# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install# Bundle app source
COPY . /usr/src/app# Build and optimize react app
RUN npm run buildEXPOSE 3000# defined in package.json
CMD [ "npm", "start" ]
上の処理はDockerに、次の処理を指示しています。
- nodeイメージをDocker Hubから取ってきます。
- Dockerのコンテナー(イメージ)内にディレクトリを作成し、その中で作業、処理を行います
package.json
(app dependencies)を上でつくったディレクトリにコピーをし、依存パッケージをインストールします。- パッケージのインストールが終わった後に、ソースコードをコピーします。
- アプリをbuildします。
- コンテナーのポート3000をアプリにbindします。
- コンテナーが動作をし始めた時(docker run)に、行うコマンドの指示になります。つまり、アプリの起動を指示しています。
あとは、このDockerfileを基にイメージを作成し、立ち上げるコマンドを次のように打ちます。
// It builds the image
$ docker build -t IMAGE_NAME .// It confirms you that the image exist with the added name
$ docker images// In background, docker run this image with binding local port 3000 to container's
$ docker run -d -p 3000:3000 IMAGE_NAME
また次の様なignoreファイル等も作成し、イメージ内に入れるものを制限します。
以上がReactアプリをDockerで構築する方法になります。
次にGoアプリに移ります。
といっても、Dockerfileの書き方自体は、そんなに違いはありません。
例):
FROM golang:1.8.3# Copy the local package files to the container’s workspace.
ADD . /go/src/github.com/Akitsuyoshi/go-json/# Install our dependencies
RUN go get github.com/gorilla/mux# Install api binary globally within container
RUN go install github.com/Akitsuyoshi/go-json/api# Set binary as entrypoint
ENTRYPOINT /go/bin/api# Expose default port (8081)
EXPOSE 8081
処理内容は、Reactで見たものと同様になります。
ただしGoはサーバー言語であることもあり、他のサービス(DBなど)と連携した処理が多くなります。
例えば、次のcomposeファイルの例は、GoとPostgreSQLを一緒に使うものになります。
docker-compose.yml
version: '3.1'services:database:
image: postgres:9.5.9
ports:
- 5432:5432
environment:
- POSTGRES_USER=
- POSTGRES_PASS=
- POSTGRES_DB=
go:
build: ./
ports:
- 80:8080
links:
- database
volumes:
- .:/go/src/github.com/Akitsuyoshi/goWithDB
上のファイルで環境変数を設定して、DBに渡しています。(そのままDB内の、user/pass/dbが設定されます。)
また、Goアプリ側でDBとの連携を links
で設定することで、同じネットワーク上でdatabaseコンテナーとアプリとが通信が行えます。
詳しくは、公式サイトが一番わかりやすいと思います。
後は、下のコマンドでイメージをbuild, runすればアプリが起動します。
$ docker-compose build && docker-compose up
感想
今回作った、Dockerのイメージですが、例えばDockerのキャッシュの仕組み等を調べたりしてもっと効率化できる点があると思いました。
またGoのアプリに関しては、後でnginx
などをイメージにいれて、サーバー、アプリ、DBの連携の練習をしていきたいですね。