ทดลองใช้งาน Docker พื้นฐาน #2
หลังจากที่ได้เล่น Docker กันมาบ้างแล้วจาก Part แรก วันนี้จะมาทำความเข้าใจในส่วนของ Layer ของ Image ว่ามีการทำงานอย่างไร และการใช้งาน docker-compose
What is Layer of Image ?
หากให้อธิบายให้เข้าใจสั้นๆนั้นก็คือ Layer จะเป็นตัวเก็บการ “เปลี่ยนแปลง” ของ Image นั้นๆ ซึ่ง Image ก็ไม่ได้มีการเปลี่ยนแปลงเพียงแค่ครั้งเดียว แต่มีการเปลี่ยนแปลงตามการเขียน Dockerfile ขึ้น หรืออาจบอกได้ว่าการทำงานคล้ายคลึงกับการ Commit ของ git ดูตัวอย่างกัน
FROM debian:stable
WORKDIR /var/www
RUN apt-get update
RUN apt-get -y — no-install-recommends install curl
RUN apt-get -y — no-install-recommends install ca-certificatesRUN curl https://raw.githubusercontent.com/gadiener/docker-images-size-benchmark/master/main.go -o main.go
RUN apt-get purge -y curl
RUN apt-get purge -y ca-certificates
RUN apt-get autoremove -y
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
หลังจากนั้นก็ทำการ Buildให้มัน Image ตามปกติด้วย
docker build -t debiandock .
เพื่อดูประวัติว่ามีการ “เปลี่ยนแปลง” ของ Layers อย่างใดบ้างให้ใช้คำสั่ง
docker history debiandock
เพื่อให้เข้าใจได้ง่ายขึ้น จึงขอเปลี่ยนรูปเป็นแบบด้านล่างแทน
ต่อไปให้ลองแก้ไขไฟล์ Dockerfile
FROM debian:stable
WORKDIR /var/www
RUN apt-get update && \
apt-get -y — no-install-recommends install curl \
ca-certificates && \
curl https://raw.githubusercontent.com/gadiener/docker-images-size-benchmark/master/main.go -o main.go && \
apt-get purge -y curl \
ca-certificates && \
apt-get autoremove -y && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
และทำการ Build ใหม่
docker build -t small_debiandock .
และลองดูจำนวน Layers ใหม่
ลองเปรียบเทียบขนาดไฟล์ของ Image
จากรูปจะเห็นว่า small_debiandock มีขนาดเล็กกว่า นั้นก็เพราะยิ่งมีคำสั่งหรือกระทำการใดๆต่อ Base Image มากเท่าใด ก็ยิ่งสร้าง Layers มากขึ้นเท่านั้น หรือพูดอีกแง่หนึ่งก็คือทำให้ขนาดไฟล์ของ Image เพิ่มขึ้นนั้นเอง
What is docker-compose ?
เป็น Tool ตัวหนึ่งที่มีไว้จัดการ Container หลายๆตัวในคราวเดียว ตัวอย่างเช่นหากเรามี Application ตัวนึงเช่นต้องการทำ Web Server ก็จะมีในส่วนของ Application เช่น Nginx, Nodejs, MySQL เป็นต้น หากเราต้องมานั่ง Setup ทีละ Application ก็คงจะลำบาก จะดีกว่ามากหากเราจัดการมันได้ในตัวเดียว ซึ่งนั่นก็คือการใช้งาน docker-compose นั้นเอง
ให้ทำการสร้างไฟล์โดยมี structure ดังนี้
docker-compose.yml
version: “3”
services:
server:
build: server/
command: python ./server.py
networks:
— frontend
ports:
— 80:80
volumes:
— server_volume:/htmlvolumes:
server_volume:networks:
frontend:
external:
name: web_network
server/Dockerfile
FROM python:3.7.2-alpine3.8
WORKDIR /html/
ADD server.py .
ADD index.html .
server/index.html
Hello Docker-compose !
server/server.py
#!/usr/bin/env python3
import http.server
import socketserverhandler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer((“”, 80), handler) as httpd:
httpd.serve_forever()
หลังจากนั้นให้ทำการ Build มันซะ แต่คำสั่งจะแตกต่างจากเดิมนิดหน่อย
docker-compose build
เนื่องด้วยตัวไฟล์ docker-compose.yml มีการใช้งานในส่วนของ network เพื่อให้ง่ายต่อการจัดการในภายหลัง ให้สร้าง network ขึ้นมา 1 ตัว
docker network create web_network
และทำการ start/run container ด้วยคำสั่ง
docker-compose up -d
เช็คว่า container มีการ start/run แล้วด้วย
docker-compose ps
หลังจากนั้นให้ลองเข้า Website ด้วย ip/domain ของ docker ที่กำลังรันอยู่
นอกจากนี้ยังสามารถ remote ไปยัง container ด้วยคำสั่ง
docker exec -it web_dock_server_1 sh
หลังจากที่ได้ลองเล่นไปในเบื้องต้นแล้ว บางอ่านอาจจะไม่ชอบหรือไม่ชินกับการใช้งาน shell/terminal ในการควบคุม docker จึงมี Tool มาเสนอนั้นก็คือทำให้ท่านสามารถควบคุบ docker ผ่าน web browser ได้ นั้นคือ
Portainer
เป็น Web Based Container Management ที่มีไว้จัดการ docker อีกทีหนึ่งโดยใช้งานผ่านหน้าเว็ปนั้นเอง และเป็น Open source อีกด้วย รอช้าอยู่ทำไม ติดตั้งกันเลย
docker-compose.yml
version: ‘3’
services:
portainer:
container_name: ${CONTAINER_NAME}
restart: unless-stopped
image: portainer/portainer
volumes:
— portainer_data:/data
— /var/run/docker.sock:/var/run/docker.sock
environment:
VIRTUAL_HOST: ${DOMAINS}ports:
— “80:9000”
volumes:
portainer_data:networks:
default:
external:
name: ${NETWORK}
.env
CONTAINER_NAME=portainer
DOMAINS=labxx.cpsudevops.com
NETWORK=webproxy
ซึ่งในที่นี้ได้มีการใช้งาน env เพื่อให้สะดวกแก้การแก้ไขในภายหน้า
อย่าลืมที่จะสร้าง network ขึ้นมาด้วย
docker network create webproxy
และทำการ start/run ได้เลย โดยหลังจากนั้นให้ลองเข้าด้วย ip/domain ผ่านเว็ปบราวเซอร์ซึ่งการใช้งานครั้งแรกจะมีให้ตั้ง username/password ด้วย อย่าลืมตั้ง password ให้ยากด้วยซะด้วยละ !
และเลือก “Local” หลังจากนั้นก็จะพบกับหน้าตาประมาณนี้
ซึ่งตัว tool นี้ก็สามารถจัดการกับ container/image ของเราได้เหมือนกับการใช้งาน docker ที่ใช้งานผ่าน shell/terminal เลย ทดลองเล่นดูกันได้ครับ
และยังสามารถดู status รายตัวของ container ต่างๆได้ด้วย