5. Open Cloud Campus
5
Linux女子部 Dockerを支える技術
一般的なサーバ仮想化の分類
物理マシン
物理マシン
ホスト OS
ハイパーバイザ
(カーネルモジュール)
仮想
マシン
ゲスト
OS
VMware vSphere, Xen など
Linux KVM
ハードウェアによる仮想化
(物理マシンにハイパーバイザを内蔵)
ソフトウェアによる仮想化
(物理マシン上にハイパーバイザを導入)
ソフトウェアによる仮想化
(ホスト OS にハイパーバイザ機能を追加)
物理マシン
OS
非仮想化環境
基本的には「物理マシン」と同等の「仮想マシン」を複数
作り出す技術です。
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
ハイパーバイザ(ソフトウェア)
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
物理マシン
ハイパーバイザ(ファームウェア)
29. Open Cloud Campus
29
Linux女子部 Dockerを支える技術
Network namespaceの操作方法
– /var/run/netns/以下からFDにシンボリックリンクを張ると、ipコマンド管理下のネームスペースと
して認識されます。
– この後は、次のコマンドにより、ネームスペース「hoge-ns」内部でコマンド(プロセス)を実行で
きるようになります。
– たとえば、bashを起動するとネームスペース内部のネットワーク構成が確認できます。(あくまで
「Network namespace」だけを切り替えているので、ネットワーク以外の環境はホストLinuxと同じ
状態です。)
# mkdir /var/run/netns
# ln -s /proc/502/ns/net /var/run/netns/hoge-ns
# ip netns
hoge-ns
# ip netns exec hoge-ns <command>
# ip netns exec hoge-ns bash
# ifconfig eth0
eth0: flags=67<UP,BROADCAST,RUNNING> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
...
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
# exit
# ip netns exec hoge-ns <command>
30. Open Cloud Campus
30
Linux女子部 Dockerを支える技術
「オレオレ仮想NIC」の追加方法
「ip netns exec」を駆使すると、起動中のコンテナにあとから仮想NICを追加することも可能
です。図のようにブリッジ「br0」を経由して、外部ネットワークに直結した仮想NICを追加
してみます。
– まずは、ブリッジ「br0」を用意して、物理NICのIPアドレス(この例では192.168.200.20/24)を
ブリッジに付け替えます。
# brctl addbr br0; ip link set br0 up
# ip addr del 192.168.200.20/24 dev eth0; ip addr add 192.168.200.20/24 broadcast
192.168.200.255 dev br0; brctl addif br0 eth0; route add default gw 192.168.200.1
# echo 'NM_CONTROLLED="no"' >> /etc/sysconfig/network-scripts/ifcfg-eth0
# systemctl enable network.service
ホストLinux
vethXX
eth0
コンテナ
docker0
IPマスカレード
外部ネットワーク
vethYY
eth1
br0
192.168.200.99
192.168.200.20
192.168.200.20
eth0
※IPアドレスを付け替える最後の3行は、何をやっているのか
理解できる方だけ実施してください。
31. Open Cloud Campus
31
Linux女子部 Dockerを支える技術
「オレオレ仮想NIC」の追加方法
– vethペア「veth-host/veth-geust」を作成して、「veth-host」をブリッジ「br0」に接続します。
# ip link add name veth-host type veth peer name veth-guest
# ip link set veth-guest down
# brctl addif br0 veth-host
# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.525400677470 no eth0
veth-host
ホストLinux
vethXX
eth0
コンテナ
docker0
IPマスカレード
外部ネットワーク
veth-host
veth-guest
br0
eth0
• この時点では、「veth-host」「veth-guest」共にホスト
Linuxから見えています。
32. Open Cloud Campus
32
Linux女子部 Dockerを支える技術
「オレオレ仮想NIC」の追加方法
– 次のコマンドで「veth-guest」をコンテナのネームスペースに入れます。この時点で、ホストLinux
からは、「veth-guest」は見えなくなります。
– この後は、コンテナのネームスペース内で、コンテナから見えるネットワーク環境を設定します。コ
ンテナ内でのデバイス名を「eth1」に変更した後に、IPアドレスを設定します。さらにルーティング
テーブルを変更して、「eth1」側をデフォルトゲートウェイにします。
# ip link set veth-guest netns hoge-ns
# ifconfig veth-guest
veth-guest: error fetching interface information: Device not found
# ip netns exec hoge-ns ip link set veth-guest name eth1
# ip netns exec hoge-ns ip addr add 192.168.200.99/24 dev eth1
# ip netns exec hoge-ns ip link set eth1 up
# ip netns exec hoge-ns ip route delete default
# ip netns exec hoge-ns ip route add default via 192.168.200.1