Container

จาก Wiki Opensource

บันทึกนี้ปรับปรุงล่าสุดเมื่อวันที่ 25-7-2559
อัปเดตโดย วิบูลย์ วราสิทธิชัย

KM Open Source Technology ตอน container

ในตอนนี้ เราจะนำเสนอความรู้เกี่ยวกับ container ที่มาพร้อมกับ Ubuntu 16.04 มีชื่อเรียกว่า LXD

การเรียนรู้ของเราจะเริ่มต้นที่ เราทุกคนมี Ubuntu server 16.04 ติดตั้งแบบ default ไว้แล้ว

1. เราจะทำ bridge เพื่อให้ lxc containers ใช้ IP ในวงแลนเดียวกับ hosts

mama@ubuntu:~$ sudo apt-get install bridge-utils

1.1 ในขั้นตอนนี้เราต้องแก้ไขแบบ manual ไปที่ไฟล์ /etc/network/interfaces เดิม

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp

ใหม่

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet manual

auto br0
iface br0 inet dhcp
bridge_ifaces enp0s3
bridge_ports enp0s3

1.2 ทำการ reboot server แล้วตรวจสอบผลได้ interface br0 พร้อม IP

mama@ubuntu:~$ ifconfig
br0       Link encap:Ethernet  HWaddr 08:00:27:78:ec:d3  
          inet addr:10.0.100.211  Bcast:10.0.100.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe78:ecd3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0
          TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6859 (6.8 KB)  TX bytes:8257 (8.2 KB)

enp0s3    Link encap:Ethernet  HWaddr 08:00:27:78:ec:d3  
          inet6 addr: fe80::a00:27ff:fe78:ecd3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:7559 (7.5 KB)  TX bytes:8941 (8.9 KB)

2. ต่อไปติดตั้ง file system ชนิด zfs ที่ใช้งานกับ container

mama@ubuntu:~$ sudo apt-get install zfsutils-linux

3. เริ่มต้นตั้งค่าให้กับ lxd โดยเลือกสร้างไฟล์ขนาด 8GB เป็นตัวอย่าง ไม่ใช้ disk จริง

mama@ubuntu:~$ sudo lxd init
Name of the storage backend to use (dir or zfs): zfs
Create a new ZFS pool (yes/no)? yes
Name of the new ZFS pool: lxdpool
Would you like to use an existing block device (yes/no)? no
Size in GB of the new loop device (1GB minimum): 8
Would you like LXD to be available over the network (yes/no)? no
Do you want to configure the LXD bridge (yes/no)? no
LXD has been successfully configured.

4. ต่อไปตั้งค่าให้ lxc container ใช้งานผ่าน network interface br0

sudo dpkg-reconfigure -p medium lxd

4.1 ให้ตอบดังนี้
Would you like to setup a network bridge for LXD containers now? ให้ตอบ No
Do you want to use an existing bridge? ให้ตอบ Yes Bridge interface name: ใส่ค่า br0

5. ข้อมูลต่าง ๆ เมื่อตอนเริ่มต้นมีดังนี้

mama@ubuntu:~$ sudo zpool list
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
lxdpool  7.94G   272K  7.94G         -     0%     0%  1.00x  ONLINE  -

mama@ubuntu:~$ lxc image list
Generating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

+-------+-------------+--------+-------------+------+------+-------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+-------+-------------+--------+-------------+------+------+-------------+

6. คำสั่งนี้จะสร้าง container ชื่อที่ได้มาเป็นแบบสุ่ม เช่น preeternal-jayson

mama@ubuntu:~$ lxc launch ubuntu:16.04
Creating preeternal-jayson
Retrieving image: 100%
Starting preeternal-jayson
mama@ubuntu:~$ lxc image list
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |                  DESCRIPTION                  |  ARCH  |   SIZE   |         UPLOAD DATE          |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|       | d23ee1f4fd28 | no     | ubuntu 16.04 LTS amd64 (release) (20160516.1) | x86_64 | 138.85MB | Jun 13, 2016 at 4:20am (UTC) |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+

6.1 แต่ถ้าเราต้องการได้เป็นชื่อก็ให้ระบุชื่อต่อท้ายคำสั่ง เป็นว่า

