Note

3年後の自分のために書いています

Docker 学習ログ

Docker 分からなさすぎるのでコツコツと学ぶ。 間違ってるところは随時直していく。

利用するメリット

  • 開発環境やテスト環境が構築・配布しやすくなる
    • Docker を実行できる環境さえあれば OS の違いも吸収する
  • VM(仮想化 OS)よりも起動が速い
    • VM(仮想化 OS)は OS 部分から仮想化する(VM の数だけゲスト OS が必要)のに対し、Docker は OS のカーネル部分はホスト OS のものを共有して利用するため

ソースコード

ref. 「Moby」ベースとなったオープンソース版Dockerの最新状況

バージョニング

https://www.publickey1.jp/blog/17/docker_v1703.html

前回のバージョンはDocker 1.13でしたが、今回からバージョン番号の制度が変更になり、バージョン番号は「年2桁.月2桁.リビジョン」となり…

2020 年 4 月現在の最新バージョンが 19.03.8 なので 👆ともちょっとずれてそうだけど…

基礎技術

Docker Engine
---
Linux VM(Docker for Mac に同梱) ← これがホスト OS の役割を果たす
---
macOS

コンポーネント

Docker Engine

  • クライアント(CLI
  • サーバ(Docker デーモン)
  • クライアントからコマンド叩くことでローカルやリモートの Docker デーモンと通信するアーキテクチャになっている

Docker Compose

  • Docker Engine とは独立したソフトウェア(Docker for Mac だと同梱されてるけど)
  • yaml ファイル一つで複数コンテナを定義できる
  • 環境変数、ポート設定なども yaml に記述
  • 同じ compose ファイル内であれば自動的に同じネットワークに繋がるので内部的なポート設定は不要

イメージとは

  • オブジェクト指向でいうとクラス
  • Dockerfile からビルドされるやつ($ docker build
  • Registry(DockerHub)を使ってイメージそのものを共有可能

コンテナとは

ref. https://stackoverflow.com/questions/23735149/what-is-the-difference-between-a-docker-image-and-a-container

ボリュームとは

  • データを永続化できる場所で、コンテナから見ると外部 HDD のようなイメージ
    • ボリュームを使わないとコンテナ破棄時にコンテナ内のデータは消える
    • DB(Postgres や MySQL)のコンテナを利用する時などによく利用する
  • 実体はホスト(Docker が動いてるコンピュータ)にファイルとして保存されている
    • 名前付きボリュームの場合は、Docker 内のリソースとして管理されるので正確な保存場所は分からないっぽい?
    • 名前つけずにパス指定した場合はそのパスにファイルが作られる
  • Docker におけるデータ永続化の方法としては バインドマウント なるものもあるらしいが、ボリュームの方が推奨されてるっぽい
  • また docker-compose では COPY や ADD が使えないが、volumes を使って代用できる
    • 👆 ができるのはボリュームには以下の仕様があるため
  • 参考

Dockerfile

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 オプションはパフォーマンス向上のためのオプションっぽいが、最新の公式ドキュメントには記載が見当たらない

コマンド

その他

  • コンテナ削除しても、イメージ削除しても上手く動かない… :sob: って時はボリューム削除してみるべし
  • docker-compose.yml で image を指定しておくと、ローカルに同名イメージがあればそちらを使ってくれる
    •   services:
          web:
              build: .
              image: shopify-app
              # ...
      
    • 普通に image に指定してある名前(ここでいうと shopify-app)でタグ付けしてやれば同名の image を指定している service 全てで同じイメージを参照する挙動だった(_{service} はつけてもつけなくても動く)、、賢い :sob:
  • docker-compose.yml のボリュームマウント時に一部のディレクトリだけマウントしない方法
    • マウント後に無名ボリュームで一部のディレクトリだけ再マウントしてやれば OK

参考