【入門】Linuxコンテナについて

![名称未設定 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/50089100-0de6-8eec-6f5a-112cb3635325.png)
## はじめに

Linuxコンテナについて、自分の理解をできるだけ簡潔にまとめてみます。
想定読者は下記のとおりです。

- (前提)OS・アプリケーション・ライブラリと言われてなんとなくわかる
- コンテナやDocker、Kubanetesをよく知らない🤔
- コンテナ周りの用語が多すぎて疲れた人😮‍💨

次の内容は含みません。

- 実際に環境構築を行ったり、コマンドなどの操作説明
- クラウド(ECS/EKS)関連の話

## コンテナとは？

アプリケーションの**実行環境を隔離**し、**軽量**かつ**ライブラリやミドルウェアを含めてパッケージ化**することで、任意の環境へ**容易に移動・展開**できる仕組み。**Linuxカーネルが提供**する機能を使って成り立っており、ハイパーバイザー型仮想化と比較して動作パフォーマンスが良く、ハードウェアの利用効率が良い。

![コンテナ解説-1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/f6bc51b7-7529-767f-3a66-4f456237800a.png)

コンテナを手軽に実行できる環境として2008年にLXC(**L**inu**X** **C**ontainers)、2013年には**Docker**が登場した。

:::note info
**簡単にメリットだけを説明すると…**
アプリケーションを実行するまでの準備が楽になって、別のコンピューターにも実行環境を持って行きやすくなった。
:::

## Dockerとは？

コンテナを簡単に構築や実行、共有もできるように設計された**プラットフォーム**。

- コンテナの構築や実行を容易にする「Docker Engine」
- コンテナイメージの共有を容易にする「Docker Hub」
- GUIを使ってコンテナを扱うことができる「Docker Desktop」
- 単一のマシンで複数のコンテナを管理できる「Docker Compose」
- 複数のマシンを統合してコンテナ環境を構築できる「Docker Swarm」

2013年にオープンソース化されて以来、コンテナといえばDockerと言えるほど普及が加速した。また2017年以降、**コンテナの実行に携わる機能はDockerから独立**しており、「runC」や「containerd」として開発されている。

![コンテナ解説-2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/4035cb6f-55c7-eb80-1e02-6401d6a33915.png)

:::note info
**Podman**について
RedHatを中心に開発されているコンテナ管理ツール。Dockerに似たコマンド体系を持ち、Daemonless・Rootlessといった特徴を持つ。RHEL系のOSではDockerの代わりに標準採用されている。
:::

## Kubernetes(k8s)とは？

コンテナをより大規模に実行・管理できる**ソフトウェア**。Dockerを置き換えるものというよりはコンテナ実行環境のスケールアップに近い。元々はDockerを経由してコンテナを操作(図中のNodeがDockerで動作)していたが、現在はcontainerd等のコンテナランタイムを直接操作している。

![コンテナ解説-3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/526e53cb-0f6e-4e20-190b-bb8ef011042a.png)

:::note info
**Docker Swarm**について
Dockerにも「Docker Swarm」というk8sと同じジャンルであるコンテナオーケストレーションシステムがある。2024年現在では、どちらかというとシンプルなDocker Swarmと比べて、機能が豊富なk8sを採用されることが多い。
:::

## 疑問

### コンテナ仮想化のデメリットは？

**ハイパーバイザー型仮想化と比較して**、ホストOSを共有する都合上「実行環境の再現度」や「セキュリティ」で劣る場合がある。(あとは、ご覧いただいている通り覚えることが多い🤯)

