React、Go言語で作ったアプリをDockerで構築する。

いままで作ってきたアプリ(Go, React)を、Dockerizeしていきます。

Dockerfileなどを作る中で、下記のリンクを参考にしました。


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 build
EXPOSE 3000
# defined in package.json
CMD [ "npm", "start" ]

上の処理はDockerに、次の処理を指示しています。

  1. nodeイメージをDocker Hubから取ってきます。
  2. Dockerのコンテナー(イメージ)内にディレクトリを作成し、その中で作業、処理を行います
  3. package.json (app dependencies)を上でつくったディレクトリにコピーをし、依存パッケージをインストールします。
  4. パッケージのインストールが終わった後に、ソースコードをコピーします。
  5. アプリをbuildします。
  6. コンテナーのポート3000をアプリにbindします。
  7. コンテナーが動作をし始めた時(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の連携の練習をしていきたいですね。