Docker 分からなさすぎるのでコツコツと学ぶ。 間違ってるところは随時直していく。
利用するメリット
- 開発環境やテスト環境が構築・配布しやすくなる
- Docker を実行できる環境さえあれば OS の違いも吸収する
- VM(仮想化 OS)よりも起動が速い
ソースコード
ref. 「Moby」ベースとなったオープンソース版Dockerの最新状況
- https://github.com/moby/moby
- 元 docker/docker、これをベースに CE も作られている(これが Engine?)
- https://github.com/docker/docker-ce
- Community Edition、我々が使ってるやつ(Engine + CLI?)
- https://github.com/docker/compose
- Docker Compose、Python で書かれてる
バージョニング
https://www.publickey1.jp/blog/17/docker_v1703.html
前回のバージョンはDocker 1.13でしたが、今回からバージョン番号の制度が変更になり、バージョン番号は「年2桁.月2桁.リビジョン」となり…
2020 年 4 月現在の最新バージョンが 19.03.8
なので 👆ともちょっとずれてそうだけど…
基礎技術
Linux カーネルの機能(Linux コンテナ?)を使って実現してる- 以前は Linux コンテナ(LXC) を使っていたが、現在は Go で実装されたソフトウェア libcontainer によって仮想化が行われている
- Docker for Mac とか VirtualBox + Docker だと Linux の VM の上に Docker Engine が立って、その Linux の VM をホスト OS として動かすイメージ
Docker Engine --- Linux VM(Docker for Mac に同梱) ← これがホスト OS の役割を果たす --- macOS
コンポーネント
Docker Engine
Docker Compose
- Docker Engine とは独立したソフトウェア(Docker for Mac だと同梱されてるけど)
- yaml ファイル一つで複数コンテナを定義できる
- 環境変数、ポート設定なども yaml に記述
- 同じ compose ファイル内であれば自動的に同じネットワークに繋がるので内部的なポート設定は不要
イメージとは
- オブジェクト指向でいうとクラス
- Dockerfile からビルドされるやつ(
$ docker build
) - Registry(DockerHub)を使ってイメージそのものを共有可能
コンテナとは
ボリュームとは
- データを永続化できる場所で、コンテナから見ると外部 HDD のようなイメージ
- ボリュームを使わないとコンテナ破棄時にコンテナ内のデータは消える
- DB(Postgres や MySQL)のコンテナを利用する時などによく利用する
- 実体はホスト(Docker が動いてるコンピュータ)にファイルとして保存されている
- 名前付きボリュームの場合は、Docker 内のリソースとして管理されるので正確な保存場所は分からないっぽい?
- 名前つけずにパス指定した場合はそのパスにファイルが作られる
- Docker におけるデータ永続化の方法としては バインドマウント なるものもあるらしいが、ボリュームの方が推奨されてるっぽい
- また docker-compose では COPY や ADD が使えないが、volumes を使って代用できる
- 参考
Dockerfile
- CMD と ENTRYPOINT の違い
- どちらもコンテナ実行時の挙動を決めるコマンド
- 両方指定した場合は ENTRYPOINT が実行コマンドで CMD が引数になる
- DockerfileのCMDとENTRYPOINTを改めて解説する
- [docker] CMD とENTRYPOINT の違いを試してみた
- https://docs.docker.jp/glossary.html#entrypoint
- どちらも docker-compose.yml で上書き可能(command, entrypoint)
docker-compose.yml
- volumes
- https://docs.docker.com/compose/compose-file/#volumes
- https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#volumes (非公式っぽい日本語訳ドキュメント)
SOURCE:TARGET
の形式で指定して、SOURCE にはホスト側のパスまたはボリューム名を指定、TARGET にはボリュームをマウントするコンテナのパスを指定する- 例:
namedvolume:/var/lib/mysql
,./cache:/tmp/cache
- 例:
- 名前付きボリュームを使うにはトップ・レベルの volumes キーを指定する必要がある
- たまに見かける
SOURCE:TARGET:cached
などのcached
オプションはパフォーマンス向上のためのオプションっぽいが、最新の公式ドキュメントには記載が見当たらない
コマンド
- docker run == docker build & docker start
- docker xxx prune
- イメージ、コンテナ、ボリューム、ネットワークなどのクリーンアップをするコマンド、docker rmi コマンドなんかで不要イメージを一つずつ消す必要はもうなかった…素晴らしい
- https://docs.docker.com/config/pruning/
- https://matsuand.github.io/docs.docker.jp.onthefly/config/pruning/ (非公式っぽい日本語訳ドキュメント)
docker inspect -f "{{.LogPath}}" {コンテナ名 or コンテナID}
- Docker コンテナのログの保存場所を表示
- デフォルトでは
/var/lib/docker/containers/{コンテナID}/{コンテナID}-json.log
docker-compose down --volumes
- docker-compose.yml の
volumes
で宣言された名前付きボリュームや、コンテナに結びついている匿名ボリュームを一緒に削除してくれる - https://docs.docker.com/compose/reference/down/
- docker-compose.yml の
その他
- コンテナ削除しても、イメージ削除しても上手く動かない… :sob: って時はボリューム削除してみるべし
- docker-compose.yml で
image
を指定しておくと、ローカルに同名イメージがあればそちらを使ってくれるservices: web: build: . image: shopify-app # ...
- 普通に
image
に指定してある名前(ここでいうとshopify-app
)でタグ付けしてやれば同名のimage
を指定している service 全てで同じイメージを参照する挙動だった(_{service}
はつけてもつけなくても動く)、、賢い :sob:
- docker-compose.yml のボリュームマウント時に一部のディレクトリだけマウントしない方法
- マウント後に無名ボリュームで一部のディレクトリだけ再マウントしてやれば OK
参考
- https://docs.docker.com/
- https://docs.docker.jp/ (少し古いけど日本語版ドキュメント)
- いまさらだけどDockerに入門したので分かりやすくまとめてみた
- DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる
- Docker、ボリューム(Volume)について真面目に調べた
- :movie_camera: 創好リナのDocker入門講座
- わかりやすい Docker 解説の YouTube 動画
- 後半のコーディング部分はグダるけど前半はとても良い