Docker Part 5 - Create Image

สร้าง Image ของตัวเองใช้กัน

ในตอนก่อนๆเราได้รู้เกี่ยวกับการใช้งาน Docker สร้าง ลบ แก้ไข Container กันมาแล้ว ในตอนนี้เราจะมาสร้าง Image มาใช้กันเองบ้าง ซึ่งเมื่อสร้างได้แล้วจะเริ่มเข้าใจว่าเราจะเอามันไปใช้งานยังไงในงานจริง

Image มันคืออะไร

Image ก็คือตัวต้นแบบของ container เมื่อเราสร้าง container จาก image ไหน เราจะได้ container ที่หน้าตาเหมือนกัน (แต่เป็นคนละตัวกัน) ออกมา ถ้ามองง่ายๆคือ Image คือ พิมพ์สร้างเยลลี่ครับ ส่วน container คือเยลลี่ที่เราสร้างมาจากพิมพ์ครับ หากคำอธิบายของผมยังไม่เข้าใจ ลองไปอ่านของคุณ Rachata Tongpagdee หรือของท่านอื่นๆดูครับ

First Image

ในการจะสร้าง Image นั้นเราจะต้องสร้างไฟล์ที่ชื่อ Dockerfile ขึ้นมาครับ โดยในเนื้อไฟล์มีหน้าตาประมาณนี้ก่อนครับ

สร้าง Image

1
FROM httpd:2-alpine

จากนั้นย้าย current directory ไปที่ directory ที่ Dockerfile อยู่จากนั้นสั่งตามคำสั่งนี้ครับ

1
2
3
4
docker build -t first-image .

# docker build คือคำสั่งที่ทำการสร้าง Image ขึ้นมา โดยทำการดูวิธีการสร้าง Image จากไฟล์ Dockerfile
# -t เป็น parameter ที่บอกว่า image นี้มีชื่อว่าอะไร โดยจากตัวอย่างจะตั้งชื่อว่า first-image

โดย Run แล้วจะได้ตามภาพครับ

ลองตรวจสอบว่าเราสามารถสร้าง Image ขึ้นมาได้จริงไหมโดยสามารถสั่ง

1
2
3
docker images

# docker images เป็นคำสั่งที่แสดง Image ทั้งหมดที่มีอยู่ในเครื่องเราตอนนี้

จากภาพจะเห็นว่า image : first-image จะโผล่ขึ้นมานั่นแปลว่าเราสามารถสร้าง Image ของเราได้แล้ว

Run image ที่สร้างกัน

เรามาลอง Run กันดูดีกว่าว่ามันทำงานได้รึเปล่า

1
docker run --name my_test first-image

จากภาพจะเห็นว่าเราสามารถ Run ตัว image ที่เราสร้างขึ้นมาได้ ซึ่งมันเหมือน image httpd เลย ซึ่งมันเกิดมาจาก Dockerfile ของเรานั่นเอง เดี๋ยวเรามาอธิบายกัน

1
2
3
FROM httpd:2-alpine 

# FROM คือการบอกว่า เราจะสร้าง Image นี้โดยเริ่มมาจากต้นแบบที่เป็น Image ใด โดยจากตัวอย่างผมเอามาจาก httpd:2-alpine

โดยจากที่ผมอธิบายไป FROM คือบอกว่า Image ที่เราจะสร้างเนี่ยเริ่มจาก Image ไหน โดยจากตัวอย่างผมเอามาจาก httpd:2-alpine ซึ่งทำให้เวลาเราทำการ Run image ตัวนี้ทำให้ได้ผลแบบเดียวกันกับ httpd:2-alpine เลย

ลอง Customize กันหน่อย

จากนี้เราจะมาเริ่มทำการปรับแต่ง image ที่เราจะสร้างกัน โดยลองไปทำการแก้ไฟล์ Dockerfile ให้เป็นดังภาพ

1
2
3
4
5
FROM httpd:2

RUN echo "Hello wolrd"
RUN echo "YOU CAN RUN ANY COMMAND IN CONTAINER"
RUN ls -lah /

จากนั้นสั่ง build อีกครั้งหนึ่งจะได้ผลลัพธ์ดังภาพ

จะเห็นว่ามีการ run echo และ ls -lah ขึ้นมาในกระบวนการสร้างซึ่งตรงกับที่อยู่ใน Dockefile ดังนั้นก็คงจะพอเดากันได้แล้วซึ่งมันมาจากคำสั่ง RUN นั่นเอง

RUN

