ทดลองใช้งาน Docker พื้นฐาน #2

CrossKnight
3 min readFeb 11, 2020

--

หลังจากที่ได้เล่น 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-certificates

RUN 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

docker history debiandock

เพื่อให้เข้าใจได้ง่ายขึ้น จึงขอเปลี่ยนรูปเป็นแบบด้านล่างแทน

Portainer.io

ต่อไปให้ลองแก้ไขไฟล์ 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

debiandock vs small_debiandock | 150MB vs 116MB

จากรูปจะเห็นว่า 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:/html

volumes:
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 socketserver

handler = 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 ต่างๆได้ด้วย

--

--

No responses yet