はじめに
Linuxコンテナについて、自分の理解をできるだけ簡潔にまとめてみます。
想定読者は下記のとおりです。
- (前提)OS・アプリケーション・ライブラリと言われてなんとなくわかる
- コンテナやDocker、Kubanetesをよく知らない🤔
- コンテナ周りの用語が多すぎて疲れた人😮💨
次の内容は含みません。
- 実際に環境構築を行ったり、コマンドなどの操作説明
- クラウド(ECS/EKS)関連の話
コンテナとは?
アプリケーションの実行環境を隔離し、軽量かつライブラリやミドルウェアを含めてパッケージ化することで、任意の環境へ容易に移動・展開できる仕組み。Linuxカーネルが提供する機能を使って成り立っており、ハイパーバイザー型仮想化と比較して動作パフォーマンスが良く、ハードウェアの利用効率が良い。
コンテナを手軽に実行できる環境として2008年にLXC(LinuX Containers)、2013年にはDockerが登場した。
簡単にメリットだけを説明すると…
アプリケーションを実行するまでの準備が楽になって、別のコンピューターにも実行環境を持って行きやすくなった。
Dockerとは?
コンテナを簡単に構築や実行、共有もできるように設計されたプラットフォーム。
- コンテナの構築や実行を容易にする「Docker Engine」
- コンテナイメージの共有を容易にする「Docker Hub」
- GUIを使ってコンテナを扱うことができる「Docker Desktop」
- 単一のマシンで複数のコンテナを管理できる「Docker Compose」
- 複数のマシンを統合してコンテナ環境を構築できる「Docker Swarm」
2013年にオープンソース化されて以来、コンテナといえばDockerと言えるほど普及が加速した。また2017年以降、コンテナの実行に携わる機能はDockerから独立しており、「runC」や「containerd」として開発されている。
Podmanについて
RedHatを中心に開発されているコンテナ管理ツール。Dockerに似たコマンド体系を持ち、Daemonless・Rootlessといった特徴を持つ。RHEL系のOSではDockerの代わりに標準採用されている。
Kubernetes(k8s)とは?
コンテナをより大規模に実行・管理できるソフトウェア。Dockerを置き換えるものというよりはコンテナ実行環境のスケールアップに近い。元々はDockerを経由してコンテナを操作(図中のNodeがDockerで動作)していたが、現在はcontainerd等のコンテナランタイムを直接操作している。
Docker Swarmについて
Dockerにも「Docker Swarm」というk8sと同じジャンルであるコンテナオーケストレーションシステムがある。2024年現在では、どちらかというとシンプルなDocker Swarmと比べて、機能が豊富なk8sを採用されることが多い。
疑問
コンテナ仮想化のデメリットは?
ハイパーバイザー型仮想化と比較して、ホストOSを共有する都合上「実行環境の再現度」や「セキュリティ」で劣る場合がある。(あとは、ご覧いただいている通り覚えることが多い🤯)
参考)
「DockerはKernel共有する」とよく聞くけどそれによって何が起きるか調べてみた - Qiita
Docker#欠点 - Wikipedia
結局コンテナを動かすには何が必要なの?
動かすだけなら後述するLow-level Container Runtimeがあれば、比較的少ない手順で実行可能(らしい)。極論言ってしまえば、何も無しでもコンテナのような環境は作成可能。
参考)
runC: 分かり易く解説 (第1回) - 概要と実現技術編
MacやWindowsでも動かせるの?
LinuxコンテナはLinuxカーネルが無いと動かせないので、ハイパーバイザー仮想化で軽量なLinuxを動かしてその環境上で実行されている。
Windowsコンテナについて
Linuxコンテナと同じような仕組みでWindowsコンテナというものがある。ただ単に「コンテナ」と言った場合はLinuxコンテナを指す場合がほとんど。
「コンテナ」で検索したら出てくるものたち
「よく見かけるやつ」を、ざっくりしたジャンルに分類しました。リンク先は公式または、日本語の解説記事です。(★)は特によく登場するものになります。
他のジャンルも含んでいる場合があるので、必ずしもそのジャンルそのものとは限らないので注意してください。ジャンル名として適当なものが無い場合は雰囲気で勝手につけています。
Orchestration System
複数のコンテナを効率的に管理するためのソフトウェア。
Container Engineだけでは不足している、実運用で欠かせない機能(デプロイの管理、負荷分散やフェールオーバー)を提供する。
Container Engine
コンテナの構築・配布・実行といった機能を包括的に提供するソフトウェア。次項のContainer Runtimeも含めて、指す場合も多い。
High-level Container Runtime (HLCR)
コンテナのライフサイクルを管理するコンポーネント。コンテナの作成や開始・停止などの操作を抽象化して提供する。
- containerd (★)
- CRI-O
Low-level Container Runtime (LLCR)
コンテナの実行を直接担当するコンポーネント。Linuxカーネルの機能を使ってコンテナの隔離環境を構築する。
Linux kernel Features
コンテナを支えるLinuxカーネルの機能。プロセスまたはプロセスグループのリソースを制限することで実行環境の隔離を実現している。
Open Container Initiative (OCI)
コンテナの標準仕様を定義するために設立された組織。コンテナのランタイムやコンテナイメージ、リモートレジストリとの連携について定義されている。
- Open Container Initiative
- OCI Runtime Specification (★)
- OCI Image Specification
- OCI Distribution Specification
Cloud Native Computing Foundation (CNCF)
クラウドネイティブソフトウェアスタックの標準化とエコシステムの発展を目的として設立された組織。Kubernetes をはじめとするクラウドネイティブ関連プロジェクトをホストしている。
Cloud Native Computing Foundation
「OCI」と「CNCF」の関係、「containerd」「runC」の成り立ちなどは下記の記事が参考になりました。
Docker一強の終焉にあたり、押さえるべきContainer事情
CNCFのCOOに聞いた、CNCFとOCI、Docker、Kubernetes、Cloud Foundryとの関係
Kubernetes Plugin Interface
Kubernetesとコンテナ操作や、ネットワーク・ストレージの連携を標準化する規格。Kubernetesではプラグインと呼ばれる。
- Container Runtime Interface (CRI) (★)
- Container Network Interface (CNI)
- Container Storage Interface (CSI)
DockerはこのCRIに対応していないため、Kubernetesはdocker-shimを介してDockerを操作していた。現在はDockerを経由せずcontainerdを直接操作している。「KubernetesがDockerを非推奨にした」というのは「Dockerを経由してコンテナを操作することをやめた」ことを指す。
Container Registry
コンテナイメージの保存、共有するためのプラットフォーム。
- Docker Hub
- Harbor
- Red Hat Query
- JFrog Container Registry
- GitHub Container Registry
- Amazon Elastic Container Registry (ECR)
- Azure Container Registry (ACR)
- Google Container Registry (GCR)
Container Build Tool
コンテナイメージを作成するためのツール。
その他
- Skaffold コンテナデプロイ管理ツール
- Helm Kubernetes用パッケージマネージャー
- Rancher マルチクラスタKubernetes管理プラットフォーム
- Minikube ローカルKubernetes
- k3s 軽量Kubernetes
さいごに
コンテナは様々なサービスやソフトウェアが組み合わされていて、なかなか全体像が掴みにくい印象です。今回は触れていないIaC(Infrastructure as Code)やクラウドについても深掘りしていきたいですね。
参考
Linux コンテナとは何か - コンテナ技術の仕組みと歴史| Red Hat
Linux Containers vs. Docker: Which One Should You Use? | Docker
初心者のためのコンテナ入門教室 記事一覧 | Think IT(シンクイット)
Linux コンテナの歴史を追うとコンテナの仕組みがわかる / Dai Kichijoji pm - Speaker Deck
Linuxコマンドを叩いて、コンテナを自作|クラウドテクノロジーブログ|ソフトバンク
The internals and the latest trends of container runtimes (2023)
[改訂新版]イラストでわかるDockerとKubernetes