dockerを触った経緯
---------- iOSのアプリ開発中----------
ぼく「このAPI毎回違う値返して来てテスト書けねぇからswaggerでスタブ作ってみるか」
----------swagger学習中----------
ぼく「ちょっと動かせるぐらいになった!社内の凄腕エンジニアにMRお願いしよう。」
凄腕エンジニア「ローカル環境によって実行できたりできなかったりするので、docker化しました。MR出しました!」
ぼく「docker触った事ないけど、これを機に使い始めるか!」
dockerの理解を阻んでいた唯一の原因
Macで動くdockerって何?Linuxで動いてるんじゃないの?
→ Docker for Macがあるが、これはハイパーバイザでMacOS上にLinuxを立てて、その上でDocker Engineを動かしている。
この疑問がにわか知識では混乱の元になっていた。
DockerはLinux上でしか動かないよ!!!
今の所感じる便利なところ
ローカルの依存環境に左右されない。
複数の開発者間での共有が楽。ぶっちゃけ個人で使う場合には、ローカルで環境構築しても全く困らないが、1年後の自分とか別の人が使う時に手間が生まれる。それをdockerは楽にできる。
コンテナを作ったり壊したりできる。
ローカルへの影響を考えなくて良い。
Dockerについての理解まとめ
コンテナ
コンテナとは、ホストOSのkernelを使い複数のルート/ファイルシステムを実行する。各々のリソースを持つ独立した環境で、基本的にコンテナ外のリソースは参照できない。(volumeをマウントするなどの方法もある)
これらはLinuxカーネルの技術によって実現される。
→ Namespaces(名前空間によるプロセスの間の隔離、分離: isolation)
→ Cgroups( CPU・メモリ・Disk I/Oのリソース制限)
Docker Engine
CLIからの操作を受け取ってコンテナを操作するのは、このDocker Engine。デーモンとして動いている。
Docker Image
- コンテナを実行する時に必要なファイルシステム
- イメージ・レイヤの集合体
- レイヤーには親子関係ある
- 差分情報のみを記録する
- レイヤーはRead Onlyで書き込みできない
DockerfileにRUN npm install
とか書いておくと、新規レイヤーにnpm installして変更内容をコミットして、イメージをビルドしてくれる。
Docker imageを起動する時には、書き込み可能な新しいイメージレイヤが自動的に割り当てられる。
イメージの作成方法
- docker hubから取得
- コンテナの内容を手動コミットし、新しいイメージを取得する
- Dockerfileを使ってイメージを自動構築する。(docker build)