Để bước đầu bạn tìm hiểu cách viết 1 dockerfile thì mình nghĩ bạn nên tìm hiểu từ những thứ đơn giản để lấy cảm hứng. Và mình nghĩ tạo 1 nodejs app sử dụng docker là ý tưởng không quá tồi.

Tự tạo 1 Dockerfile dành cho nodejs cơ bản nhất

2022-02-22 643 lượt xem

Cách tạo 1 project với npx

Nếu bạn nào đã là dev nodejs rồi thì cũng từng nghe qua cụm từ express-generator với npx. Thì nếu chưa biết bạn có thể xem thêm tại : https://ebudezain.com/tao-1-app-nodejs-dau-tien-su-dung-express-application-generator-2021

Tức là bạn muốn tạo nhanh 1 project nodejs với express thì bạn dùng lệnh: 

npx express-generator

Bạn được 1 cấu trúc thư mục như sau: 

Thay vì bình thường máy bạn có nodejs sẵn thì việc bạn muốn run code trên chỉ đơn giản là chạy vài lệnh: npm i & node bin/www rồi gõ lên trình duyệt dòng lệnh : http://localhost:3000 là chạy được. 
Nhưng mình đang học docker nên không dùng cách đó mà phải định nghĩa ra 1 cái dockerfile nghen. 

Tạo Dockerfile

Bạn cần tạo 1 file Dockerfile lưu ý là không có đuôi file nha. Nội dung như sau: 

FROM node:carbon
# Create app directory
WORKDIR /usr/src/app
# Bundle app src
COPY . .
# Install app dependencies
RUN npm install
EXPOSE 3000
CMD [ "node", "bin/www" ]

Mình giải thích chi tiết như sau: 

Đầu tiên Cái dòng FROM node:carbon cái này là trong docker sẽ có các docker images được build sẵn trên DockerHub. Mình dùng cái nào thì mình ghi cái đó vào. 

Ở dòng WORKDIR /usr/src/app ta sẽ khai báo đường dẫn của code chúng ta trong image. Giả sử mình muốn sửa lại đường dẫn đến thư mục chứa code của mình thành /app thì mình sửa nguyên cái dòng đó như này: 

WORKDIR /app

Tiếp theo ta sẽ copy toàn bộ source của project vào trong docker image và download các dependencies như sau: 

# Bundle app src
COPY . .
# Install app dependencies
RUN npm install

Cái dòng COPY . . có nghĩa là copy toàn bộ source code của bạn từ trong folder vào trong docker images. sau đó chạy lệnh dưới terminal là npm install. 

Tiếp theo chúng ta làm thêm 1 thao tác hơi lạ là 

EXPOSE 3000

 Cái đó có nghĩa là mở 1 cái port 3000 của docker. Trong code bạn code là bạn dùng cái port 3000 => khi chạy docker bạn muốn truy cập vào cổng 3000 của docker thì trước hết bạn phải mở của docker ra. chứ không phải port trên máy các bạn đâu nhé!

Cuối cùng: để app chạy được thì bạn cần chạy dưới terminal là node bin/www ( mình thường không dùng express generater thì sẽ chạy node index.js đó )

CMD [ "node", "bin/www" ]

Run Dockerfile thành Docker image

Đơn giản là mở docker bằng cách bấm vào biểu tượng docker ngoài desktop rồi vào terminal bạn chạy lệnh : 

docker build -t hoc-node-docker:latest .
# trong đó -t là tag để bạn đặt tên tuỳ ý theo sau dấu ":" là version tag và 1 dấu "." cuối là đứng tại thư mục hiện hành

Chờ 1 hồi cho nó success mọi thứ thì bạn gõ lệnh kiểm tra các image có trong máy của bạn: 

docker images  

kết quả là 

 

Đến đây là sắp thành công rồi 😄 Bạn mới tạo 1 image để mô tả cho docker làm sao để chạy được code các bạn. Còn câu chuyện bạn báo với docker là "Hêy Docker! mày chạy cái dịch vụ tao vừa tạo coi :D" thì bây giừo mới làm nè

Tạo thể hiện container từ docker image

ở trên bạn đã tạo được docker image với tên hoc-node-docker nên bây giừo bạn run : 

docker run -p 5000:3000 hoc-node-docker:latest

với  -p 5000:3000 là binding cái port 3000 trong docker ra port 5000 ngoài máy của mình. Build cái image tên là hoc-node-docker với tag version là latest!  Và sau khi bạn gõ terminal như trên xong thì nó cứ đứng đó chờ ( cơ chế nodejs đứng chờ y chang như khi bạn gõ node bin/www vậy đó )

ok, kiểm tra coi bạn có những container nào đang chạy bằng cách mở 1 terminal khác và gõ: 

docker ps

Như thế này là thành công : 

sau cùng là mở trình duyệt ra gõ: http://localhost:5000 được kết quả như sau: 

Lưu ý cuối bài

đôi khi bạn sẽ không muốn đóng gói cái image của các bạn mà có các file như node_modules hay npm-debug.log thì bạn cần tạo 1 file .dockerignore (y chang gitignore )với nội dung : 

/node_modules

Đôi khi bạn không muốn 1 phiên bản node nặng thì bạn có thể chọn phiên bản : 

FROM node:10.9.0-alpine

Khi bạn không muốn chạy container nào nữa thì chạy lệnh : 

# lấy docker container id
docker ps
# Stop nó với id vừa lấy được 
docker container stop <container id>
# ví dụ: docker container stop 676650beefce
# bonus là xoá docker container : docker container rm 676650beefce 

những tag
bài viết trong chủ đề