Docker名前空間

名前空間

名前空間(namespace)はLinuxカーネルの強力な機能であり、コンテナーの仮想化を実現するのに非常に便利です。この機能により、各コンテナーは独自の名前空間を持つことができ、そこで実行されているアプリケーションは独立したオペレーティングシステム環境での同じ命名メカニズムにより、コンテナが相互に影響しないことが保証されます。
カーネル、ファイルシステム、ネットワーク、プロセスID(プロセスID、PID)、ユーザーID(ユーザーID、UIDプロセス間通信、IPC)およびその他のリソースを含むオペレーティングシステムでは、すべてのリソースがアプリケーションプロセスによって直接共有されます。仮想化を実現したい場合は、メモリ、CPU、ネットワークIO、ハードディスクIO、ストレージスペースなどの制限に加えて、ファイルシステム、ネットワーク、PID UID IPCなどの分離を比較的簡単に実現できます。ホストは、ホストホストシステムの詳細なサポートを必要
とします。Linuxシステムの名前空間機能が徐々に改善されて、これらの要件を達成できるようになりました。これらのプロセスは、同じカーネルと特定のカーネルを共有しているにもかかわらず、互いに分離された名前空間で実行できます。一部のランタイム環境(一部のシステムコマンドやシステムライブラリなどのランタイム)は相互に表示されません
。また、func setNamespaces(daemon * Daemon、s * specs。を呼び出すことによって、それ自体を排他システムと見なすDockerコンテナー起動するたびに。 Spec、c *(container.Container)エラーメソッド、各命名間の割り当てを完了する

プロセス名前空間

Linuxは、プロセスの名前付けによってプロセス番号を管理します。同じプロセス(同じタスク構造)の場合、異なる名前空間では、表示されるプロセス番号が異なります。プロセスの名前付けの間に一連のプロセス番号管理方法があります。プロセスの名前空間は親子関係です構造、子スペースのプロセスは親プロセスに表示され、親名前空間と子名前空間は異なるプロセス番号に対応します。たとえば、Dockerサービスのメインプロセス(dockerd)のプロセス番号が3393であることを確認します。親プロセスとしてdocker containerdプロセスを開始し、プロセス番号は3398で、
コードは次のとおりです。

$ ps - ef lgrep docker 
root 3393 1 0 Jan18 ? 00 43 02 /usr/bin/dockerd - H fd : // -H tcp:// 
127 . 0 . 0 . 1 : 2375 -H unix:///var/run/docker.sock 
root 3398 3393 0 Jan18 ? 00 : 34 : 31 docker containerd config /var/ru口/
docker /conta nerd/conta nerd toml

新しいUbuntuコンテナーを作成して、sleepコマンドを実行します。このとき、docker containerdプロセスが親プロセスとして使用され、docker containerd shimプロセスがコンテナー内のすべてのプロセスのルートプロセスとして各コンテナーに対して開始されます。

$ docker ru --name test d ubuntu :l6 . 04 sleep 9999
$ ps -ef lgrep docker
root 21535 3398 0 06 : 57 ? 00 : 00 : 00 docker-containerd-shim

ホストマシンから新しく作成されたコンテナーを表示するプロセスの親プロセスは、docker-containerd shimプロセスです。

$ ps -e f lgrep sleep
root 21569 21535 0 06 : 57 ? 00 : 00 : 00 sleep 9999

コンテナー内のプロセス空間では、docker containerd-shimプロセスがルートプロセスとして使用され(ホストシステム番号ルートプロセスアイドルに類似)、whileプロセスのプロセス番号が(ホストシステムメディア初期化プロセス/ sbin / initコンテナーに類似)になります内部にはdocker containerd iimプロセスの子プロセススペースしか表示されませんが、ホストマシンのプロセス情報は取得できません。

$ docker exec -it 3a bash c ’ ps ef ’ 
UID PID PPID C STIME TTY TI ME CMD 
root 1 0 0 06 : 57 ? 00 : 00 : 00 sleep 9999

IPC名前空間

コンテナ内のプロセスの相互作用は、シグナル、メッセージキュー、共通メモリなど、Linuxの一般的なプロセス間通信方式(プロセス間通信、IPC)を引き続き使用します。PIDネーミングルームとIPC名前空間は、IPCネーミングルームと同じように組み合わせて使用​​できます。プロセスは相互から見ることができ、相互作用が可能です。異なるプロセス間のプロセスは相互作用できません

ネットワーク名前空間

プロセス名前空間を使用すると、異なる名前空間のコンテナ内のホストとプロセススペースの関係を互いに分離できますが、ネットワークポートはローカル
システムを共有するポートのままです。
ネットワーク名前空間を使用してネットワークを分離できます。ネットワーク名前空間は、ネットワークデバイスインターフェース1Pv4 1Pv6プロトコルマシンのIPルーティングテーブル、ファイアウォールルールソケットなどを含むネットワークプロトコルスクールの完全に独立したビューをプロセスに提供するため、コンテナーネットワークを分離できます。Docker
は仮想ネットワークデバイス(仮想Network Device、VND)メソッドで、異なる名前の間にネットワークデバイスを接続します。デフォルトでは、Dockerはシンクマシン上に複数の仮想マシンブリッジ(認識されたネットワークブリッジdockerOなど)を作成します。コンテナ内の仮想ネットワークカードはネットワークブリッジを通過します接続します。
docker network lsコマンドを使用して、現在のシステムのネットワークブリッジを表示します。

$ docker network ls
NETWORK ID NAME DRIVER SCOPE 
337120b7e82e lO_ default bridge local 
7b0bc9cdc8a0 bridge bridge local 
8f57993d438b host host local 
6d9342f43ffc none null local

brctlツールを使用します(bridge utilsツールキットが必要です。デフォルトで、ブリッジの仮想ネットワークポートをブリッジのネットワークポートに接続されている情報に割り当て、dockerO IPアドレスをデフォルトゲートウェイとして設定することもできます。転送するホストiptab esルール

$ brctl show

名前空間をマウントする

マウントMNT cbro同様の空間は、限定されたルートファイルシステムに取り付けることができる
、次の特定のディレクトリ
プロセスのホスト名との間の異なる経路に位置する異なる名前空間がそれぞれに取り付け可能
名前空間内のプロセスの一つ私が見るファイルは互いに分離されています。たとえば、同じ名前空間のプロセスは、それらが排他的なルートファイルシステムを持っていると考えます(Rootfs、異なる名前空間のファイルは互いに影響を受けず、同時に聞くことはできません。ホストファイルシステムの他のパス

UTS名前空間

UTS(UNIX T im e -sh aring System名前空間を使用すると、コンテナに独立したホストとドメインを設定できるため、単一のホストとネットワークスペースを持つ環境を、ネットステーションを持つホストのように仮想化できます。
ホスト名を指定しない場合は、Docker返されるコンテナーIDの前のセクションのプレフィックスです。それ以外の場合は、指定されたユーザー名です。

$docker run - -name testl -d ubuntu : l6 . 04 /bin/sh -c ”while t rue ; do echo h e llo
worl d ; sl eep l ; done " 
alb7bdc9609ad52c6ca7cd39dl69d55ae32f8523lee22da063la20c94d7aa8db 
$docker [contai ner] inspect -f {{ ". Config . Hostname ” }} testl 
alb7bdc9609a 
$ docker run --hostname test2 --name test2 -d ubuntu: 16 . 04 /bin/sh c ” while 
true ; do echo hello world; sleep l; done ” 
140573f8582584d8e 331368288a96a8838f4a7ed0ff7ee50824f8lbc0459677a 
$docker [contai ner] inspect -f {{ .Config.Hostn ne ” }} test2 
test2

ユーザー名前空間

各コンテナーには異なるユーザーIDとグループIDを設定できます。つまり、ローカルシステムに存在するユーザーではなく、特定の内部ユーザーを使用して、
コンテナー内でプログラムを実行できます。各コンテナーは、内部に高い特権を持つrootアカウントを持つことができますが、ホストホストはネーミングにありません。隔離されたユーザーネーミングを使用すると、セキュリティが向上し、コンテナ内のプロセスが外部の権限を取得するのを回避できます。同時に、異なるユーザーを使用することで、コンテナ内の権限をさらに制御できます。
たとえば、次のコマンドはコンテナにテストユーザーを作成します。通常の権限のみで、より高い権限を持つリソースにはアクセスできません:

$ docker run --rm --it ubuntu :l6 . 04 bash 
root@6da1370b22a0: /# cat /pro c/1/enviro
PATH=/usr/local/sbin : /usr/local/bin: /usr/sbin: /usr/bin : /sb工口: lb nHOSTNAME=6dal37
Ob22a0TERM=xtermHOME=/root 
root@6da1370b22a0 : /# useradd ms /bin/bash test 
root@6da13 70b22a0 : /# su test 
test@6da1370b22a0 : /$ cat /proc/1/environ 
cat: /proc/1/environ: Pe ssion denied

おすすめ

転載: www.cnblogs.com/precipitation/p/12717442.html