Docker cho Vibe Coder: Từ source code đến container trên Ubuntu
Mục lục
Các bài trong series Vibe Coding
- Bài 1: Vibe Coding là gì? Từ AI viết code đến triển khai ứng dụng lên VPS
- Bài 2: Vibe Coding thực chiến: Từ AI viết code đến GitHub
- Bài 3: Docker cho Vibe Coder: Từ source code đến container trên Ubuntu ← Bạn đang đọc
- Bài 4: Hướng dẫn deploy ứng dụng Vibe Coding lên VPS Ubuntu bằng Coolify (Đang cập nhật)
- Bài 5: CI/CD là gì? Hướng dẫn GitHub → Coolify → VPS tự động deploy (Đang cập nhật)
- Bài 6: Docker Production: Tối ưu Dockerfile, Docker Compose và bảo mật container (Đang cập nhật)
- Bài 7: Docker → Coolify → VPS: Hướng dẫn triển khai ứng dụng production (Đang cập nhật)
Docker cho Vibe Coder là gì?
Nếu bạn đang sử dụng ChatGPT, Claude, Gemini hoặc các công cụ AI Coding để xây dựng ứng dụng, có một vấn đề sẽ sớm xuất hiện:
Code chạy được trên máy của bạn nhưng chưa chắc chạy được trên server.
Bạn có thể yêu cầu AI tạo một ứng dụng Next.js, Node.js, Python, Laravel hoặc một API backend chỉ trong vài phút. Nhưng khi đưa source code lên VPS Ubuntu, bạn lại phải xử lý hàng loạt vấn đề:
- Server đang dùng Node.js phiên bản nào?
- PHP hoặc Python phiên bản bao nhiêu?
- Đã cài đúng package chưa?
- Có thiếu thư viện hệ thống không?
- Port nào đang được sử dụng?
- Biến môi trường cấu hình thế nào?
- Làm sao để ứng dụng chạy ổn định sau khi reboot VPS?
- Làm sao để chuyển ứng dụng sang một server khác mà không phải cài lại từ đầu?
Đây chính là lúc Docker trở nên đặc biệt hữu ích với Vibe Coder.
Thay vì chỉ đưa source code lên VPS và cố gắng tái tạo môi trường chạy ứng dụng, bạn có thể đóng gói ứng dụng cùng các dependency cần thiết thành một Docker image, sau đó chạy image đó thành container.
Quy trình lúc này trở nên rõ ràng hơn:
AI viết code → Source code → Dockerfile → Docker Image → Container → VPS Ubuntu
Và khi kết hợp Docker với GitHub, Coolify và VPS, bạn có thể xây dựng một quy trình hoàn chỉnh:
AI → GitHub → Docker → Coolify → VPS → Production
Trong bài viết này, chúng ta sẽ đi từ những khái niệm Docker cơ bản nhất đến việc tự container hóa một ứng dụng trên Ubuntu.
1. Vì sao Vibe Coder nên học Docker?
Vibe Coding giúp bạn tạo phần mềm nhanh hơn, nhưng tốc độ viết code không đồng nghĩa với tốc độ triển khai.
AI có thể tạo cho bạn:
Next.js
Node.js
React
Python
Laravel
PostgreSQL
Redisnhưng các thành phần này vẫn cần một môi trường phù hợp để chạy.
Nếu không sử dụng Docker, bạn thường phải cài trực tiếp các thành phần lên VPS:
Ubuntu
├── Node.js
├── npm
├── PostgreSQL
├── Redis
├── Nginx
└── ApplicationSau một thời gian, server rất dễ trở thành một “mớ” dependency khó kiểm soát.
Docker thay đổi cách tiếp cận:
Ubuntu VPS
│
└── Docker
│
├── Container: Web
├── Container: API
├── Container: PostgreSQL
└── Container: RedisMỗi thành phần được tách biệt thành container riêng.
Đây là một trong những lý do Docker rất phù hợp với Vibe Coder: AI có thể giúp bạn tạo Dockerfile và cấu hình Docker, còn Docker giúp biến source code đó thành một môi trường chạy có thể tái sử dụng.

