TL;DR
アプリケーションをコンテナとして開発、配布、実行するためのオープンなプラットフォーム。イメージからコンテナを作って動かす。
なぜ必要か
Docker の公式ドキュメントによると、Docker を使うと、開発者が標準化された環境で作業でき、CI/CD のワークフローにも組み込みやすい。コンテナはノート PC、データセンター、クラウドのどこでも同じように動き、すばやく増減できる。ハイパーバイザを使う仮想マシンより軽いので、同じハードウェアでより多くの処理を動かせる。
仕組み
- イメージ: コンテナを作るための手順を持つ読み取り専用のテンプレート。Dockerfile にビルドの手順を書き、命令ごとにイメージのレイヤが作られる。変更があったレイヤだけを再ビルドするので、ビルドが速い
- コンテナ: イメージから作った実行可能なインスタンス。永続的なストレージに保存しなかった変更は、コンテナを消すと失われる
- クライアントとデーモン:
dockerコマンド(クライアント)が Docker API でデーモン(dockerd)に命令を送り、デーモンがイメージ、コンテナ、ネットワーク、ボリュームを管理する - レジストリ: イメージを保管する場所。既定は公開の Docker Hub で、プライベートなレジストリも立てられる
例
ローカル環境では、Docker Compose で MinIO や DynamoDB Local などのミドルウェアを立ち上げる。cargo-chef は、Docker のビルドキャッシュを効率よく使って Rust のコンテナのビルド時間を短くする。
コンテナのランタイムとイメージの標準は、2015 年に Docker 社などが設立した OCI が定めている。