MEAN

วิธีสร้าง Docker Image ให้กับ Express และ Node.js แบบง่ายๆ

เรื่องที่เกี่ยวข้อง - Docker, Express, MEAN, Node

ตอนนี้เรียกได้ว่า Docker น่าจะกลายเป็นพื้นฐานสำคัญที่นักพัฒนาสมควรเรียนรู้พอๆ กับ Git แล้ว และเนื่องจากเนื้อหาใน Workshop นอกสถานที่ของ MEAN Stack มีโอกาสที่ใช้ Docker ได้ พลก็ขอเอามาแชร์ไว้ที่นี่แล้วกัน

โดยในที่นี้จะเป็นการเอาโปรเจค Express และ Node.js สร้างเป็น Docker Image รันใช้งานกัน

1. สร้างคำสั่ง start ใน package.json

ขั้นแรกเราจะกำหนดคำสั่ง start ให้กับไฟล์ package.json ของเรา เพื่อที่จะได้เรียกใช้จากสคริปต์ของ​ Docker อีกที เสร็จแล้วอย่าลืมบันทึกไฟล์นะ

{
  ...
  "scripts": {
    "start": "node index.js",
    "test": "..."
  },
  ...
}

2. สร้างไฟล์ Dockerfile

ในตอนแรกสุด เราจะสร้างไฟล์ Dockerfile ขึ้นมาในโฟลเดอร์โปรเจค Express ของเรา และกำหนดสคริปต์ตามนี้

FROM node:boron

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

EXPOSE 3000

CMD ["npm","start"]

  • สังเกตว่าเราใช้ node:boron ที่จะดึง Node.js เวอร์ชั่น LTS มาใช้งานใน Docker Image ของเรา
  • สั่งสร้างโฟลเดอร์​ และกำหนดเป็น Working Directory
  • ก๊อปปี้ไฟล์ package.json ไปไว้ในโฟลเดอร์ /usr/src/app/ ก่อนที่จะสั่งติดตั้ง Node module ด้วยคำสั่ง npm install
  • ก๊อปปี้ไฟล์ที่เหลือไปไหว้ในโฟลเดอร์ดังกล่าว
  • เปิด Port 3000
  • สั่งรัน npm start เพื่อเริ่มการทำงานของ Express Web Server

เสร็จแล้วบันทึกไฟล์

3. สร้าง .dockerignore

เช่นเดียวกับการใช้ Git ที่เราสามารถกำหนดไฟล์ และโฟลเดอร์ที่ไม่ต้องการให้ใช้ในระบบ Git ได้ สำหรับ Docker ก็มี .dockerignore ที่ใช้รูปแบบเดียวกัน

โดยในที่นี้เราจะไม่ส่งโฟลเดอร์ node_modules และไฟล์ npm-debug.log เข้าไปใน Image ของ Docker ที่จะถูกสร้างขึ้น โดยกำหนดไว้ในไฟล์ .dockerignore

node_modules
npm-debug.log

4. ใช้คำสั่งสร้าง Docker Image

รันคำสั่งต่อไปนี้ในโฟลเดอร์โปรเจคของเรา

docker build -t teerasej/node-express . 

อาจจะมี log แสดงลำดับตามคำสั่งที่มีในไฟล์ Dockerfile ดังนี้

Sending build context to Docker daemon 540.7 kB
Step 1/8 : FROM node:boron
 ---> 7190e68e5c56
Step 2/8 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 45d90ecb1771
Step 3/8 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 4f6a5c1947d8
Step 4/8 : COPY package.json /usr/src/app/
 ---> Using cache
 ---> e0bbbbea5bcf
Step 5/8 : RUN npm install
 ---> Using cache
 ---> 4e52034d26b6
Step 6/8 : COPY . /usr/src/app
 ---> 98ee25a09fbe
Removing intermediate container afde1c4b4ae9
Step 7/8 : EXPOSE 3000
 ---> Running in 73b9f726fc46
 ---> 7ed29f0eea61
Removing intermediate container 73b9f726fc46
Step 8/8 : CMD npm start
 ---> Running in 7eef3db396a5
 ---> 1d1dee151f42
Removing intermediate container 7eef3db396a5
Successfully built 1d1dee151f42

จากนั้นเช็คว่าเรามี Image ที่ต้องการแล้วด้วยคำสั่ง docker images เพื่อดูว่ามีชื่อของ Image ที่เรากำหนด teerasej/express-node ในรายการหรือไม่ ถ้ามีถือว่าโอเค

5. ทดลองรัน Docker Image ใน Container

หลังจากได้ Docker Image แล้ว เราก็จะมาใช้ใน Container กัน ด้วยคำสั่ง

docker run --name experss -p 80:3000 teerasej/express-node
  • --name เป็นการกำหนดชื่อ Container ซึ่งสามารถใช้อ้างอิงในคำสั่งอื่นๆ ได้
  • -p เป็นการทำ port mapping ระหว่าง port บนเครื่อง Host กับ Port บน Docker Container มองง่ายๆ คือ host port:container port
  • -d สั่งให้รัน Docker Container เป็น Background service

ถ้ารัน Container เสร็จเรียบร้อยแล้ว ให้ลองใช้คำสั่ง docker ps เพื่อแสดงรายชื่อ Container ที่ทำงานอยู่ในขณะนั้นดู ถ้าเจอชื่อ Container ชื่อ express ก็แสดงว่ารันทำงานได้ ค่อยลองเปิดเว็บเบราเซอร์ขึ้นมาดู http://localhost

อ้างอิง

เริ่มต้นยุค AI ด้วยคอร์สฟรี และพรีเมี่ยม กับพล

หากชอบสิ่งที่พลเล่า เรื่องที่พลสอน สามารถสนับสนุนพลโดยการเข้าเรียนคอร์สออนไลน์ของพลนะคร้าบ

  • เข้าใจง่าย ใช้ได้จริง ออกแบบการสอนอย่างเข้าใจโดยโค้ชพล
  • มีคอร์สสำหรับคนใช้งานทั่วไป จนถึงเรียนรู้เพื่อใช้งานในสายอาชีพขั้นสูง
  • ทุกคอร์สมีใบประกาศณียบัตรรับรองหลังเรียนจบ

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

Allow All
Manage Consent Preferences
  • Always Active

Save