GNU/Linux >> Linux の 問題 >  >> Linux

Linuxでの名前空間とコンテナの謎を解き明かす

コンテナは世界を席巻しました。この用語を聞いたときにKubernetes、Docker、CoreOS、Silverblue、Flatpakのいずれを考えても、利便性、セキュリティ、スケーラビリティのために、最新のアプリケーションがコンテナで実行されていることは明らかです。

ただし、コンテナは理解しにくい場合があります。コンテナで実行するとはどういう意味ですか?コンテナー内のプロセスは、それらが実行されているコンピューターの他の部分とどのように相互作用できますか?オープンソースは謎を嫌うので、Flatpakに関する私の記事が一般的なフロントエンドを説明したように、この記事はコンテナテクノロジーのバックエンドを説明します。

名前空間

名前空間はプログラミングの世界では一般的です。コンピュータの世界の高度に技術的な場所に住んでいるなら、おそらく次のようなコードを見たことがあるでしょう:

using namespace std;

または、これをXMLで見たことがあるかもしれません:

<book xmlns="http://docbook.org/ns/docbook" xml:lang="en">

これらの種類のフレーズは、後でソースコードファイルで使用されるコマンドのコンテキストを提供します。たとえば、C++がcoutと入力したときにプログラマーが何を意味するかを知っている唯一の理由 これは、C++がcoutを知っているためです。 名前空間は意味のある言葉です。

Linuxコンテナ

  • Linuxコンテナとは何ですか?
  • コンテナ用語の概要
  • ダウンロード:Containers Primer
  • Kubernetesオペレーター:コンテナオーケストレーションプラットフォームの自動化
  • eBook:クラウドネイティブアプリを設計するためのKubernetesパターン
  • Kubernetesとは何ですか?

それが技術的すぎて想像できない場合は、私たち全員が実際の生活でも毎日名前空間を使用していることを知って驚くかもしれません。それらを名前空間とは呼びませんが、常にこの概念を使用しています。たとえば、「私は企業のファンです」というフレーズは、大企業(一般に「企業」と呼ばれます)にサービスを提供するIT企業では1つの意味を持ちますが、SF大会では別の意味を持つ場合があります。 「どのエンジンを実行していますか?」という質問。ガレージでは1つの意味があり、Web開発では別の意味があります。私たちは人間であり、脳はコンテキストを決定するために迅速に適応できるため、カジュアルな会話で名前空間を常に宣言するわけではありませんが、コンピューターの場合、名前空間は明示的に宣言する必要があります。

コンテナの場合、名前空間は、プロセスの周囲で実行されているものに対するプロセスの「認識」の境界を定義するものです。

lsns

気づかないかもしれませんが、Linuxマシンは、特定のプロセスに固有のさまざまな名前空間を静かに維持しています。 util-linuxの最新バージョンを使用する パッケージの場合、マシン上の既存の名前空間を一覧表示できます:

$ lsns
        NS TYPE   NPROCS   PID USER    COMMAND
4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user
4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user
4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user
4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...]
4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...]
[...]

ご使用のバージョンのutil-linux lsnsを提供していません コマンドを実行すると、 / procに名前空間エントリが表示されます。 :

