概要
お盆の間にDockerについて勉強した序にDockerをどう学んでいったか (どの記事を読んだか, どういう流れで学んだか) を軽く纏めておきます.
目標
以前作ったWebアプリケーション (タイマー) をDockerに載せる.
学習の流れ
- 開発環境をDockerに乗せる方法とメリットを3ステップで学ぶチュートリアル - Qiita
- とりあえずこれを一通りやって感覚を掴んだ
- image, containerの作成や起動の方法をザックリと確認した
- DockerでのNodeアプリ構築で学んだこと | インフラ・ミドルウェア | POSTD
- Node.jsで書かれたアプリケーションをDockerに載せる方法が詳細に書かれていそうなので読んだ
- images, containersの違いがよく理解できていなかったので一旦読むのを中断した
- Get Started, Part 1: Orientation and setup | Docker Documentation
- VMとcontainersの違い, 思想について確認
- 超入門Docker - @IT
- Dockerのアーキテクチャを確認
- Dockerコンテナとイメージの仕組みを視覚化してみた | FAworksブログ
- imagesとcontainersの違い, それぞれのコマンドの役割についてザックリと理解した
- Dockerイメージの理解とコンテナのライフサイクル
- imagesとcontainersの理解が不安だったので追加で資料を読んだ
- Get Started, Part 1: Orientation and setup | Docker Documentation
- volumesがよく理解できていなかったので再び読むのを中断
- Docker Data Volume を理解する - Carpe Diem
- volumesの種類とそれぞれがホストのどの場所にマウントされるのかを確認
- Docker の Data Volume まわりを整理する - Qiita
- それぞれの種類のVolumeの使い分け, 削除されるタイミングについて確認
- Use volumes | Docker Documentation
- Use bind mounts | Docker Documentation
- volumeとbind mountsの違いについて確認
- 分かりやすい図が乗っていた
- Docker Data Volume を理解する - Carpe Diem
- docker-composeも(以下略)
- docker-composeを使うと複数コンテナの管理が便利に - Qiita
docker-compose.yml
の書式がdocker run
のオプションと対応していること, 複数のコンテナを纏め上げる際にdocker-composeが利用されることを確認
- docker-composeを使うと複数コンテナの管理が便利に - Qiita
- docker-node/BestPractices.md at master · nodejs/docker-node · GitHub
- Node.js公式のdocker-nodeのベストプラクティス
- これで指摘されていること+α
- コンテナのメモリ制限等
- Dockerizing a Node.js web app | Node.js
- Node.js公式のDockerizeの手順の解説
- Node.js アプリケーション向けの
.dockerignore
の書き方など
- Compose file version 3 reference | Docker Documentation
- Compose file version 3 について
実際に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するだけならもっと設定ファイルをシンプルにしても良いかもしれません.
あと気になったのは COPY
が USER
の影響を受けないので別途 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: