godleon bio photo

godleon

Leon Tseng

Email Facebook Google+ Github Youtube

安裝 LXC @Ubuntu 14.04.3

使用以下指令安裝 LXC 相關的套件:

$ sudo apt-get -y install lxc lxc-templates bridge-utils debootstrap

操作 Linux Container

建立 Container

透過 **lxc-create** 指令,建立全新的 container:

# type = ubuntu
# name = lxc_ubuntu
$ sudo lxc-create -t ubuntu -n lxc_ubuntu
......
......
...... (很多訊息)
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

若 container type 是 ubuntu,則預設的帳號密碼皆為 **ubuntu**


查詢 container 結構

安裝好的 container 都會放在 **/var/lib/lxc** 目錄中:

$ sudo tree -L 2 /var/lib/lxc/lxc_ubuntu
/var/lib/lxc/lxc_ubuntu
├── config
├── fstab
└── rootfs
    ├── bin
    ├── boot
    ├── dev
    ├── etc
    ├── home
    ├── lib
    ├── lib64
    ├── media
    ├── mnt
    ├── opt
    ├── proc
    ├── root
    ├── run
    ├── sbin
    ├── srv
    ├── sys
    ├── tmp
    ├── usr
    └── var

啟動並登入 container

透過 **lxc-start** 指令,啟動並登入 container:

$ sudo lxc-start -n lxc_ubuntu
......
......
...... (很多訊息)
Ubuntu 14.04.2 LTS lxc_ubuntu console

lxc_ubuntu login: ubuntu
Password:
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-52-generic x86_64)

以背景方式啟動 container

加上 **-d** 參數,就可以讓 container 在背景啟動:

$ sudo lxc-start -n lxc_ubuntu -d

接著我們可以透過 **lxc-console** 指令來登入背景啟動的 container:

$ sudo lxc-console -n lxc_ubuntu

複製 container

透過 **lxc-clone** 指令,可以快速地複製出 container:

# src = lxc_ubuntu
# clone = lxc_ubuntu_clone
$ sudo lxc-clone -o lxc_ubuntu -n lxc_ubuntu_clone

移除 container

透過 **lxc-destroy** 指令移除 container:

$ sudo lxc-destroy -n lxc_ubuntu_clone

基本網路設定

lxcbr0

安裝好 lxc 套件後,系統會自動產生一個 **lxcbr0** 作為管理 container 網路之用。

可以透過以下指令看到 lxcbr0 的 process 資訊:

$ ps -aux | grep lxcbr0
qct      13511  0.0  0.0  11748  2208 pts/1    S+   15:14   0:00 grep --color=auto lxcbr0
lxc-dns+ 35285  0.0  0.0  28212  2364 ?        S    13:53   0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative

可以看的出來 lxcbr0 中跑了一個 dhcp server(包含派發的 ip 範圍),並設定 gateway 為 10.0.3.1。

若要設定 lxcbr0 的 dhcp 設定,可以修改 **/etc/default/lxc-net**

修改完後使用以下指令重新啟動即可套用新設定:

$ sudo service lxc-net restart

建立新的 bridge device 並與 container 綁定

1、建立 bridge device

# bridge device name = br_private
$ sudo brctl addbr br_private

2、啟動 bridge device

$ sudo ifconfig br_private up

3、檢視新的 bridge device 狀態

$ sudo brctl show
[sudo] password for qct:
bridge name     bridge id               STP enabled     interfaces
br_private      8000.fe642c445344       no
lxcbr0          8000.000000000000       no

可以看到目前沒有任何 nic 與新的 bridge device 綁定。

4、修改 container config (/var/lib/lxc/lxc_ubuntu/config)

# 原始設定
#lxc.network.type = veth
#lxc.network.flags = up
#lxc.network.link = lxcbr0
#lxc.network.hwaddr = 00:16:3e:d3:22:54

# 改成以下設定
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br_private
lxc.network.ipv4 = 172.16.100.11/24
lxc.network.hwaddr = 00:16:3e:d3:22:54

如此一來,將 container 重新啟動之後,container 就會與新的 bridge device 綁定並改為新的 ip。

5、檢視新的 bridge device 狀態

$ sudo brctl show
[sudo] password for qct:
bridge name     bridge id               STP enabled     interfaces
br_private      8000.fe642c445344       no              veth47MR72
                                                        vethWNVYY0
lxcbr0          8000.000000000000       no

因為我在系統裡面啟動了兩個 container,所以可以看得出這兩個 container 的 nic 都已經跟新的 bridge device 綁定了!


連接跨 Host 的 container

1、安裝 open vswitch

$ sudo apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath-source

1、建立 bridge device

在兩台 host 上執行以下指令:

$ sudo brctl addbr superbr0

2、建立 GRE tap device

分別在不同的 host 執行指令:

# @host01
$ sudo ip link add testgre type gretap remote 10.5.23.52 local 10.5.23.51 ttl 255

# @host02
$ sudo ip link add testgre type gretap remote 10.5.23.51 local 10.5.23.52 ttl 255

3、連結 bridge device & GRE tap device

在兩台 host 上執行以下指令:

$ sudo brctl addif superbr0 testgre

Host A

$ sudo ifconfig superbr0 192.168.20.1 netmask 255.255.255.0 up
$ sudo dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/dnsmasq-superbr0.pid --listen-address 192.168.20.1 --dhcp-range 192.168.20.2,192.168.20.254 --dhcp-lease-max=253 --dhcp-no-override --interface=superbr0

參考資料

基本概念

網路概念

Linux Network Namespace

Linux Bridge

Open vSwitch

實作相關

Others

2013-11-25 A Brief Introduction to Linux Containers with LXC · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2013-11-26 LXC, Open vSwitch, and GRE Tunnels · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2013-11-27 Linux Containers via LXC and Libvirt · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2013-12-03 Connecting LXC to Open vSwitch Using Libvirt · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2014-01-12 Automatically Connecting LXC to Open vSwitch · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2013-12-18 Managing Open vSwitch with Puppet · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing

2015-05-06 A Quick Introduction to LXD · Scott’s Weblog · The weblog of an IT pro specializing in virtualization, networking, open source, and cloud computing