Dockerアーキテクチャ

役割はThe Docker clientにあたるdockerコマンドなどからREST APIを介してThe Docker daemonを操作する。
The Docker daemonはLinuxホスト上で動作して、**Docker objects(ImagesとContainers)**をを制御している。

Containersは実行インスタンスで実行時にコマンド1つを実行し、実行終了すれば終了する。
永続ボリュームを持つことができるが、持たないのが基本(Immutable Infrastructure)。

ImagesContainerを作るためのテンプレートイメージに当たる。
Dockerfileを使用して新しいImagesを作成する。このコードのみで同じ環境を再構築できるので、Imagesを維持している必要はない。

ImagesDocker 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Use the official image as a parent image.
FROM node:current-slim

# Set the working directory.
WORKDIR /usr/src/app

# Copy the file from your host to your current location.
COPY package.json .

# Run the command inside your image filesystem.
RUN npm install

# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080

# Run the specified command within the container.
CMD [ "npm", "start" ]

# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .

Dockerfileベストプラクティス

推奨項目を抜粋

  • Containerはエフェメラルであるべき

  • .dockerignoreファイルを使う

  • 不要なパッケージのインストールを避ける

  • Container毎に1つのプロセスだけ実行

    • 複数のContainerに分離することは、水平スケールやContainerの再利用を簡単にする
    • サービスとサービスに依存関係がある場合は、Containerのリンクを使う
  • レイヤーの数を最小に

  • 複数行の引数

    • 引数をアルファベット順にする(重複チェックなどで見やすさ)
    • バックスラッシュの前に空白を入れる
  • 構築キャッシュ

    • Dockerfileの指定した各命令を順番に実行
    • 既存のイメージがつかれば使用される
  • Dockerfile を書くためのベストプラクティス解説編

  • Dockerfileを改善するためのBest Practice 2019年版

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環境を介して利用することになる。

Docker Desktop for Mac

おまけのリンク