ติดตั้งและทดลองใช้ Docker บน CentOS 7

ถือว่ามาแรงมากในรอบปีที่ผ่านมา สำหรับ docker ที่ช่วยบริหารจัดการซอฟต์แวร์เพื่อให้รันบนลีนุกซ์ที่แตกต่างกันได้

โดยจะมีการรวบรวมซอฟต์แวร์ ขั้นตอนการติดตั้ง libraries การคอนฟิก และอื่นๆ ที่จำเป็น รวมเป็น image เพื่อให้สามารถนำไปรันภายใต้ container ซึ่งเป็นคุณสมบัติหนึ่งของ kernel ในลีนุกซ์ ได้อย่างไม่มีปัญหา

ในที่นี้ขอแสดงการติดตั้งและทดลองใช้ docker เบื้องต้น โดยจะทดลองบน CentOS 7

ติดตั้งและรันเซิร์ฟเวอร์ docker

ใช้คำสั่ง yum install ติดตั้ง docker

[root@cent7-docker ~]# yum install docker

รันเซอร์วิสเซิร์ฟเวอร์ docker (Docker Server)

[root@cent7-docker ~]# systemctl start docker

ลองรันคำสั่ง docker ตามด้วย version เพื่อแสดงข้อมูลเวอร์ชันการติดตั้งของ docker

[root@cent7-docker ~]# docker version
Client:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version: docker-1.8.2-10.el7.centos.x86_64
 Go version:   go1.4.2
 Git commit:   a01dc02/1.8.2
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version:
 Go version:   go1.4.2
 Git commit:   a01dc02/1.8.2
 Built:
 OS/Arch:      linux/amd64

รันคำสั่ง docker ตามด้วย info เพื่อแสดงข้อมูลเกี่ยวกับ container, images การใช้พื้นที่ดิสก์ ที่อยู่บนเซิร์ฟเวอร์

[root@cent7-docker ~]# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-253:0-134350219-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 1.821 GB
 Data Space Total: 107.4 GB
 Data Space Available: 34.38 GB
 Metadata Space Used: 1.479 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.107-RHEL7 (2015-10-14)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-327.3.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 993 MiB
Name: cent7-docker.example.com
ID: D6B2:DOOM:MAAW:TTTZ:SS5E:UMKW:TMID:PHPY:5WJ7:IDV2:GCMB:MX2X
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@cent7-docker ~]#

ตอนนี้บนเซิร์ฟเวอร์ docker ยังไม่มี container หรือ image ใดๆ

ค้นหาและดาวน์โหลด Docker Image

เริ่มต้นบนเซิร์ฟเวอร์ต้องมี image ก่อน วิธีการที่ง่ายที่สุดสำหรับการเริ่มต้นหัดใช้ คือดาวน์โหลด image ที่ถูกสร้างไว้อยู่แล้ว (pre-built image) จาก Docker Hub Repository

