Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Ngày càng nhiều tin tuyển dụng lập trình viên yêu cầu "biết Docker" và "hiểu CI/CD", ngay cả khi vị trí không phải DevOps. Bạn không cần là chuyên gia hạ tầng, nhưng nên giải thích được các khái niệm cơ bản và đã tự đóng gói một ứng dụng vào container.
Câu "chạy được trên máy tôi" là nỗi đau quen thuộc. Docker đóng gói ứng dụng cùng toàn bộ môi trường cần thiết (hệ điều hành tối giản, thư viện, cấu hình) thành một image, chạy giống nhau trên máy lập trình viên, máy chủ kiểm thử và máy chủ thật.
Máy ảo chạy cả một hệ điều hành đầy đủ trên phần cứng ảo, nặng và khởi động chậm. Container dùng chung nhân của hệ điều hành máy chủ nhưng cô lập tiến trình, nhẹ và khởi động trong vài giây. Đổi lại, mức cô lập của container không tuyệt đối bằng máy ảo.
Image là bản mẫu chỉ đọc, giống bản thiết kế. Container là một thể hiện đang chạy được tạo từ image. Từ một image bạn có thể chạy nhiều container.
FROM node:20-alpineWORKDIR /appCOPY package*.json ./RUN npm ci --omit=devCOPY . .EXPOSE 3000CMD ["node", "server.js"]Chú ý thứ tự: sao chép file khai báo phụ thuộc và cài đặt trước, rồi mới sao chép mã nguồn. Nhờ cơ chế cache theo lớp, khi chỉ sửa mã nguồn Docker sẽ không phải cài lại thư viện, giúp build nhanh hơn. Bạn nên có thêm file .dockerignore để bỏ qua node_modules, .git và file bí mật.
Compose cho phép khai báo nhiều dịch vụ trong một file và chạy bằng một lệnh, rất tiện cho môi trường phát triển.
services: web: build: . ports: - "3000:3000" environment: - DB_HOST=db depends_on: - db db: image: mysql:8 environment: - MYSQL_ROOT_PASSWORD=dev-only-password volumes: - dbdata:/var/lib/mysqlvolumes: dbdata:Volume giữ dữ liệu lâu dài ngoài vòng đời container. Nếu không có volume, dữ liệu cơ sở dữ liệu sẽ mất khi container bị xóa. Mật khẩu trong ví dụ chỉ để phát triển; môi trường thật phải dùng cơ chế quản lý bí mật.
docker build -t ten-image . để build image.docker run -p 8080:3000 ten-image để chạy và ánh xạ cổng.docker ps xem container đang chạy, docker logs xem log.docker compose up -d chạy toàn bộ dịch vụ nền.CI (Continuous Integration) là tự động build và chạy kiểm thử mỗi khi có code mới đẩy lên, giúp phát hiện lỗi sớm. CD có thể là Continuous Delivery (luôn sẵn sàng phát hành, việc bấm nút do con người quyết định) hoặc Continuous Deployment (tự động triển khai khi vượt qua mọi kiểm tra).
name: CIon: [push, pull_request]jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - run: npm ci - run: npm testMột pipeline điển hình gồm các bước: lấy mã, cài phụ thuộc, kiểm tra định dạng, chạy test, build, rồi triển khai lên môi trường kiểm thử hoặc thật.
Build nhiều giai đoạn giúp image cuối nhỏ gọn vì không mang theo công cụ biên dịch. Ví dụ với ứng dụng frontend:
FROM node:20-alpine AS buildWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run buildFROM nginx:alpineCOPY --from=build /app/dist /usr/share/nginx/htmlEXPOSE 80Giai đoạn đầu cài thư viện và build, giai đoạn hai chỉ chứa Nginx cùng các file tĩnh đã build. Image cuối nhẹ hơn, ít bề mặt tấn công hơn và khởi động nhanh hơn. Đây là câu trả lời đẹp khi được hỏi cách tối ưu kích thước image.
latest khiến mỗi lần build có thể ra phiên bản khác nhau.Cách ôn tốt nhất là đóng gói chính dự án của bạn bằng Docker và thêm một pipeline chạy test tự động. Chỉ vài giờ thực hành cũng đủ để bạn có câu chuyện thật để kể trong phỏng vấn.
Nếu muốn học Docker và CI/CD qua ví dụ có hướng dẫn, bạn có thể xem các khóa DevOps tại codebem.com.
Nguyễn Đình Cường
0 comment