RUN ใน Dockerfile นั้นหมายถึงสั่ง run command ใน image ที่เราจะสร้างครับ โดยจากตัวอย่างผมสั่ง Run คำสั่ง echo และ ls -lah เพื่อโชว์เห็นว่าเราสามารถ run คำสั่งอะไรก็ได้ในเครื่อง Image (ตราบเท่าที่ Image มันมีนะ) โดยปกติ RUN ใน dockerfile มีไว้ลงพวกโปรแกรมเพิ่มเติมที่เราอยากจะ Customize หรือทำการ compile source code ตัวอย่างเช่น ผมต้องการให้ image นี้ลง vim ด้วยผมก็แค่เพิ่ม command เกี่ยวกับการ install vim เข้าไป

1
2
3
4
FROM httpd:2

RUN apt-get update
RUN apt-get install vim -y

ลองสั่ง build image ดูครับ จะเห็นว่าตอน Run จะมีการ Install ตัวโปรแกรม vim เข้าไปใน Image โดยเราสามารถลอง run image แล้ว exec เข้าไปใน image ดูจะเห็นว่าเราสามารถใช้งาน vim ได้ครับ อันนี้อยากอธิบายให้เข้าใจนิดนึงว่า คำสั่ง RUN ที่อธิบายมาทั้งหมดมันจะ Run ตอนสร้าง Image เท่านั้นนะครับ (คือทำตอนสั่ง docker build เท่านั้น) มันจะไม่ทำงานตอนสั่ง docker run นะครับ

ADD

จากคำสั่ง RUN เราสามารถ RUN คำสั่งอะไรก็ได้ใน Image ตอนสร้าง Image ได้แล้ว แต่คราวนี้เราอยากจะเอาไฟล์ไปไว้ใน Image ด้วย เพื่อให้มันทำงานบางอย่างเช่น อยากเอาไฟล์ index.html ใหม่ไปวางไว้ในตัว Image เพื่อให้เวลาเข้าหน้าแรกของ Web มีการแสดงผลแบบที่เราอยากให้เป็น แทนการที่ต้องสร้าง container แล้วค่อยเข้าไปแก้เป็นรายครั้งไป

สร้างไฟล์ index.html ไว้ใน path เดียวกับ Dockerfile โดยข้างในมีเนื้อหาประมาณ

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>MY SERVER</title>
</head>
<body>
<h1>HELLO WORLD TEST</h1>
<img src="https://live.staticflickr.com/7336/14098888813_1047e39f08.jpg" alt="">
</body>
</html>
1
2
3
4
5
6
FROM httpd:2

ADD index.html /usr/local/apache2/htdocs/index.html

# คำสั่ง ADD เป็นการบอกว่าจะเอาไฟล์จากในเครื่องที่ Run docker ที่ใดไปใส่ที่ path ใดใน image
# จากตัวอย่างคือจะเอาไฟล์ index.html ไปวางไว้ที่ path : /usr/local/apache2/htdocs/index.html ของ image

จากนั้นลองสั่ง build แล้ว Run ดูครับจะด้วยคำสั่งนี้แล้วลองเข้าผ่าน Browser จะได้ประมาณนี้ครับ

1
2

docker run --name first-image -p 80:80 first-image

โดยจากตัวอย่างผมเอาไฟล์ index.html ไปวางไว้ในเครื่อง image แทนที่ไฟล์ /usr/local/apache2/htdocs/index.html ดังนั้นเวลาเรา run image แล้วเข้าดูผ่าน Browser ทำให้เราเห็นหน้าแรกตามไฟล์ index.html ที่เราทำ

ตัดจบก่อนนะครับ

สำหรับตอนนี้เราได้ลองสร้าง Image ทดลองคำสั่ง RUN และ ADD ซึ่งเป็นคำสั่งที่ใช้งานบ่อยมากในการสร้าง Image ส่วนในตอนถัดไปมาลองคำสั่งที่ใช้งานยากขึ้นมาหน่อยคือคำสั่ง CMD , ENTRYPOINT ส่วนในตอนนี้ขอจบเพียงเท่านี้ละกันครับ

โปรโมท Page

ผมทำ Page บน Facebook แล้วนะครับ ใครสนใจรับการแจ้งเตือนเวลาผมอัพเดท Blog ก็ไปกดติดตามกันได้ครับ กดตามลิ้งไปได้เลย Facebook page

เพลงประกอบการเขียน Blog

เพลงประกอบ Series ญี่ปุ่นเรื่อง Galileo โดยนักแสดงนำร้องเอง ซึ่งพอมาอ่านทีหลังพึ่งรู้ว่า นักแสดงนำทั้งคู่นี่ตัว TOP ของญี่ปุ่นเลย