ตอนนี้เรียกได้ว่า 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