mizdra's blog

ぽよぐらみんぐ

Dockerを学んだ際の備忘録

概要

お盆の間にDockerについて勉強した序にDockerをどう学んでいったか (どの記事を読んだか, どういう流れで学んだか) を軽く纏めておきます.

目標

以前作ったWebアプリケーション (タイマー) をDockerに載せる.

学習の流れ

実際にDockerizeしてみる

DockerでのNodeアプリ構築で学んだこと | インフラ・ミドルウェア | POSTD で紹介されている手法をベースにDockerizeしてみました.

コンテナの起動

$ git clone https://github.com/mizdra/emtimer.git
$ git checkout 41d2e3e

# imagesのビルド
$ docker-compose build

# プロダクション用
## ソースコードをプロダクション向けにビルドしてhttp-serverでserveする
$ docker-compose -f docker-compose.prod.yml up

# 開発用
## webpack-dev-serverが立ち上がる
## ファイルの変更を検知したら再ビルド&自動リロードされる
$ docker-compose -f docker-compose.yml up

とりあえずやってみましたが設定ファイルを書く際に考えることが多いかなと感じました. まあでもキャッシュを活用しようとすると少し複雑になるのは仕方なさそう. ちょろっとDockerizeするだけならもっと設定ファイルをシンプルにしても良いかもしれません. あと気になったのは COPYUSER の影響を受けないので別途 RUN chown -R app:app $HOME/* する必要があるところ. ただ, この問題については既にPRが立っているのでその内改善されるかも.

ちなみにコンテナ起動時に CMD ["yarn", "run", "prod:start"] の代わりにshellを差し込めば対話的に好きなように作業できます. 便利.

# shellを差し込んで起動
$ docker-compose -f docker-compose.yml run emtimer bash

# 試しにpackageを追加してみる
app@XXXX:~/emtimer$ yarn add moment

# 追加されていることを確認
app@XXXX:~/emtimer$ ls -1 node_modules | grep moment
moment

app@XXXX:~/emtimer$ exit

# imageのnode_modulesはvolumeなのでホストOS上からは見えない
$ ls -1 node_modules | grep moment

# package.jsonやyarn.lockはbind mountsの機能により更新されているので
# yarn installで追加されたパッケージをインストールできる
$ yarn install
$ ls -1 node_modules | grep moment
moment

多くの場合, 開発時はdocker上で開発サーバを立ててホストOS上からエディタでソースコードを編集するような形を取ることになります. その際にホストOS上に node_modules の中身が存在しないとエディタのプラグイン(eslintなど)がエラーを吐くので, 適時ホストOS上でも yarn install すると良いと思います. 多分… *1

おわりに

ヨッシャDockerやるぞという気持ちが湧いてきたので1からDocker学んでみました. 2日くらい掛かりましたがそれなりに勉強になったので満足度高めでした.

おわり.

*1:知見が殆どないのでこれで合っているか分からず… もっと良い解決法あれば教えて頂けると :pray: