Docker Image และการ Dockerize

Peeradis Sanguantrakul
Arcadia Software Development
2 min readDec 17, 2018

อะไรคือ Docker Image ในการที่เราจะ Deploy Application ลงบน Docker นั้น เราต้องสร้างสื่งที่เรียกว่า Image เพื่อที่จะเป็นแม่แบบในการสร้าง Docker Container (Application จริง ๆ ที่รันบน Docker Engine) หลัก ๆ ก็เหมือนแท่นพิมพ์ที่จะพิมพ์ Application หลาย ๆ ตัวออกมา ซึ่งอาจจะเป็น Application เดียวกันก็ได้

ซึ่งจะได้ Docker Images มาอย่างไรละ อันนี้ก็จะมาพูดถึงกระบวนการ Dockerize มันก็คือการสร้าง DockerFile เพื่อบอก Docker ว่า Image นี้จะใช้ Library หรือ Dependency อะไรบ้างในการรัน เมื่อสร้าง Container ขึ้น ซึ่งกระบวนการ Dockerize นี้ขึ้นอยู่กับว่าเขียน Application โดยใช้ ภาษาอะไร อันนี้ผมจะสาธิตจากฝั่ง .net Core นะครับผม

รูปแสดงโครงสร้าง Docker Images

เนื่องจากผมพัฒนา .net core API ก็เปิด Visual Studio ขึ้นมาครับ สร้างโปรเจ็ค เป็น .net Core

หลังจากนั้นให้คลิกขวาที่โปรเจ็ค Add -> Docker Support

แล้วก็เลือกเป็น Linux นะขรั่บ

ก็จะได้หน้าตา Docker File ประมาณนี้ครับ

อธิบายกันอีกซักหน่อย

FROM คือ Base Image ที่เราจะนำมาใช้ ซึ่งมีทั้ง Lib ที่ Application ของเราต้องใช้ ซึ่งพิ้นฐานสุด ๆ ก็คือ Linux Lib แล้ว Microsoft ก็เอามาใส่ Lib ของตัวเองให้เราใช้งานได้

WORKDIR เซ็ตว่า คำสั่งกำลังทำงานอยู่ที่ Directory ไหน

EXPOSE คือการเปิด Port ว่า Application นี้ใช้ Port อะไร

RUN รันคำสั่ง Shell

COPY ….เอ่อ ก็ตรงตัวเนอะ

ซึ่งเราสามารถเขียนเองก็ได้ ขึ้นอยู่กับภาษาที่เขียน ก็จะใช้ BaseImage แตกต่างกันไป แต่ .netcore ดีหน่อนที่ Microsoft เค้าทำให้แล้ว สบายเบย

ข้อควรระวัง ถ้า Application เรามี Nuget Local อื่น ๆ ต้อง Copy ไปไว้ใน Container ก่อนรันคำสั่ง dotnet Restore ด้วย ไม่งั้นมันจะหา Nuget ไม่เจอนะจ้ะ ทำไฟล์ Nuget.config แล้วระบุเข้าไปในไฟล์ว่า Nuget Server อยู่ไหน แต่เด๋วไว้บอกละเอียดในบทอื่นละกันนะครับ

ลองรันกันกอ่นดีกว่า คลิกขวาที่โปรเจ็คก่อน เลือก Set as Startup แล้วรันเทสก่อนว่า Application เราทำงานปกติรึป่าว

ก็ดูทำงานถูกต้องเนอะ คราวนี้ คลิกขวาที่Docker-compose -> Set as Startup ซิ

จากนั้นเปลี่ยน Mode Debug เป็น Release

กดรัน รอให้เสร็จ แล้ว Stoppu

จากนั้น เปิด Powershell แล้วพิมพ์ docker images

ก็จะเห็นว่าเราได้ Image ของเราเพื่อเตรียมสร้าง Container เรียบร้อยแล้วครับ เราก็เอา Image นี้ไป Docker hub ในบทถัดไปได้เลย

--

--