lxc launch ubuntu:16.04 myubuntu

6.2 หากไม่เห็นหมายเลข IPV4 กรณีที่รันอยู่ใน Oracle VM Virtualbox ให้ปรับค่า Promiscuous Mode จาก Deny เป็น Allow VMs

mama@ubuntu:~$ lxc list
+-------------------+---------+---------------------+------+------------+-----------+
|       NAME        |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-------------------+---------+---------------------+------+------------+-----------+
| preeternal-jayson | RUNNING | 10.0.100.212 (eth0) |      | PERSISTENT | 0         |
+-------------------+---------+---------------------+------+------------+-----------+

6.3 ถ้าต้องการเปลี่ยนชื่อ container เป็น u1604

mama@ubuntu:~$ lxc stop preeternal-jayson 
mama@ubuntu:~$ lxc move preeternal-jayson u1604
mama@ubuntu:~$ lxc list
+-------+---------+------+------+------------+-----------+
| NAME  |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+------+------+------------+-----------+
| u1604 | STOPPED |      |      | PERSISTENT | 0         |
+-------+---------+------+------+------------+-----------+

6.4 ถ้าต้องการรัน

mama@ubuntu:~$ lxc start u1604

6.5 ถ้าต้องการเข้าไปปรับแก้ (ให้พิมพ์ exit หลังจากแก้ไขเพิ่มเติมเสร็จ)

mama@ubuntu:~$ lxc exec u1604 bash

7. หากต้องการจะค้นหาว่ามี image ชื่อที่ต้องการหรือไม่

mama@ubuntu:~$ lxc image list images: | grep centos
| centos/6/amd64 (1 more)         | 2e7c93d30ad2 | yes    | Centos 6 (amd64) (20160613_02:16)         | x86_64  | 65.77MB  | Jun 13, 2016 at 3:16am (UTC)  |
| centos/6/i386 (1 more)          | 6f31171f4c45 | yes    | Centos 6 (i386) (20160613_02:16)          | i686    | 65.73MB  | Jun 13, 2016 at 3:17am (UTC)  |
| centos/7/amd64 (1 more)         | 24dd61e03876 | yes    | Centos 7 (amd64) (20160613_02:16)         | x86_64  | 62.94MB  | Jun 13, 2016 at 3:19am (UTC)  |

8. หากต้องการ centos/7/amd64 image มาเก็บไว้ก่อน ยังไม่รัน

mama@ubuntu:~$ lxc init images:/centos/7/amd64 centos7amd64

9. หากมี image ที่พร้อมใช้อยู่ที่อีกเครื่องที่เปิดเป็น public ไว้ เราไปเอามาเก็บไว้ใน local ได้ ดังนี้

mama@ubuntu:~$ lxc remote add server1 10.0.100.205 --public
Certificate fingerprint: 3001924196b5e4ce2b63200b41ba6483d59c79c49f2a5dc1684b2c695403e5a3
ok (y/n)? y
mama@ubuntu:~$ lxc image copy server1:ubuntu64+apache2 local: --alias u64a2
Image copied successfully!

10. ตรวจสอบด้วยคำสั่ง

mama@ubuntu:~$ lxc image list
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |                  DESCRIPTION                  |  ARCH  |   SIZE   |         UPLOAD DATE          |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| u64a2 | dfe1d69d2652 | no     | ubuntu with apache2 and php installed         | x86_64 | 155.19MB | Jun 13, 2016 at 6:41am (UTC) |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|       | 24dd61e03876 | no     | Centos 7 (amd64) (20160613_02:16)             | x86_64 | 62.94MB  | Jun 13, 2016 at 8:22am (UTC) |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|       | d23ee1f4fd28 | no     | ubuntu 16.04 LTS amd64 (release) (20160516.1) | x86_64 | 138.85MB | Jun 13, 2016 at 4:20am (UTC) |
+-------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+

11. สร้าง container ชื่อ webserver1 จาก image ชื่อ u64a2

mama@ubuntu:~$ lxc launch u64a2 webserver1
Creating webserver1
Starting webserver1

12. ตรวจสอบดูรายการ container