$ ls /proc/*/ns
1571
6266
7164
[...]
$ ls /proc/6266/ns
ipc net pid user uts [...]

Linuxマシンで実行されている各プロセスは、プロセスID(PID)で列挙されます。各PIDには名前空間が割り当てられます。同じ名前空間内のPIDは、特定の名前空間内で動作するようにプログラムされているため、相互にアクセスできます。異なる名前空間のPIDは、異なるコンテキストまたは名前空間で実行されているため、デフォルトでは相互に対話できません。 。これが、ある名前空間の「コンテナ」で実行されているプロセスが、そのコンテナの外部の情報や別のコンテナの内部で実行されている情報にアクセスできない理由です。

新しい名前空間の作成

コンテナを処理するソフトウェアの通常の機能は、自動名前空間管理です。新しいコンテナ化されたアプリケーションまたは環境を起動する人間の管理者は、 lsnsを使用する必要はありません。 どの名前空間が存在するかを確認してから、新しい名前空間を手動で作成します。 PID名前空間を使用するソフトウェアは、Linuxカーネルを使用して自動的にそれを行います。ただし、プロセスを手動で模倣して、舞台裏で何が起こっているのかをよりよく理解することができます。

まず、ではないプロセスを特定する必要があります コンピューターで実行しています。この例では、マシンでBashシェルを実行しているため、Zシェル(Zsh)を使用します。コンピューターでZshを実行している場合は、 Bashを使用します またはtcsh または、現在実行していない他のシェル。目標は、実行されていないことを証明できるものを見つけることです。 pidof を使用すると、何かが実行されていないことを証明できます コマンド。システムにクエリを実行して、名前を付けたアプリケーションのPIDを検出します。

$ pidof zsh
$ sudo pidof zsh

PIDが返されない限り、照会したアプリケーションは実行されていません。

共有解除

共有解除 コマンドは、名前空間 unsharedでプログラムを実行します 親プロセスから。使用可能な名前空間にはさまざまな種類があるため、共有解除をお読みください 利用可能なすべてのオプションのマニュアルページ。

テストコマンドの新しい名前空間を作成するには:

$ sudo unshare --fork --pid --mount-proc zsh
%

Zshはインタラクティブなシェルであるため、起動時に名前空間に簡単にアクセスできます。一部のプロセスはバックグラウンドで実行され、ネイティブ名前空間にプロンプ​​トが表示されるため、すべてのプロセスがこれを行うわけではありません。 Zshセッションにとどまっている限り、新しいフォークされたプロセスのPIDを確認することで、通常の名前空間を離れたことを確認できます。

% pidof zsh
pid 1

LinuxプロセスIDについて何か知っているなら、PID 1は、初期化アプリケーション(Slackware、Devuan、およびおそらくArchのカスタマイズされたインストール以外のほとんどのディストリビューションでシステム化されている)のために、主にブートプロセスの性質によって常に予約されていることを知っています。 。 Zshまたはブート初期化アプリケーションではないアプリケーションがPID1になることはほぼ不可能です(initシステムがないと、コンピューターはブート方法を認識できないため)。ただし、このデモンストレーションでシェルが知っている限り、ZshはPID1スロットを占有します。

シェルが現在伝えていることにもかかわらず、システムのPID1にはありません。 交換されました。コンピューターで2番目のターミナルまたはターミナルタブを開き、PID1を確認します。

$ ps 1
init

次に、ZshのPIDを見つけます:

$ pidof zsh
7723

ご覧のとおり、「ホスト」システムは全体像を把握し、Zshが実際に多数のPIDとして実行されていることを理解しています(偶然の一致を除いて、コンピューターではおそらく7723にはなりません)。 Zshは、スコープが限定されている(または含まれている)ためにのみ、自身をPID1と見なします。 内)その名前空間。プロセスを独自の名前空間にフォークすると、その子プロセスには1から始まる番号が付けられますが、その名前空間内でのみ番号が付けられます。

名前空間、および cgroupsなどの他のテクノロジー その他、コンテナ化の基盤を形成します。名前空間がホスト環境のより広い名前空間のコンテキスト内に存在することを理解すると(このデモンストレーションでは、それはコンピューターですが、現実の世界では、ホストは通常​​、サーバーまたはハイブリッドクラウドです)、コンテナー化されたアプリケーションが機能する方法と理由を理解するのに役立ちます彼らのやり方。たとえば、Wordpressブログを実行しているコンテナーは、コンテナー内で実行されていないことを「認識」していません。カーネルと一部のRAM、および提供した構成ファイルにアクセスできることはわかっていますが、ホームディレクトリや、アクセス許可を特に与えていないディレクトリにはアクセスできない可能性があります。さらに、そのブログソフトウェア内の暴走プロセスは、システム上の他のプロセスに影響を与えることはありません。これは、PIDの「ツリー」が1に戻るだけであり、1が実行中のコンテナであるためです。

>

コンテナは強力なLinux機能であり、毎日人気が高まっています。それらがどのように機能するかを理解したので、Kubernetes、Silverblue、Flatpakなどのコンテナーテクノロジーを調べて、コンテナー化されたアプリで何ができるかを確認してください。コンテナはLinuxなので、起動して注意深く調べ、学習しながら学習してください。


Linux
  1. Linuxコマンド:jobs、bg、およびfg

  2. Linuxコンテナの世界に入るのに役立つ6つのリソースと3つのヒント

  3. Docker(およびLinuxコンテナー)とは何ですか?

  1. Linux名前空間

  2. Linux – Uts名前空間とは何ですか?

  3. Linux でマウント名前空間を表示/操作する

  1. Linuxコンテナとイメージの違いは何ですか?

  2. Linux – SysfsとDevtmpfs?

  3. Linux –カーネル:名前空間のサポート?