コンテナに関係する主要な機能2つの説明が済んだので、
コンテナとネットワーク名前空間
コンテナでのネットワークの使用と密接に関係するのが第2回で紹介したネットワーク名前空間です。
コンテナでネットワークを使用する場合、
もちろん、
特にUpstartの場合はネットワーク名前空間がホストと独立していないと、
アプリケーションコンテナの場合は、
ホストのインターフェースの使用
コンテナ用にネットワーク名前空間を作成した場合でも、
つまり同一のホスト上でコンテナを多数起動する場合は、
veth
vethは元々OpenVZ/
この作成された2つのインターフェースの片方をホストのネットワーク名前空間に割り当て、

vethを使う時はこのようにホスト上にブリッジを作りますので、
第2回でもネットワーク名前空間を作成しました。しかし作成しただけ終わりましたので、
ここではiproute2に含まれるip
コマンドを使ってvethインターフェースの作成とネットワーク名前空間を操作してみます。
まずはvethペアを作ってみます。ホスト側をveth0-host
、veth0-ct
としましょう。
$ sudo ip link add name veth0-host type veth peer name veth0-ct (vethペアの作成)
$ sudo ip link show
:(略)
3: veth0-ct: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether be:82:25:d8:94:30 brd ff:ff:ff:ff:ff:ff
4: veth0-host: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 12:e5:61:4b:42:ba brd ff:ff:ff:ff:ff:ff
インターフェースがペアで生成されていますね。まだネットワーク名前空間は作っていませんが、
$ sudo ip addr add 10.10.10.10/24 dev veth0-host (veth0-hostにアドレス設定) $ sudo ip addr add 10.10.10.11/24 dev veth0-ct (veth0-ctにアドレス設定) $ sudo ip link set up veth0-host (veth0-hostをup) $ sudo ip link set up veth0-ct (veth0-ctをup) $ sudo ip addr show :(略) 3: veth0-ct: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether be:82:25:d8:94:30 brd ff:ff:ff:ff:ff:ff inet 10.10.10.11/24 scope global veth0-ct valid_lft forever preferred_lft forever inet6 fe80::bc82:25ff:fed8:9430/64 scope link valid_lft forever preferred_lft forever 4: veth0-host: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 12:e5:61:4b:42:ba brd ff:ff:ff:ff:ff:ff inet 10.10.10.10/24 scope global veth0-host valid_lft forever preferred_lft forever inet6 fe80::10e5:61ff:fe4b:42ba/64 scope link valid_lft forever preferred_lft forever
アドレスを割り当てて、ping
を実行してみましょう。
$ ping -I veth0-host 10.10.10.11 PING 10.10.10.11 (10.10.10.11) from 10.10.10.11 veth0-host: 56(84) bytes of data. From 10.10.10.10 icmp_seq=1 Destination Host Unreachable From 10.10.10.10 icmp_seq=2 Destination Host Unreachable From 10.10.10.10 icmp_seq=3 Destination Host Unreachable
veth0-host
からveth0-ct
にping
を実行してみましたが、
ここでネットワーク名前空間の出番です。ip
コマンドでnetns01
という名前のネットワーク名前空間を作ってみましょう。
$ sudo ip netns add netns01 (ネットワーク名前空間の追加) $ sudo ip netns list (ネットワーク名前空間の確認) netns01
netns01
という名前でネットワーク名前空間が作成されました。veth0-ct
をnetns01
に移動させてみましょう。
$ sudo ip link set veth0-ct netns netns01 (veth0-ctをnetns01に移動)
$ sudo ip link show | grep veth0
4: veth0-host: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
移動コマンドを実行した後は、ip link
コマンドにはveth0-ct
は出てきません。では名前空間netns01
内で確認してみます。ip netns exec (名前空間名)
で指定したネットワーク名前空間内でコマンドが実行できます。
$ sudo ip netns exec netns01 ip link show 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 3: veth0-ct: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether be:82:25:d8:94:30 brd ff:ff:ff:ff:ff:ff
ご覧のようにnetns01
名前空間へのインターフェースveth0-ct
の移動が確認できました。ここで再度veth0-ct
にIPアドレスを設定して有効化してみましょう。
$ sudo ip netns exec netns01 ip addr add 10.10.10.11/24 dev veth0-ct $ sudo ip netns exec netns01 ip link set veth0-ct up $ sudo ip netns exec netns01 ip addr show 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 3: veth0-ct: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether be:82:25:d8:94:30 brd ff:ff:ff:ff:ff:ff inet 10.10.10.11/24 scope global veth0-ct valid_lft forever preferred_lft forever inet6 fe80::bc82:25ff:fed8:9430/64 scope link valid_lft forever preferred_lft forever
無事veth0-ct
にIPアドレスが割り当てられ有効になりました。ここで再度ホストからping
を実行してみましょう。
$ ping -I veth0-host 10.10.10.11 PING 10.10.10.11 (10.10.10.11) from 10.10.10.10 veth0-host: 56(84) bytes of data. 64 bytes from 10.10.10.11: icmp_req=1 ttl=64 time=0.134 ms 64 bytes from 10.10.10.11: icmp_req=2 ttl=64 time=0.098 ms 64 bytes from 10.10.10.11: icmp_req=3 ttl=64 time=0.097 ms :(略)
先ほどと違ってping
に対して反応がありました。そうです、 vethはペアがお互いに異なるネットワーク名前空間に存在しなければ通信ができません 。
名前空間内のveth0-ct
からホスト上のveth0-host
に対してping
を実行しても、
$ sudo ip netns exec netns01 ping 10.10.10.10 PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. 64 bytes from 10.10.10.10: icmp_req=1 ttl=64 time=0.069 ms 64 bytes from 10.10.10.10: icmp_req=2 ttl=64 time=0.068 ms 64 bytes from 10.10.10.10: icmp_req=3 ttl=64 time=0.075 ms
あとはnetns01
内でルーティングの設定を行ったり、
macvlan
ホストと同じネットワークにコンテナを接続する場合、
macvlanは、eth0
のような物理的なインターフェースに、
LinuxではIPエイリアスと言って、
一方、
macvlanが設定されたインターフェースでは、
仮想インターフェースとは言っても、
ではさっそくmacvlanインターフェースを作成してみましょう。
$ sudo ip addr show :(略) 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:56:3b:3a brd ff:ff:ff:ff:ff:ff inet 192.168.122.199/24 brd 192.168.122.255 scope global eth0 inet6 fe80::5054:ff:fe56:3b3a/64 scope link valid_lft forever preferred_lft forever
以上のようなインターフェースeth0
上にmacvlan0
というインターフェースを作成します。
$ sudo ip link add dev macvlan0 link eth0 type macvlan mode bridge (eth0でmacvlan0を作成)
$ sudo ip link show
: (略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:56:3b:3a brd ff:ff:ff:ff:ff:ff
3: macvlan0@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether 9e:0e:0e:d5:bb:2f brd ff:ff:ff:ff:ff:ff
macvlan0
インターフェースが作成されました。作成時に指定しているmode bridge
の部分は後で説明します。
それではDHCPでIPアドレスを割り当ててみましょう。
$ sudo dhclient macvlan0 (DHCPでアドレスを取得)
$ sudo ip addr show
:(略)
3: macvlan0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 9e:0e:0e:d5:bb:2f brd ff:ff:ff:ff:ff:ff
inet 192.168.122.83/24 brd 192.168.122.255 scope global macvlan0
inet6 fe80::9c0e:eff:fed5:bb2f/64 scope link
valid_lft forever preferred_lft forever
ご覧のようにIPアドレスが割り当たりましたね。
macvlanインターフェースとホストインターフェース間の通信
macvlanインターフェースは実装の仕組み上、eth0
)
コンテナとホスト間で通信が必要な場合には使えません。
macvlanのモード
macvlanインターフェースはいくつかのモードを持ちます。
先の例でmacvlanインターフェースを作成する際にmode bridge
としました。これはmacvlanのモードをbridge
モードに設定しています。
以下で簡単にmacvlanが持つモードを紹介します。なお、
privateモード
mode private
と設定すると、
たとえば、eth0
に接続するmacvlanインターフェースとしてmacvlan0
とmacvlan1
インターフェースをprivateモードで作成した場合、macvlan0
とmacvlan1
の間の通信はできません。
同じインターフェースに接続するmacvlanインターフェースを多数作成して、
bridgeモード
先の例でmode bridge
と設定したモードがこのbridgeモードです。bridgeモードで設定すると、
vepaモード
vepaモードはbridgeモードのように、
しかしbridgeモードとは違い、
この外部のスイッチがVEPAをサポートしている場合、
つまりコンテナのホストがVEPA対応のネットワーク機器に接続されている場合に使用するモードです。
passthruモード
KVMで使われる機能に、
このモードはLXCから使えませんのでここでは説明しません
- ※)
- 現在はpassthruモードが指定できるようになりました。ただし、
現時点でリリースはされていません。新機能ですから1. 2がリリースされる時に指定できるようになると思います。
まとめ
今回はLinuxカーネルに実装されているコンテナに関連するネットワーク機能を2つ紹介しました。いずれもこれまでのカーネルの機能と同様に、
さて、
LXC日本語ページの移行
第2回でLXC公式ページの日本語サイトを紹介しましたが、
まだ移行作業中ですが、