GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Docker コンテナーでネットワーク名前空間を構成する方法

この投稿では、Docker がネットワーク名前空間を使用してリソースを分離する方法について説明します。

次の図は、手順を視覚的に理解するのに役立つラボのセットアップです:

1. 2 つのネットワーク名前空間を作成します:ns1ns2 .

– 2 つの新しいネットワーク名前空間を追加:

# ip netns add ns1
# ip netns add ns2

上記のコマンドは、フラグを clone() システム コール CLONE_NEWNT に渡すことによって、ネットワーク スペースを作成します。

– 新しく作成された ns を確認します:

# ip netns list
ns2
ns1

IP ツールがネットワーク名前空間を作成すると、/var/run/netns/ の下にバインド マウントが作成されます。 次のように:

# ls /var/run/netns/
ns1 ns2

– 新しく作成された名前空間内に表示されるインターフェイスを一覧表示します。最初に作成した後、lo ループバック デバイスがダウンしており、ルート テーブルが空白になっていることがわかります。

# ip netns exec ns1 ip a
1: lo: [LOOPBACK] mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ip netns exec ns2 ip a
1: lo: [LOOPBACK] mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ip netns exec ns2 ip route
# 

2. mydocker0 ブリッジを作成します:

– デフォルトのネットワーク名前空間に mydocker0 Linux ブリッジを作成します:

# brctl addbr mydocker0
# brctl show
bridge name bridge id STP enabled interfaces
...
mydocker0 8000.000000000000 no
...
# ip a add 172.16.1.254/16 dev mydocker0
# ip link set dev mydocker0 up
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.182.64.1 0.0.0.0 UG 100 0 0 enp0s3
10.182.64.0 0.0.0.0 255.255.248.0 U 100 0 0 enp0s3
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 mydocker0 
...

3. 名前空間 ns1 でネットワーク名前空間を接続するための VETH を作成します。

– 仮想イーサネット デバイスのペアをセットアップします - veth1&veth1p は、デフォルトの名前空間と名前空間 ns1 を接続します:

# ip link add veth1 type veth peer name veth1p
# ip -d link show |grep veth1
6149: veth1p@veth1: [BROADCAST,MULTICAST,M-DOWN] mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
6150: veth1@veth1p: [BROADCAST,MULTICAST,M-DOWN] mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

– veth1 を mydocker0 に割り当て、veth1 を名前空間 ns1 に割り当てます:

# brctl addif mydocker0 veth1
# ip link set veth1 up
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a6bde86d9e8 no br0
veth890eaea
mydocker0 8000.6efa891a7162 no veth1 >>>>>>>>
...
# ip link set veth1p netns ns1
# ip netns exec ns1 ip a
1: lo: [LOOPBACK] mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6149: veth1p@if6150:  mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 2a:3b:ea:e3:63:dd brd ff:ff:ff:ff:ff:ff link-netnsid 0

– veth1p の名前を eth0 に変更します:

# ip netns exec ns1 ip link set veth1p name eth0
# ip netns exec ns1 ip a
1: lo: [LOOPBACK] mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6149: eth0@if6150:  mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 2a:3b:ea:e3:63:dd brd ff:ff:ff:ff:ff:ff link-netnsid 0

– 名前空間 ns1 の eth0 に IP アドレスを割り当てます:

# ip netns exec ns1 ip link set eth0 up
# ip netns exec ns1 ip a add 172.16.1.1/16 dev eth0
# ip netns exec ns1 ip route add default via 172.16.1.254
# ip netns exec ns1 ip route
default via 172.16.1.254 dev eth0
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.1.1

4. 名前空間 ns2 で同じ手順に従います:

# ip link add veth2 type veth peer name veth2p
# brctl addif mydocker0 veth2
# ip link set veth2 up
# ip link set veth2p netns ns2
# ip netns exec ns2 ip link set veth2p name eth0
# ip netns exec ns2 ip link set eth0 up
# ip netns exec ns2 ip addr add 172.16.1.2/16 dev eth0
# ip netns exec ns2 ip route add default via 172.16.1.254

5. 2 つの名前空間間のネットワーク接続をテストします。

# ip netns exec ns1 ping -c 2 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=0.457 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=0.049 ms
--- 172.16.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1057ms
rtt min/avg/max/mdev = 0.049/0.253/0.457/0.204 ms
# ip netns exec ns2 ping -c 2 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from 172.16.1.1: icmp_seq=2 ttl=64 time=0.045 ms

--- 172.16.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1055ms
rtt min/avg/max/mdev = 0.045/0.051/0.058/0.009 ms


Docker
  1. DockerComposeの使用方法

  2. Dockerコンテナを接続する方法

  3. 環境変数をDockerコンテナに渡す方法

  1. 実行中のDockerコンテナを自動的に更新する方法

  2. Dockerコンテナをエクスポートおよびインポートする方法

  3. Dockerコンテナを一覧表示する方法

  1. Dockerコンテナを管理する方法は?ベストプラクティス

  2. プロキシを使用するように docker を構成する方法

  3. すべての Docker コンテナーを削除する方法