2. Docker thực sự là gì?
Docker là nền tảng containerization giúp đóng gói và chạy ứng dụng trong các container.
Docker Engine hoạt động theo mô hình client-server, trong đó Docker daemon (dockerd) quản lý các object như image, container, network và volume.
Có 4 khái niệm bạn cần phân biệt:
Source Code
Đây là code mà AI hoặc bạn tạo ra:
my-app/
├── package.json
├── src/
├── public/
└── ...Dockerfile
Dockerfile là file mô tả cách Docker xây dựng image từ source code. Docker cung cấp các instruction phổ biến như FROM, RUN, WORKDIR, COPY, CMD…
Ví dụ:
FROM node:22
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]Docker Image
Dockerfile được sử dụng để build thành image.
Có thể hiểu đơn giản:
Dockerfile
↓
docker build
↓
Docker ImageImage giống như “bản đóng gói” của ứng dụng.
Container
Container là một instance đang chạy từ image:
Docker Image
↓
docker run
↓
ContainerMột image có thể tạo ra nhiều container.

3. Image và Container khác nhau như thế nào?
Đây là phần rất nhiều người mới học Docker dễ nhầm.
Hãy tưởng tượng:
Image = khuôn mẫu
Container = sản phẩm được tạo ra từ khuôn mẫu đó
Ví dụ:
node-app:1.0
│
├── container-app-01
├── container-app-02
└── container-app-03Một image có thể được dùng để chạy nhiều container khác nhau.
Vì vậy khi bạn build Docker:
docker build -t my-app .bạn đang tạo image.
Khi chạy:
docker run my-appbạn đang tạo container từ image đó.
4. Chuẩn bị Ubuntu để học Docker
Trong bài này, chúng ta sử dụng Ubuntu Server vì đây là môi trường rất phổ biến khi triển khai ứng dụng lên VPS.
Docker đã sẵn sàng, VPS là bước tiếp theo
Nếu bạn đang chạy project Vibe Coding trên Ubuntu, có thể bắt đầu với VPS giá rẻ cho side project, nâng cấp lên VPS AMD khi cần CPU mạnh hơn hoặc lựa chọn VPS vSAN khi hệ thống bắt đầu có nhiều container và workload storage.
Bạn có thể dùng Ubuntu 22.04 LTS hoặc Ubuntu 24.04 LTS. Docker hiện hỗ trợ các phiên bản Ubuntu được liệt kê trong tài liệu chính thức, bao gồm Ubuntu 22.04 LTS và 24.04 LTS.
Kiểm tra phiên bản Ubuntu:
lsb_release -aHoặc:
cat /etc/os-releaseVí dụ:
NAME="Ubuntu"
VERSION="24.04 LTS"5. Cài Docker trên Ubuntu
Docker khuyến nghị cài Docker Engine thông qua repository chính thức thay vì phụ thuộc vào package Docker không chính thức của distro.
Trước tiên cập nhật hệ thống:
sudo apt update
sudo apt upgrade -yCài các package cần thiết:
sudo apt install ca-certificates curl -yTạo thư mục keyrings:
sudo install -m 0755 -d /etc/apt/keyringsThêm Docker GPG key:
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.ascPhân quyền:
sudo chmod a+r /etc/apt/keyrings/docker.ascThêm repository Docker:
echo \
"Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc" | \
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/nullCập nhật repository:
sudo apt updateSau đó cài Docker Engine:
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin -yĐây là các package được Docker sử dụng trong hướng dẫn cài đặt chính thức hiện nay.
6. Kiểm tra Docker đã hoạt động
Kiểm tra service:
sudo systemctl status dockerNếu Docker chưa chạy:
sudo systemctl start dockerCho Docker tự khởi động cùng hệ thống:
sudo systemctl enable dockerKiểm tra phiên bản:
docker --versionSau đó chạy container đầu tiên:
sudo docker run hello-worldNếu terminal trả về thông báo từ Hello from Docker!, Docker đã được cài đặt thành công. Docker cũng sử dụng chính image hello-world trong tài liệu chính thức để xác minh installation.
7. Không muốn gõ sudo trước mỗi lệnh Docker?
Mặc định, người dùng thông thường có thể cần sudo khi chạy Docker.
Bạn có thể thêm user hiện tại vào group docker:
sudo usermod -aG docker $USERSau đó logout/login lại SSH.
Kiểm tra:
docker psNếu chạy được mà không cần:
sudo docker psthì cấu hình đã có hiệu lực.
Lưu ý: quyền truy cập Docker socket thực tế có mức quyền rất cao trên host. Vì vậy không nên tùy tiện thêm những user không đáng tin cậy vào group docker.
8. Tạo project đầu tiên cho Vibe Coder
Bây giờ hãy tạo một project Node.js đơn giản.
mkdir docker-demo
cd docker-demoKhởi tạo project:
npm init -yTạo file:
server.jsNội dung:
const http = require("http");
const PORT = 3000;
const server = http.createServer((req, res) => {
res.writeHead(200, {
"Content-Type": "text/plain",
});
res.end("Hello from Vibe Coding + Docker!");
});
server.listen(PORT, "0.0.0.0", () => {
console.log(`Server running on port ${PORT}`);
});Chạy thử trực tiếp:
node server.jsNếu thấy:
Server running on port 3000ứng dụng đang chạy.
Nhưng hiện tại nó vẫn đang chạy trực tiếp trên Ubuntu.
Bước tiếp theo là container hóa nó.
9. Dockerfile là gì?
Dockerfile là file quan trọng nhất trong quá trình container hóa ứng dụng.
Bạn có thể xem Dockerfile như một “công thức” để Docker biết:
- sử dụng image nền nào?
- tạo thư mục làm việc ở đâu?
- cài dependency gì?
- copy source code nào?
- ứng dụng sử dụng port nào?
- khi container khởi động thì chạy lệnh gì?
Docker xác định Dockerfile mặc định bằng tên Dockerfile, không có extension.
Tạo file:
nano DockerfileThêm:
FROM node:22
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]10. Giải thích Dockerfile từng dòng
Đây là phần Vibe Coder cần hiểu, bởi bạn có thể yêu cầu AI tạo Dockerfile nhưng vẫn nên biết nó đang làm gì.
FROM
FROM node:22FROM xác định base image.
Ở đây chúng ta sử dụng Node.js 22.
Bạn có thể thay đổi:
FROM node:20hoặc:
FROM node:22Việc chọn version phù hợp với project rất quan trọng.
Nếu source code được AI tạo bằng Node.js 22 nhưng VPS lại đang chạy Node.js 18 thì Docker giúp giảm sự phụ thuộc vào Node.js cài trực tiếp trên host.
WORKDIR
WORKDIR /appThiết lập thư mục làm việc bên trong container.
Các lệnh tiếp theo sẽ thực hiện trong:
/appCOPY
COPY package*.json ./Copy package.json và package-lock.json vào container.
Sau đó:
RUN npm installDocker cài dependency.
Cuối cùng:
COPY . .copy source code còn lại.
EXPOSE
EXPOSE 3000Cho biết ứng dụng sử dụng port 3000.
Điều này không đồng nghĩa với việc port 3000 của container tự động được public ra Internet.
Khi chạy container, bạn vẫn cần mapping port.
CMD
CMD ["node", "server.js"]Đây là command mặc định khi container khởi động.
Dockerfile chỉ có một CMD được áp dụng; nếu có nhiều CMD, chỉ instruction cuối cùng có hiệu lực.
11. Build Docker Image
Đây là bước biến Dockerfile thành image.
Chạy:
docker build -t vibe-demo .Trong đó:
docker buildlà lệnh build image.
-t vibe-demođặt tên image.
.chỉ định build context là thư mục hiện tại.
Sau khi build xong:
docker imagesBạn sẽ thấy:
REPOSITORY TAG IMAGE ID
vibe-demo latest xxxxxxxxxQuy trình lúc này là:
Source Code
│
▼
Dockerfile
│
▼
docker build
│
▼
Docker Image12. Chạy container đầu tiên
Bây giờ chạy image:
docker run -d \
--name vibe-demo \
-p 3000:3000 \
vibe-demoGiải thích:
-dchạy container ở background.
--name vibe-demođặt tên container.
-p 3000:3000mapping:
HOST:CONTAINERtức:
Ubuntu port 3000
↓
Container port 3000Kiểm tra:
docker psBạn sẽ thấy:
CONTAINER ID IMAGE PORTS
xxxxxx vibe-demo 0.0.0.0:3000->3000/tcp13. Kiểm tra ứng dụng đang chạy
Từ chính VPS:
curl http://localhost:3000Kết quả:
Hello from Vibe Coding + Docker!Nếu VPS có public IP, bạn có thể truy cập:
http://IP-VPS:3000Trong môi trường production, bạn thường không nên để người dùng truy cập trực tiếp bằng port 3000.
Thay vào đó có thể sử dụng:
Internet
↓
Domain
↓
Reverse Proxy
↓
Docker ContainerĐây cũng chính là mô hình chúng ta sẽ tiếp tục triển khai ở các bài tiếp theo với Coolify và VPS.
14. Xem log của Docker Container
Một trong những lệnh bạn sẽ sử dụng rất thường xuyên:
docker logs vibe-demoTheo dõi realtime:
docker logs -f vibe-demoNếu ứng dụng bị lỗi, đây gần như là nơi đầu tiên bạn nên kiểm tra.
Ví dụ:
Error: Cannot find module...hoặc:
EADDRINUSEBạn có thể phát hiện lỗi ngay mà không cần SSH vào bên trong container.
15. Một số lệnh Docker Vibe Coder cần nhớ
Xem container đang chạy
docker psXem tất cả container
docker ps -aDừng container
docker stop vibe-demoKhởi động lại
docker start vibe-demoRestart
docker restart vibe-demoXóa container
docker rm vibe-demoXóa image
docker rmi vibe-demoXem log
docker logs vibe-demoĐi vào container
docker exec -it vibe-demo shĐây là nhóm command bạn nên làm quen trước khi chuyển sang Docker Compose hoặc Coolify.
16. Dockerfile nên có .dockerignore
Một lỗi phổ biến của người mới học Docker là copy toàn bộ project vào image.
Ví dụ project Node.js có:
node_modules/
.git/
.envBạn không nên tùy tiện đưa tất cả vào Docker image.
Tạo:
.dockerignoreVí dụ:
node_modules
npm-debug.log
.git
.gitignore
.env
Dockerfile
.dockerignore
README.mdĐiều này giúp build context nhỏ hơn và tránh đưa những file không cần thiết vào image.
Đặc biệt:
Không nên copy file
.envchứa secret vào Docker image.
Password database, API key, token hoặc secret nên được quản lý bằng cơ chế environment/secrets phù hợp với môi trường triển khai.
17. Docker cho Vibe Coder: AI nên làm gì?
Đây là điểm Docker trở nên rất thú vị khi kết hợp với Vibe Coding.
Bạn không nhất thiết phải tự viết toàn bộ Dockerfile từ đầu.
Bạn có thể đưa cho AI:
Đây là project Next.js của tôi.
Hãy phân tích package.json và cấu trúc project.
Tạo Dockerfile production tối ưu,
sử dụng multi-stage build,
không chạy ứng dụng bằng root,
và tối ưu Docker layer cache.AI có thể tạo Dockerfile.
Nhưng đừng copy-paste rồi deploy ngay.
Hãy yêu cầu AI giải thích:
Giải thích từng dòng Dockerfile này.
Có dependency nào không cần thiết không?
Có vấn đề security nào không?
Có thể tối ưu image size không?
Có nên sử dụng multi-stage build không?Đây mới là cách sử dụng AI hiệu quả.
AI viết Dockerfile → bạn kiểm tra Dockerfile → Docker build → test container → deploy.
Không phải:
AI viết → copy → production.
18. Docker Image nên được tối ưu như thế nào?
Một Dockerfile chạy được chưa chắc là Dockerfile tốt.
Ví dụ Dockerfile:
FROM node:22
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]có thể chạy.
Nhưng image có thể chứa nhiều thứ không cần thiết.
Trong production, bạn có thể sử dụng:
- image base nhỏ hơn.
.dockerignore.npm cithay vìnpm installkhi project có lockfile.- multi-stage build.
- chỉ copy những file cần thiết.
- non-root user.
- cache layer hợp lý.
Docker cũng hỗ trợ multi-stage builds để tách quá trình build khỏi runtime, giúp tạo image production gọn hơn.
19. Multi-stage Docker build là gì?
Ví dụ với ứng dụng Node.js:
FROM node:22 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-slim
WORKDIR /app
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["npm", "start"]Ý tưởng:
Stage 1
Source Code
↓
Install
↓
Build
Stage 2
Runtime
↓
Chỉ lấy những thứ cần thiếtDockerfile nhiều stage đặc biệt hữu ích với các ứng dụng frontend/backend cần bước build trước khi chạy production.
20. Docker có làm VPS nhanh hơn không?
Đây là một hiểu nhầm phổ biến.
Docker không tự biến một VPS yếu thành VPS mạnh.
Docker chủ yếu giúp:
- đóng gói ứng dụng.
- cô lập môi trường.
- dễ triển khai.
- dễ di chuyển.
- dễ rollback.
- chuẩn hóa môi trường.
- hỗ trợ CI/CD.
Nếu bạn chạy nhiều container:
Next.js
PostgreSQL
Redis
API
Worker
Coolifythì tất cả vẫn tiêu thụ: CPU, RAM, SSD, I/O, network của VPS.
Vì vậy, khi bắt đầu đưa Docker lên production, việc chọn VPS phù hợp quan trọng không kém việc tối ưu Dockerfile.
Với một project Vibe Coding nhỏ, bạn có thể bắt đầu bằng cấu hình VPS giá rẻ để thử nghiệm, staging hoặc chạy side project. Khi ứng dụng có nhiều container, database hoặc workload build lớn hơn, nên cân nhắc nền tảng có storage và CPU tốt hơn.
Chẳng hạn, hệ sinh thái hạ tầng của EZ TECH hiện có các lựa chọn từ VPS giá rẻ cho website và ứng dụng nhỏ đến VPS vSAN ESA và VPS AMD EPYC cho những workload cần nhiều tài nguyên hơn.
Điểm quan trọng không phải là chọn VPS đắt nhất, mà là chọn đúng cấu hình theo workload của container.
21. Vibe Coder nên chọn VPS như thế nào để chạy Docker?
Có thể chia khá đơn giản:
| Nhu cầu | VPS phù hợp |
|---|---|
| Học Docker | VPS giá rẻ |
| Side project | VPS giá rẻ |
| Website nhỏ | VPS giá rẻ |
| Next.js + API | VPS tầm trung |
| Next.js + PostgreSQL + Redis | VPS nhiều RAM hơn |
| Nhiều container | VPS CPU/RAM cao hơn |
| Build Docker thường xuyên | VPS AMD |
| Workload CPU nhiều | VPS AMD |
| Production cần storage/IO ổn định | VPS vSAN |
| Hệ thống cần mở rộng | VPS vSAN / cấu hình cao |
Với Vibe Coder, một chiến lược khá hợp lý là:
Bắt đầu nhỏ → đo tài nguyên thực tế → nâng cấp khi cần.
Không cần thuê một server quá lớn ngay từ ngày đầu.
22. Khi nào nên chọn VPS giá rẻ?
Nếu bạn mới học Docker và chỉ muốn:
GitHub
↓
Docker
↓
Container
↓
Testthì VPS giá rẻ có thể đã đủ.
Ví dụ một project:
Next.js
+
Node.jskhông có traffic lớn sẽ không nhất thiết cần một server mạnh.
Đây cũng là cách giúp Vibe Coder tiết kiệm chi phí trong giai đoạn prototype.
Thay vì:
“Tôi cần server mạnh để chạy Docker.”
hãy đặt câu hỏi:
“Container của tôi thực sự cần bao nhiêu CPU, RAM và storage?”
Đó là cách tiếp cận hạ tầng thực tế hơn.
23. Khi nào VPS AMD có lợi thế?
Khi project bắt đầu có nhiều tác vụ CPU hơn, lựa chọn CPU trở nên đáng quan tâm.
Ví dụ:
Docker build
Next.js build
TypeScript compile
Image processing
FFmpeg
Backend workers
Multiple containersCác workload này có thể tạo tải CPU đáng kể.
Khi đó, một VPS AMD có CPU mạnh hơn có thể giúp giảm thời gian build và xử lý.
EZ TECH hiện cung cấp Cloud VPS AMD EPYC bên cạnh các dòng Cloud VPS khác.
Với Vibe Coder thường xuyên:
docker buildhoặc triển khai nhiều service cùng lúc, việc lựa chọn CPU tốt có thể mang lại trải nghiệm phát triển dễ chịu hơn.
24. Khi nào nên quan tâm VPS vSAN?
Nếu Docker chỉ chạy một container thì storage có thể chưa phải vấn đề lớn.
Nhưng khi hệ thống bắt đầu có:
Next.js
API
PostgreSQL
Redis
Docker volumes
Logs
Uploads
Backupstorage trở nên quan trọng hơn.
Đặc biệt với database và các ứng dụng có nhiều thao tác đọc/ghi, hiệu năng lưu trữ và độ ổn định của hệ thống storage có thể ảnh hưởng trực tiếp đến trải nghiệm ứng dụng.
EZ TECH định vị VPS vSAN ESA như một lựa chọn hạ tầng hướng đến hiệu suất, khả năng mở rộng và độ ổn định cao hơn cho các hệ thống cần nhiều tài nguyên.
Vì vậy, có thể hình dung:
Học Docker
↓
VPS giá rẻ
Side project
↓
VPS cấu hình vừa phải
Production nhiều container
↓
VPS AMD / VPS vSAN
Workload lớn
↓
Hạ tầng chuyên dụngĐây là cách tiếp cận hợp lý hơn so với việc mặc định mọi project đều phải sử dụng server cao cấp.
25. Docker và VPS: hai thứ giải quyết hai bài toán khác nhau
Điều quan trọng cần nhớ:
Docker không thay thế VPS.
Docker giải quyết bài toán:
“Ứng dụng của tôi chạy trong môi trường nào?”
VPS giải quyết bài toán:
“Ứng dụng của tôi chạy trên hạ tầng nào?”
Có thể hình dung:
INTERNET
│
▼
┌─────────────┐
│ VPS │
│ Ubuntu │
└──────┬──────┘
│
Docker
│
┌────────────┼────────────┐
▼ ▼ ▼
Next.js API PostgreSQL
Container Container Container
Docker giúp chuẩn hóa application layer. VPS cung cấp compute, RAM, storage và network layer.
Kết hợp hai thứ lại, bạn có một nền tảng rất phù hợp để triển khai các project Vibe Coding.
26. Docker Compose: bước tiếp theo sau Docker cơ bản
Một ứng dụng thực tế hiếm khi chỉ có một container.
Ví dụ:
Next.js
+
API
+
PostgreSQL
+
RedisNếu chạy từng container bằng docker run, command sẽ nhanh chóng trở nên dài và khó quản lý.
Đó là lúc Docker Compose xuất hiện.
Ví dụ:
services:
app:
build: .
ports:
- "3000:3000"
redis:
image: redis:7
postgres:
image: postgres:17
environment:
POSTGRES_PASSWORD: exampleSau đó:
docker compose up -dDocker Compose sẽ giúp bạn quản lý nhiều container như một application stack.
Đây là bước cực kỳ quan trọng đối với Vibe Coder vì các ứng dụng do AI tạo ra ngày càng thường xuyên sử dụng nhiều service cùng lúc.
27. Docker → GitHub → VPS
Đến đây, chúng ta đã có:
Source Code
↓
Dockerfile
↓
Docker Image
↓
ContainerNhưng vẫn còn một vấn đề:
Làm sao deploy mỗi khi source code thay đổi?
Đây là lúc GitHub và CI/CD xuất hiện.
Quy trình hoàn chỉnh có thể là:
AI Coding
↓
Source Code
↓
GitHub
↓
Docker Build
↓
Docker Image
↓
VPS
↓
ContainerNếu kết hợp thêm Coolify:
AI
↓
GitHub
↓
Coolify
↓
Docker
↓
VPS Ubuntu
↓
ProductionVibe Coder lúc này không còn chỉ là người “nhờ AI viết code”.
Bạn đang xây dựng một quy trình phát triển phần mềm hoàn chỉnh.
28. Một lưu ý quan trọng: Docker không phải máy ảo
Docker container không giống một VPS nhỏ bên trong VPS.
Ví dụ:
VPS Ubuntu
│
└── Docker ContainerContainer chia sẻ kernel của host thay vì chạy một hệ điều hành guest hoàn chỉnh như virtual machine.
Vì vậy container thường nhẹ và khởi động nhanh hơn VM trong nhiều trường hợp.
Nhưng container không phải một lớp bảo mật tuyệt đối.
Bạn vẫn phải quan tâm:
- image nào đang sử dụng.
- quyền container.
- secret.
- exposed ports.
- network.
- volume.
- update image.
- firewall.
- reverse proxy.
- backup.
29. Những lỗi Vibe Coder thường gặp khi dùng Docker
Lỗi 1: Container chạy nhưng không truy cập được
Kiểm tra:
docker psSau đó kiểm tra port:
docker port vibe-demoVà log:
docker logs vibe-demoLỗi 2: Ứng dụng chỉ listen localhost
Nếu Node.js chạy:
server.listen(3000, "127.0.0.1");container có thể không nhận request từ bên ngoài như bạn mong muốn.
Trong container, ứng dụng thường cần listen trên:
0.0.0.0Ví dụ:
server.listen(3000, "0.0.0.0");Lỗi 3: Container bị crash
Kiểm tra:
docker ps -aSau đó:
docker logs <container>Lỗi 4: Build image quá lớn
Kiểm tra:
docker imagesVà:
docker system dfNhững nguyên nhân phổ biến:
node_modulesbị copy vào image;- source code không cần thiết;
- sử dụng base image quá lớn;
- Dockerfile chưa dùng multi-stage build;
- nhiều layer dư thừa.
Lỗi 5: Docker chiếm quá nhiều dung lượng VPS
Docker có thể tích lũy:
Images
Containers
Volumes
Build cache
LogsTheo thời gian, VPS có thể hết disk nếu không quản lý.
Kiểm tra:
docker system dfSau đó mới cân nhắc cleanup những resource không còn sử dụng.
Không nên chạy các lệnh prune một cách máy móc trên production, đặc biệt khi chưa hiểu volume/image nào đang được sử dụng.
30. Checklist Docker cho Vibe Coder
Trước khi đưa một project AI-generated lên VPS, hãy kiểm tra:
- Source code chạy ổn định.
- Có
Dockerfile. - Có
.dockerignore. - Base image sử dụng version phù hợp.
- Dependency được cài trong image.
- Không copy
.envvào image. - Port application được xác định rõ.
- Container chạy được bằng
docker run. - Có thể xem log bằng
docker logs. - Application listen trên
0.0.0.0. - Image không chứa file thừa.
- Container không chạy quyền root nếu không cần thiết.
- Database sử dụng volume phù hợp.
- VPS có đủ CPU/RAM/storage.
- Có phương án backup.
- Có reverse proxy/domain khi đưa production.
- Có quy trình cập nhật image khi source code thay đổi.
31. Từ Docker container đến production
Nếu bạn đã làm đến đây, hãy nhìn lại toàn bộ quá trình:
VIBE CODING
AI
│
▼
Source Code
│
▼
GitHub
│
▼
Dockerfile
│
▼
Docker Image
│
▼
Container
│
▼
Ubuntu VPS
│
▼
Production
Đây chính là nền tảng mà một Vibe Coder cần hiểu.
Bạn không cần trở thành DevOps Engineer mới có thể triển khai ứng dụng.
Nhưng bạn cần hiểu đủ để biết:
- code đang chạy ở đâu?
- môi trường chạy như thế nào?
- Docker đang làm gì?
- container đang expose port nào?
- database lưu dữ liệu ở đâu?
- image được build như thế nào?
- ứng dụng được cập nhật ra sao?
Khi đã hiểu những điều này, AI sẽ trở thành công cụ tăng tốc thay vì một “chiếc hộp đen”.
32. Docker cho Vibe Coder: học đến đâu là đủ?
Bạn không cần học toàn bộ Docker ngay lập tức.
Hãy đi theo thứ tự:
Level 1 – Docker cơ bản
Hiểu:
Image
Container
Dockerfile
Volume
NetworkLevel 2 – Docker thực chiến
Biết:
docker build
docker run
docker ps
docker logs
docker exec
docker stop
docker rmLevel 3 – Docker Compose
Quản lý:
App
Database
Redis
WorkerLevel 4 – Production
Hiểu:
Docker
+
Reverse Proxy
+
HTTPS
+
Domain
+
Volume
+
BackupLevel 5 – CI/CD
Hoàn thiện:
GitHub
↓
Coolify
↓
Docker
↓
VPSĐây mới là đích đến thực sự của Vibe Coding.
33. Kết luận
Docker là một trong những kỹ năng đáng học nhất đối với Vibe Coder, không phải vì Docker giúp bạn viết code nhanh hơn, mà vì Docker giúp biến:
“AI đã viết xong code”
thành:
“Ứng dụng có thể được đóng gói, chạy và triển khai một cách nhất quán.”
Với quy trình:
AI
↓
Source Code
↓
Dockerfile
↓
Docker Image
↓
Container
↓
Ubuntu VPSbạn đã có nền móng để bước sang giai đoạn triển khai production.
Khi project còn nhỏ, VPS giá rẻ có thể là lựa chọn hợp lý để học Docker, chạy prototype hoặc side project. Khi workload tăng lên, bạn có thể cân nhắc VPS AMD cho các tác vụ CPU-intensive hoặc VPS vSAN cho những hệ thống cần quan tâm nhiều hơn đến hiệu năng và khả năng mở rộng storage. EZ TECH hiện cung cấp các nhóm hạ tầng này để có thể nâng cấp theo nhu cầu thay vì phải thay đổi toàn bộ cách triển khai ứng dụng.
Và quan trọng nhất: Docker chỉ là một mắt xích.
Bước tiếp theo là đưa Docker vào quy trình:
GitHub → Coolify → VPS → Production.
Đó cũng là cách Vibe Coder có thể biến một project được AI hỗ trợ xây dựng thành một ứng dụng thực sự chạy trên Internet.
Các bài trong series Vibe Coding
- Bài 1: Vibe Coding là gì? Từ AI viết code đến triển khai ứng dụng lên VPS
- Bài 2: Vibe Coding thực chiến: Từ AI viết code đến GitHub
- Bài 3: Docker cho Vibe Coder: Từ source code đến container trên Ubuntu ← Bạn đang đọc
- Bài 4: Hướng dẫn deploy ứng dụng Vibe Coding lên VPS Ubuntu bằng Coolify (Đang cập nhật)
- Bài 5: CI/CD là gì? Hướng dẫn GitHub → Coolify → VPS tự động deploy (Đang cập nhật)
- Bài 6: Docker Production: Tối ưu Dockerfile, Docker Compose và bảo mật container (Đang cập nhật)
- Bài 7: Docker → Coolify → VPS: Hướng dẫn triển khai ứng dụng production (Đang cập nhật)

