以前の記事では、コンテナイメージとランタイムについて書きました。この記事では、名前空間や制御グループなど、いくつかの特別なLinuxテクノロジーの基盤によってコンテナーがどのように実現されるかを見ていきます。
Linuxコンテナ
- Linuxコンテナとは何ですか?
- コンテナ用語の概要
- ダウンロード:Containers Primer
- Kubernetesオペレーター:コンテナオーケストレーションプラットフォームの自動化
- eBook:クラウドネイティブアプリを設計するためのKubernetesパターン
- Kubernetesとは何ですか?
Linuxテクノロジーは、システム上でコンテナープロセスを構築および実行するための基盤を構成します。テクノロジーには次のものが含まれます:
- 名前空間
- コントロールグループ(cgroups)
- Seccomp
- SELinux
名前空間
名前空間 コンテナーに、それ自体のLinuxファイルシステムのように見えるもののビューを提供することにより、コンテナーを分離するレイヤーを提供します。これにより、プロセスが認識できる内容が制限されるため、プロセスで使用できるリソースが制限されます。
Linuxカーネルには、コンテナの作成中にDockerやPodmanなどが使用する名前空間がいくつかあります。
$ docker container run alpine ping 8.8.8.8
$ sudo lsns -p 29413
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --
switched...
4026533105 mnt 1 29413 root ping 8.8.8.8
4026533106 uts 1 29413 root ping 8.8.8.8
4026533105 ipc 1 29413 root ping 8.8.8.8
[...]
ユーザー
ユーザー名前空間は、コンテナー内のユーザーとグループを分離します。これは、コンテナーがホストシステムと比較してUIDおよびGID範囲の異なるビューを持つことを許可することによって行われます。ユーザー名前空間を使用すると、ソフトウェアをrootユーザーとしてコンテナー内で実行できます。侵入者がコンテナを攻撃してからホストマシンに逃げた場合、侵入者は非ルートIDのみに制限されます。
Mnt
mnt名前空間を使用すると、コンテナーはシステムのファイルシステム階層を独自に表示できます。各コンテナプロセスのマウントポイントは、 / proc /
UTS
Unixタイムシェアリングシステム(UTS)名前空間を使用すると、コンテナーに一意のホスト名とドメイン名を付けることができます。コンテナを実行すると、— name
を使用している場合でも、ホスト名としてランダムIDが使用されます。 鬼ごっこ。 unshare
を使用できます これがどのように機能するかを理解するためのコマンド。
$ docker container run -it --name nived alpine sh
/ # hostname
9c9a5edabdd6
/ #
$ sudo unshare -u sh
# hostname isolated.hostname
# hostname
# exit
$ hostname
homelab.redhat.com
IPC
プロセス間通信(IPC)名前空間を使用すると、さまざまなコンテナプロセスが、共有範囲のメモリにアクセスしたり、共有メッセージキューを使用したりして通信できます。
# ipcmk -M 10M
Shared memory id: 0
# ipcmk -M 20M
Shared memory id: 1
# ipcs
---- Message Queues ----
key msqid owner perms used-bytes messages
---- Shared Memory Segments
key shmid owner perms bytes nattch status
0xd1df416a 0 root 644 10485760 0
0xbd487a9d 1 root 644 20971520 0
[...]
PID
プロセスID(PID)名前空間は、コンテナー内で実行されているプロセスが外部から分離されていることを保証します。 ps
を実行するとき コンテナ内でコマンドを実行すると、この名前空間のため、コンテナ内で実行されているプロセスのみが表示され、ホストマシン上では表示されません。
ネット
ネットワーク名前空間を使用すると、コンテナはネットワークインターフェイス、IPアドレス、ルーティングテーブル、ポート番号などの独自のビューを持つことができます。コンテナはどのようにして外界と通信できますか?作成したすべてのコンテナは、通信用の特別な仮想ネットワークインターフェイスに接続されます。
コントロールグループ(cgroups)
Cgroupは、コンテナーを作成するための基本的なブロックです。 cgroupは、コンテナによって使用されるCPU、メモリ、ネットワークI/Oなどのリソースを割り当てて制限します。コンテナエンジンは、各タイプのcgroupファイルシステムを自動的に作成し、コンテナの実行時に各コンテナの値を設定します。
SECCOMP
Seccompは基本的にセキュアコンピューティングの略です 。これは、アプリケーションが実行できる一連のシステムコールを制限するために使用されるLinuxの機能です。たとえば、Dockerのデフォルトのseccompプロファイルは、約44のシステムコールを無効にします(300以上が利用可能です)。
ここでの考え方は、コンテナが必要とする可能性のあるリソースのみへのアクセスをコンテナに提供することです。たとえば、ホストマシンの時刻を変更するためにコンテナが必要ない場合は、おそらく clock_adjtimeを使用する必要はありません。 およびclock_settime syscalls、そしてそれらをブロックすることは理にかなっています。同様に、コンテナがカーネルモジュールを変更する必要がないため、コンテナでcreate_module、delete_moduleを作成する必要はありません。 システムコール。
SELinux
SELinuxは、 security-enhanced Linuxの略です。 。ホストでRedHatディストリビューションを実行している場合、SELinuxはデフォルトで有効になっています。 SELinuxを使用すると、アプリケーションが自身のファイルにのみアクセスできるように制限し、他のプロセスがそれらにアクセスできないようにすることができます。したがって、アプリケーションが侵害された場合、影響を与えたり制御したりできるファイルの数が制限されます。これは、ファイルとプロセスのコンテキストを設定し、プロセスが認識して変更を加えることができるものを強制するポリシーを定義することによって行われます。
コンテナーのSELinuxポリシーは、container-selinux
によって定義されます。 パッケージ。デフォルトでは、コンテナは container_tで実行されます ラベルを付けて、 / usr の下で(r)を読み取り、(x)を実行することができます。 ディレクトリを作成し、 / etcからほとんどのコンテンツを読み取ります ディレクトリ。ラベルcontainer_var_lib_t コンテナに関連するファイルで一般的です。
まとめ
コンテナは、今日のITインフラストラクチャの重要な部分であり、非常に興味深いテクノロジーでもあります。あなたの役割が直接コンテナ化を伴わない場合でも、いくつかの基本的なコンテナの概念とアプローチを理解することで、それらが組織にどのように役立つかを理解できます。コンテナがオープンソースのLinuxテクノロジーに基づいて構築されているという事実は、コンテナをさらに優れたものにします!
この記事はtechbeatlyの記事に基づいており、許可を得て改作されています。