mama@ubuntu:~$ lxc list
+------------+---------+---------------------+------+------------+-----------+
|    NAME    |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+------------+---------+---------------------+------+------------+-----------+
| u1604      | RUNNING | 10.0.100.212 (eth0) |      | PERSISTENT | 0         |
+------------+---------+---------------------+------+------------+-----------+
| webserver1 | RUNNING | 10.0.100.213 (eth0) |      | PERSISTENT | 0         |
+------------+---------+---------------------+------+------------+-----------+

13. หากต้องการสร้าง image ขึ้นมาเองจาก container เช่น u1604 ที่ติดตั้งโปรแกรมครบถ้วนแล้ว

mama@ubuntu:~$ lxc stop u1604
mama@ubuntu:~$ lxc publish u1604 --alias u1604myapp
Container published with fingerprint: d656cb9e44c0f09d014a0f44cd2ef15bbc6e92f2937113715ebe958c05d36c61
mama@ubuntu:~$ lxc image list
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|   ALIAS    | FINGERPRINT  | PUBLIC |                  DESCRIPTION                  |  ARCH  |   SIZE   |         UPLOAD DATE          |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| u1604myapp | d656cb9e44c0 | no     |                                               | x86_64 | 213.47MB | Jun 13, 2016 at 7:22am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| u64a2      | dfe1d69d2652 | no     | ubuntu with apache2 and php installed         | x86_64 | 155.19MB | Jun 13, 2016 at 6:41am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|            | 24dd61e03876 | no     | Centos 7 (amd64) (20160613_02:16)             | x86_64 | 62.94MB  | Jun 13, 2016 at 8:22am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|            | d23ee1f4fd28 | no     | ubuntu 16.04 LTS amd64 (release) (20160516.1) | x86_64 | 138.85MB | Jun 13, 2016 at 4:20am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+

14. ถ้าต้องการใส่คำอธิบายเพิ่มเติม

mama@ubuntu:~$ lxc image edit u1604myapp
</pre?
จากเดิม
<pre>
autoupdate: false
properties: { }
public: false 

ใหม่

autoupdate: false
properties:
  Description: Ubuntu 16.04 with some changes    
public: true

14.1 ตรวจสอบดูผล

mama@ubuntu:~$ lxc image show u1604myapp
autoupdate: false
properties:
  Description: Ubuntu 16.04 with some changes
public: true

14.2 ดูรายการ

mama@ubuntu:~$ lxc image list
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|   ALIAS    | FINGERPRINT  | PUBLIC |                  DESCRIPTION                  |  ARCH  |   SIZE   |         UPLOAD DATE          |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| u1604myapp | d656cb9e44c0 | yes    |                                               | x86_64 | 213.47MB | Jun 13, 2016 at 7:22am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
| u64a2      | dfe1d69d2652 | no     | ubuntu with apache2 and php installed         | x86_64 | 155.19MB | Jun 13, 2016 at 6:41am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|            | 24dd61e03876 | no     | Centos 7 (amd64) (20160613_02:16)             | x86_64 | 62.94MB  | Jun 13, 2016 at 8:22am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
|            | d23ee1f4fd28 | no     | ubuntu 16.04 LTS amd64 (release) (20160516.1) | x86_64 | 138.85MB | Jun 13, 2016 at 4:20am (UTC) |
+------------+--------------+--------+-----------------------------------------------+--------+----------+------------------------------+
mama@ubuntu:~$ 

15. หากต้องการให้ LXD เปิด port ให้แก่ public

mama@ubuntu:~$ lxc config set core.https_address [::]:8443

15.1 ทดสอบโดยไปที่เครื่องที่มี LXD ติดตั้งอยู่ แล้วทดสอบคำสั่ง
lxc remote add ชื่อserver หมายเลขไอพี --public

16. หากต้องการลบ container ที่ไม่เอาแล้ว

mama@ubuntu:~$ lxc stop webserver1
mama@ubuntu:~$ lxc delete webserver1

16.1 และหากต้องการลบ image ที่ copy ไว้ใน local: เช่น Centos 7 (amd64)

mama@ubuntu:~$ lxc image delete 24dd61e03876