Dockerコンテナ
Dockerアーキテクチャ
役割はThe Docker clientにあたるdockerコマンドなどからREST APIを介してThe Docker daemonを操作する。
The Docker daemonはLinuxホスト上で動作して、**Docker objects(ImagesとContainers)**をを制御している。
Containersは実行インスタンスで実行時にコマンド1つを実行し、実行終了すれば終了する。
永続ボリュームを持つことができるが、持たないのが基本(Immutable Infrastructure)。
ImagesはContainerを作るためのテンプレートイメージに当たる。Dockerfile
を使用して新しいImagesを作成する。このコードのみで同じ環境を再構築できるので、Imagesを維持している必要はない。
ImagesはDocker registriesで共有される。
利用者はDocker registriesからImagesを取得(docker pull
)してカスタマイズするDockerfile
を作成し、自分のコンテナイメージを作成する。
Docker registriesにImagesを公開(docker push
)することもできるが有料。
Docker Containerの互換性
コンテナイメージがどこでも動作するのは、LinuxのKernelの互換性に依存している。カーベルバージョンが異なってもABI(Application Binary Interface) の互換性によって互換性が維持されているので動作する。CPUアーキテクチャの違いは吸収されない。
The underlying technology
Namespaces
ワークスペースを分離(isolate)する。
Dockerエンジンが以下のnamespaces
を使用する。
- The pid namespace: Process isolation (PID: Process ID).
- The net namespace: Managing network interfaces (NET: Networking).
- The ipc namespace: Managing access to IPC resources (IPC: InterProcess Communication).
- The mnt namespace: Managing filesystem mount points (MNT: Mount).
- The uts namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).
Control groups (cgroup)
リソース制御を行う。
Union file systems
UnionFS
は複数のディクスレイヤーを重ねて1つにみせる。
自レイヤーにないファイルはCopy on Writeで対応する(Solaris ZFSなどと同じ)。
ContainerImage format
Dockerイメージはlibcontainer
という形式のイメージ。
2017年7月Open Containers InitiativeがOCIイメージ仕様を策定したが、Dockerfileの構文・命令が標準化されたわけではない。
Dockerイメージの作成
Define a container with Dockerfile
Dockerfileを定義し、コンテナイメージを作成する。
1 | # Use the official image as a parent image. |
Dockerfileベストプラクティス
推奨項目を抜粋
Containerはエフェメラルであるべき
.dockerignore
ファイルを使う不要なパッケージのインストールを避ける
Container毎に1つのプロセスだけ実行
- 複数のContainerに分離することは、水平スケールやContainerの再利用を簡単にする
- サービスとサービスに依存関係がある場合は、Containerのリンクを使う
レイヤーの数を最小に
複数行の引数
- 引数をアルファベット順にする(重複チェックなどで見やすさ)
- バックスラッシュの前に空白を入れる
構築キャッシュ
- Dockerfileの指定した各命令を順番に実行
- 既存のイメージがつかれば使用される
Docker関連ツール
dockerコマンド
docker-compose
もともとFIGというツールだったが、2014年にDocker社によって買収され、docke-composeとなった。設定ファイルdocker-compose.yml
で構成を記述して、複数のContainerを管理する。
Docker Desktop for Windows
docker-composeを含めた統合環境としてインストールされる。
Docker Desktop for WindowsはWindowsの機能のHyper-Vを使用したLinux環境を介して利用することになる。