参考)
[「DockerはKernel共有する」とよく聞くけどそれによって何が起きるか調べてみた - Qiita](https://qiita.com/ozota/items/728f0e838817d4ed7399)
[Docker#欠点 - Wikipedia](https://ja.wikipedia.org/wiki/Docker#%E6%AC%A0%E7%82%B9)

### 結局コンテナを動かすには何が必要なの？

動かすだけなら後述するLow-level Container Runtimeがあれば、比較的少ない手順で実行可能（らしい）。極論言ってしまえば、何も無しでもコンテナのような環境は作成可能。

参考)
[runC: 分かり易く解説 (第1回) - 概要と実現技術編](https://zenn.dev/hidenori3/articles/716f3a48834fee)

### MacやWindowsでも動かせるの？

LinuxコンテナはLinuxカーネルが無いと動かせないので、ハイパーバイザー仮想化で軽量なLinuxを動かしてその環境上で実行されている。

:::note info
**Windowsコンテナ**について
Linuxコンテナと同じような仕組みでWindowsコンテナというものがある。ただ単に「コンテナ」と言った場合はLinuxコンテナを指す場合がほとんど。
:::

## 「コンテナ」で検索したら出てくるものたち

「よく見かけるやつ」を、**ざっくりしたジャンル**に分類しました。リンク先は公式または、日本語の解説記事です。(★)は特によく登場するものになります。

:::note warn
他のジャンルも含んでいる場合があるので、**必ずしもそのジャンルそのものとは限らないので注意**してください。ジャンル名として適当なものが無い場合は雰囲気で勝手につけています。
:::

### Orchestration System

![アートボード 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/a1633855-7ad1-7d29-b2ca-fbc9a7400c9c.jpeg)

複数のコンテナを効率的に管理するための**ソフトウェア**。
Container Engineだけでは不足している、実運用で欠かせない機能（デプロイの管理、負荷分散やフェールオーバー）を提供する。

- [Kubernetes (k8s/k3s)](https://kubernetes.io/ja/) (★)
- [OpenShift](https://www.redhat.com/ja/technologies/cloud-computing/openshift)
- [DockerSwarm](https://docs.docker.jp/swarm/overview.html)
- [Mesos/Marathon](https://mesos.apache.org)
- [Nomad](https://www.nomadproject.io)

### Container Engine

![アートボード 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/16c5943f-d994-0f92-a3d6-950d926cf19c.jpeg)

コンテナの構築・配布・実行といった機能を包括的に提供する**ソフトウェア**。次項のContainer Runtimeも含めて、指す場合も多い。

- [Docker](https://www.docker.com/ja-jp/) (★)
- [Podman](https://www.redhat.com/ja/topics/containers/what-is-podman)

### High-level Container Runtime (HLCR)

![アートボード 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/17b8666f-3007-f694-cd21-51774690441e.jpeg)

コンテナのライフサイクルを管理する**コンポーネント**。コンテナの作成や開始・停止などの操作を抽象化して提供する。

- [containerd](https://containerd.io) (★)
- [CRI-O](https://cri-o.io)

### Low-level Container Runtime (LLCR)

![アートボード 4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/c67c90c3-c345-50f1-b855-627c0420a49c.jpeg)

コンテナの実行を直接担当する**コンポーネント**。Linuxカーネルの機能を使ってコンテナの隔離環境を構築する。

- [runc](https://github.com/opencontainers/runc)
- [crun](https://github.com/containers/crun)
- [runsc(gVisor)](https://gvisor.dev)
- [kata-runtime(KataContainer)](https://katacontainers.io)

### Linux kernel Features

コンテナを支える**Linuxカーネルの機能**。プロセスまたはプロセスグループのリソースを制限することで実行環境の隔離を実現している。

- [namespace](https://gihyo.jp/admin/serial/01/linux_containers/0002)
- [cgroups](https://gihyo.jp/admin/serial/01/linux_containers/0003)
- [pivot_root(chroot)](https://blog.framinal.life/entry/2020/04/09/183208)

### Open Container Initiative (OCI)

![アートボード 5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/84f4d8e6-5dd1-4a91-602f-c95e34ea54ab.jpeg)

コンテナの標準仕様を定義するために設立された**組織**。コンテナのランタイムやコンテナイメージ、リモートレジストリとの連携について定義されている。

- [Open Container Initiative](https://opencontainers.org)
- [OCI Runtime Specification](https://github.com/opencontainers/runtime-spec) (★)
- [OCI Image Specification](https://github.com/opencontainers/image-spec)
- [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec)

### Cloud Native Computing Foundation (CNCF)

![アートボード 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459707/6c6275b2-5498-6e1e-d50d-6920ce06a1b9.png)

クラウドネイティブソフトウェアスタックの標準化とエコシステムの発展を目的として設立された**組織**。**Kubernetes をはじめとするクラウドネイティブ関連プロジェクトをホストしている。**

[Cloud Native Computing Foundation](https://www.cncf.io)

:::note info
「OCI」と「CNCF」の関係、「containerd」「runC」の成り立ちなどは下記の記事が参考になりました。
[Docker一強の終焉にあたり、押さえるべきContainer事情](https://zenn.dev/ttnt_1013/articles/f36e251a0cd24e)
[CNCFのCOOに聞いた、CNCFとOCI、Docker、Kubernetes、Cloud Foundryとの関係](https://atmarkit.itmedia.co.jp/ait/articles/1612/22/news032.html)
:::

### Kubernetes Plugin Interface

**Kubernetes**とコンテナ操作や、ネットワーク・ストレージの連携を標準化する**規格**。Kubernetesでは**プラグイン**と呼ばれる。

- [Container Runtime Interface (CRI)](https://kubernetes.io/ja/docs/concepts/architecture/cri/) (★)
- [Container Network Interface (CNI)](https://kubernetes.io/ja/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)
- [Container Storage Interface (CSI)](https://github.com/container-storage-interface/spec)

:::note info
DockerはこのCRIに対応していないため、Kubernetesはdocker-shimを介してDockerを操作していた。現在はDockerを経由せずcontainerdを直接操作している。**「KubernetesがDockerを非推奨にした」というのは「Dockerを経由してコンテナを操作することをやめた」ことを指す。**
:::

### Container Registry

コンテナイメージの保存、共有するための**プラットフォーム**。

- [Docker Hub](https://hub.docker.com)
- [Harbor](https://goharbor.io)
- [Red Hat Query](https://www.redhat.com/ja/technologies/cloud-computing/quay)
- [JFrog Container Registry](https://jfrog.com/ja/container-registry/)
- [GitHub Container Registry](https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry)
- Amazon Elastic Container Registry (ECR)
- Azure Container Registry (ACR)
- Google Container Registry (GCR)

### Container Build Tool

コンテナイメージを作成するための**ツール**。

- [Docker BuildKit](https://docs.docker.jp/develop/develop-images/build_enhancements.html)
- [Buildah](https://www.redhat.com/ja/topics/containers/what-is-buildah)
- [Kaniko](https://github.com/GoogleContainerTools/kaniko)

### その他

- [Skaffold](https://skaffold.dev) コンテナデプロイ管理ツール
- [Helm](https://helm.sh/ja/) Kubernetes用パッケージマネージャー
- [Rancher](https://www.rancher.com) マルチクラスタKubernetes管理プラットフォーム
- [Minikube](https://minikube.sigs.k8s.io/docs/) ローカルKubernetes
- [k3s](https://k3s.io) 軽量Kubernetes

## さいごに

コンテナは様々なサービスやソフトウェアが組み合わされていて、なかなか全体像が掴みにくい印象です。今回は触れていないIaC(Infrastructure as Code)やクラウドについても深掘りしていきたいですね。

## 参考

[Linux コンテナとは何か - コンテナ技術の仕組みと歴史| Red Hat](https://www.redhat.com/ja/topics/containers/whats-a-linux-container)
[Linux Containers vs. Docker: Which One Should You Use? | Docker](https://www.docker.com/blog/lxc-vs-docker/)
[初心者のためのコンテナ入門教室 記事一覧 | Think IT（シンクイット）](https://thinkit.co.jp/series/9490)
[Linux コンテナの歴史を追うとコンテナの仕組みがわかる / Dai Kichijoji pm - Speaker Deck](https://speakerdeck.com/tenforward/dai-kichijoji-pm)
[Linuxコマンドを叩いて、コンテナを自作｜クラウドテクノロジーブログ｜ソフトバンク](https://www.softbank.jp/biz/blog/cloud-technology/articles/202312/container/)
[The internals and the latest trends of container runtimes (2023)](https://medium.com/nttlabs/the-internals-and-the-latest-trends-of-container-runtimes-2023-22aa111d7a93)
[［改訂新版］イラストでわかるDockerとKubernetes](https://gihyo.jp/book/2024/978-4-297-14055-7)