บนเว็บไซต์ Docker Hub (https://hub.docker.com/) จะสามารถค้นหา image ที่ต้องการได้

ตัวอย่างผลการค้นหา image ที่ชื่อ centos
d01-docker-hub-search-repository

image ที่อยู่บน Docker Hub Repository นี้ ใครก็ได้สามารถอัพโหลดขึ้นไปได้ แต่จะมี image อย่างเป็นทางการ (Official) ที่ทาง docker เป็นผู้สร้างเอง

ลองคลิก DETAILS เข้าไปดูรายละเอียดของ centos official

ตัวอย่างรายละเอียดของ image อย่างเป็นทางการที่ชื่อ centos
d02-docker-centos-details

นอกจากจะเข้าเว็บไซต์ Docker Hub เพื่อค้นหาแล้ว เราสามารถใช้คำสั่ง docker search เพื่อค้นหา image จากคำที่เราต้องการได้

ตัวอย่างการใช้คำสั่ง docker search เพื่อค้นหา image ที่ชื่อ centos

[root@cent7-docker ~]# docker search centos
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                            The official build of CentOS.                   1774      [OK]
docker.io   docker.io/ansible/centos7-ansible           Ansible on Centos7                              61                   [OK]
docker.io   docker.io/jdeathe/centos-ssh                CentOS-6 6.7 x86_64 / EPEL/IUS Repos / Ope...   14                   [OK]
docker.io   docker.io/jdeathe/centos-ssh-apache-php     CentOS-6 6.7 x86_64 / Apache / PHP / PHP m...   11                   [OK]
...

ใช้คำสั่ง docker pull เพื่อดาวน์โหลด image ที่ต้องการ มาใส่ไว้ใน docker server ของเราเอง

[root@cent7-docker ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... latest: Pulling from library/centos
47d44cb6f252: Pull complete
838c1c5c4f83: Pull complete
5764f0a31317: Pull complete
60e65a8e4030: Pull complete
library/centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:8072bc7c66c3d5b633c3fddfc2bf12d5b4c2623f7004d9eed6aae70e0e99fbd7
Status: Downloaded newer image for docker.io/centos:latest

ดีฟอลต์จะเป็นการดาวน์โหลดเวอร์ชันล่าสุด (tag latest)

รันคำสั่ง docker images เพื่อดูรายชื่อ images ที่ถูกติดตั้งบนเซิร์ฟเวอร์ docker ของเราเอง

[root@cent7-docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    latest              60e65a8e4030        2 days ago          196.6 MB

รัน Docker Container

หลังจากที่มี image แล้ว เราสามารถใช้คำสั่ง docker run เพื่อรัน image นั้นขึ้นมา เป็น container ใหม่

ระบุออปชัน -i และ -t เพื่อรัน container ในโหมดที่สามารถพิมพ์คำสั่งลงไปได้ (interactive shell)

ตัวอย่างการรัน container จาก image ชื่อ centos ในโหมดโต้ตอบได้

[root@cent7-docker ~]# docker run -i -t centos
[root@584761281fa0 /]#

สังเกตที่ prompt จะเป็นไป เป็นเลข id ของ container ที่รันขึ้นมา

ตอนนี้เท่ากับว่าเราอยู่ใน container แล้ว ลองพิมพ์คำสั่งต่างๆ

[root@584761281fa0 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

[root@584761281fa0 /]# uname -a
Linux 584761281fa0 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

[root@584761281fa0 /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  11772  1868 ?        Ss   04:01   0:00 /bin/bash
root        25  0.0  0.1  35888  1472 ?        R+   04:04   0:00 ps aux

อย่าเพิ่ง exit ออกจาก container ลองเปิดอีกหน้าจอหนึ่ง แล้วล็อกอินเข้า ตัว docker server

พิมพ์คำสั่ง docker ps

[root@cent7-docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
584761281fa0        centos              "/bin/bash"         5 minutes ago       Up 5 minutes                            romantic_varahamihira

คำสั่ง docker ps บนเซิร์ฟเวอร์ จะแสดง container ที่รันอยู่

สลับไปหน้าจอของ container พิมพ์ exit เพื่อออกจาก container

[root@584761281fa0 /]# exit
exit
[root@cent7-docker ~]#

บนเซิร์ฟเวอร์ ลองพิมพ์ docker ps อีกครั้ง

[root@cent7-docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ไม่มี container รันอยู่แล้ว

ดีฟอลต์คำสั่ง docker ps จะแสดงเฉพาะ container ที่ถูกรันอยู่เท่านั้น

แต่ตัว container ยังมีอยู่ ต้องระบุออปชัน -a ตามหลัง เพื่อแสดง container ที่มีอยู่ทั้งหมด

[root@cent7-docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
584761281fa0        centos              "/bin/bash"         11 minutes ago      Exited (1) 3 minutes ago                       romantic_varahamihira

เราสามารถรันเพื่อสร้าง container ขึ้นมาใหม่อีกได้ ซึ่งแต่ละ container จะถูกรัน ทำงานแยกกัน

[root@cent7-docker ~]# docker run -i -t centos
[root@2af52e276f56 /]# exit
exit

[root@cent7-docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
2af52e276f56        centos              "/bin/bash"         58 seconds ago      Exited (127) 13 seconds ago                       goofy_ramanujan
584761281fa0        centos              "/bin/bash"         14 minutes ago      Exited (1) 6 minutes ago                          romantic_varahamihira

สังเกตที่ตัวเลข CONTAINER ID

หากต้องการรัน container เดิมที่มีอยู่แล้ว สามารถใช้คำสั่ง docker start ระบุชื่อ (NAME) หรือ ID ของ container ที่ต้องการ

ตัวอย่างการรัน container เดิม

[root@cent7-docker ~]# docker start 584761281fa0
584761281fa0

ใช้คำสั่ง docker ps เพื่อดูสถานะของ container

[root@cent7-docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
584761281fa0        centos              "/bin/bash"         18 minutes ago      Up 19 seconds                           romantic_varahamihira

ใช้คำสั่ง docker attach เพื่อเชื่อมต่อเข้าไปใน container ที่รันอยู่

[root@cent7-docker ~]# docker attach 584761281fa0
[root@584761281fa0 /]#

รัน Docker Container Ubuntu บน CentOS 7

ตัวอย่างการรัน docker เพื่อค้นหา ดาวน์โหลด image และรัน container ของ ubuntu บน CentOS 7

ค้นหา image ชื่อ ubuntu

[root@cent7-docker ~]# docker search ubuntu
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/ubuntu                            Ubuntu is a Debian-based Linux operating s...   2878      [OK]
docker.io   docker.io/ubuntu-upstart                    Upstart is an event-based replacement for ...   56        [OK]
docker.io   docker.io/dorowu/ubuntu-desktop-lxde-vnc    Ubuntu with openssh-server and NoVNC on po...   29                   [OK]
docker.io   docker.io/torusware/speedus-ubuntu          Always updated official Ubuntu docker imag...   25                   [OK]
...

ดาวน์โหลด image ที่ชื่อ ubuntu

[root@cent7-docker ~]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ... latest: Pulling from library/ubuntu
9377ad319b00: Pull complete
a82f81f25750: Pull complete
b207c06aba70: Pull complete
d55e68e6cc9c: Pull complete
library/ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:a2b67b6107aa640044c25a03b9e06e2a2d48c95be6ac17fb1a387e75eebafd7c
Status: Downloaded newer image for docker.io/ubuntu:latest

รัน container

[root@cent7-docker ~]# docker run -i -t ubuntu

root@9294a512b028:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

root@9294a512b028:/# uname -a
Linux 9294a512b028 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

root@9294a512b028:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18168  2028 ?        Ss   04:26   0:00 /bin/bash
root        17  0.0  0.1  15564  1136 ?        R+   04:27   0:00 ps aux

root@9294a512b028:/# exit
exit

[root@cent7-docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
9294a512b028        ubuntu              "/bin/bash"         About a minute ago   Exited (0) 4 seconds ago                          trusting_stallman
2af52e276f56        centos              "/bin/bash"         12 minutes ago       Exited (127) 12 minutes ago                       goofy_ramanujan
584761281fa0        centos              "/bin/bash"         26 minutes ago       Exited (127) 5 minutes ago                        romantic_varahamihira

สังเกตว่า container จะใช้ kernel เวอร์ชันเดียวกับตัวเซิร์ฟเวอร์

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.