light-background

Docker cho Vibe Coder: Từ source code đến container trên Ubuntu

Mục lục
Thái Duy Khang

Thái Duy Khang

Đăng ngày: 20/08/2026
Thumbnail Docker cho Vibe Coder

Các bài trong series Vibe Coding


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:

Bash
Next.js
Node.js
React
Python
Laravel
PostgreSQL
Redis

như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:

Bash
Ubuntu
 ├── Node.js
 ├── npm
 ├── PostgreSQL
 ├── Redis
 ├── Nginx
 └── Application

Sau 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:

Bash
Ubuntu VPS
   
   └── Docker
        
        ├── Container: Web
        ├── Container: API
        ├── Container: PostgreSQL
        └── Container: Redis

Mỗ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:

Bash
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ụ:

Bash
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:

Bash
Dockerfile
     
 docker build
     
Docker Image

Image giống như “bản đóng gói” của ứng dụng.

Container

Container là một instance đang chạy từ image:

Bash
Docker Image
     
docker run
     
Container

Mộ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ụ:

Bash
node-app:1.0
     
     ├── container-app-01
     ├── container-app-02
     └── container-app-03

Một image có thể được dùng để chạy nhiều container khác nhau.

Vì vậy khi bạn build Docker:

Bash
docker build -t my-app .

bạn đang tạo image.

Khi chạy:

Bash
docker run my-app

bạ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:

Bash
lsb_release -a

Hoặc:

Bash
cat /etc/os-release

Ví dụ:

Bash
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:

Bash
sudo apt update
sudo apt upgrade -y

Cài các package cần thiết:

Bash
sudo apt install ca-certificates curl -y

Tạo thư mục keyrings:

Bash
sudo install -m 0755 -d /etc/apt/keyrings

Thêm Docker GPG key:

Bash
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc

Phân quyền:

Bash
sudo chmod a+r /etc/apt/keyrings/docker.asc

Thêm repository Docker:

Bash
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/null

Cập nhật repository:

Bash
sudo apt update

Sau đó cài Docker Engine:

Bash
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:

Bash
sudo systemctl status docker

Nếu Docker chưa chạy:

Bash
sudo systemctl start docker

Cho Docker tự khởi động cùng hệ thống:

Bash
sudo systemctl enable docker

Kiểm tra phiên bản:

Bash
docker --version

Sau đó chạy container đầu tiên:

Bash
sudo docker run hello-world

Nế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:

Bash
sudo usermod -aG docker $USER

Sau đó logout/login lại SSH.

Kiểm tra:

Bash
docker ps

Nếu chạy được mà không cần:

Bash
sudo docker ps

thì 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.

Bash
mkdir docker-demo
cd docker-demo

Khởi tạo project:

Bash
npm init -y

Tạo file:

Bash
server.js

Nội dung:

Bash
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:

Bash
node server.js

Nếu thấy:

Bash
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:

Bash
nano Dockerfile

Thêm:

Bash
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

Bash
FROM node:22

FROM xác định base image.

Ở đây chúng ta sử dụng Node.js 22.

Bạn có thể thay đổi:

Bash
FROM node:20

hoặc:

Bash
FROM node:22

Việ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

Bash
WORKDIR /app

Thiế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:

Bash
/app

COPY

Bash
COPY package*.json ./

Copy package.jsonpackage-lock.json vào container.

Sau đó:

Bash
RUN npm install

Docker cài dependency.

Cuối cùng:

Bash
COPY . .

copy source code còn lại.


EXPOSE

Bash
EXPOSE 3000

Cho 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

Bash
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:

Bash
docker build -t vibe-demo .

Trong đó:

Bash
docker build

là lệnh build image.

Bash
-t vibe-demo

đặt tên image.

Bash
.

chỉ định build context là thư mục hiện tại.

Sau khi build xong:

Bash
docker images

Bạn sẽ thấy:

Bash
REPOSITORY    TAG       IMAGE ID
vibe-demo     latest    xxxxxxxxx

Quy trình lúc này là:

Bash
Source Code
     
     
Dockerfile
     
     
docker build
     
     
Docker Image

12. Chạy container đầu tiên

Bây giờ chạy image:

Bash
docker run -d \
  --name vibe-demo \
  -p 3000:3000 \
  vibe-demo

Giải thích:

Bash
-d

chạy container ở background.

Bash
--name vibe-demo

đặt tên container.

Bash
-p 3000:3000

mapping:

Bash
HOST:CONTAINER

tức:

Bash
Ubuntu port 3000
        
Container port 3000

Kiểm tra:

Bash
docker ps

Bạn sẽ thấy:

Bash
CONTAINER ID   IMAGE       PORTS
xxxxxx         vibe-demo   0.0.0.0:3000->3000/tcp

13. Kiểm tra ứng dụng đang chạy

Từ chính VPS:

Bash
curl http://localhost:3000

Kết quả:

Bash
Hello from Vibe Coding + Docker!

Nếu VPS có public IP, bạn có thể truy cập:

Bash
http://IP-VPS:3000

Trong 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:

Bash
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:

Bash
docker logs vibe-demo

Theo dõi realtime:

Bash
docker logs -f vibe-demo

Nế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ụ:

Bash
Error: Cannot find module...

hoặc:

Bash
EADDRINUSE

Bạ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

Bash
docker ps

Xem tất cả container

Bash
docker ps -a

Dừng container

Bash
docker stop vibe-demo

Khởi động lại

Bash
docker start vibe-demo

Restart

Bash
docker restart vibe-demo

Xóa container

Bash
docker rm vibe-demo

Xóa image

Bash
docker rmi vibe-demo

Xem log

Bash
docker logs vibe-demo

Đi vào container

Bash
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ó:

Bash
node_modules/
.git/
.env

Bạn không nên tùy tiện đưa tất cả vào Docker image.

Tạo:

Bash
.dockerignore

Ví dụ:

Bash
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 .env chứ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:

Bash
Đây  project Next.js của tôi.

Hãy phân tích package.json  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,
 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:

Bash
Giải thích từng dòng Dockerfile này.
 dependency nào không cần thiết không?
 vấn đề security nào không?
 thể tối ưu image size không?
 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:

Bash
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 ci thay vì npm install khi 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:

Bash
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:

Bash
Stage 1
Source Code
   
Install
   
Build


Stage 2
Runtime
   
Chỉ lấy những thứ cần thiết

Dockerfile 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:

Bash
Next.js
PostgreSQL
Redis
API
Worker
Coolify

thì 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 ESAVPS 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ầuVPS phù hợp
Học DockerVPS giá rẻ
Side projectVPS giá rẻ
Website nhỏVPS giá rẻ
Next.js + APIVPS tầm trung
Next.js + PostgreSQL + RedisVPS nhiều RAM hơn
Nhiều containerVPS CPU/RAM cao hơn
Build Docker thường xuyênVPS AMD
Workload CPU nhiềuVPS AMD
Production cần storage/IO ổn địnhVPS vSAN
Hệ thống cần mở rộngVPS 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:

Bash
GitHub
   
Docker
   
Container
   
Test

thì VPS giá rẻ có thể đã đủ.

Ví dụ một project:

Bash
Next.js
+
Node.js

khô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ụ:

Bash
Docker build
Next.js build
TypeScript compile
Image processing
FFmpeg
Backend workers
Multiple containers

Cá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:

Bash
docker build

hoặ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ó:

Bash
Next.js
API
PostgreSQL
Redis
Docker volumes
Logs
Uploads
Backup

storage 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:

Bash
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ụ:

Bash
Next.js
   +
API
   +
PostgreSQL
   +
Redis

Nế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ụ:

Bash
services:

  app:
    build: .
    ports:
      - "3000:3000"

  redis:
    image: redis:7

  postgres:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: example

Sau đó:

Bash
docker compose up -d

Docker 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ó:

Bash
Source Code
     
Dockerfile
     
Docker Image
     
Container

Như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à:

Bash
AI Coding
    
Source Code
    
GitHub
    
Docker Build
    
Docker Image
    
VPS
    
Container

Nếu kết hợp thêm Coolify:

Bash
AI
 
GitHub
 
Coolify
 
Docker
 
VPS Ubuntu
 
Production

Vibe 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ụ:

Bash
VPS Ubuntu
   
   └── Docker Container

Container 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:

Bash
docker ps

Sau đó kiểm tra port:

Bash
docker port vibe-demo

Và log:

Bash
docker logs vibe-demo

Lỗi 2: Ứng dụng chỉ listen localhost

Nếu Node.js chạy:

Bash
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:

Bash
0.0.0.0

Ví dụ:

Bash
server.listen(3000, "0.0.0.0");

Lỗi 3: Container bị crash

Kiểm tra:

Bash
docker ps -a

Sau đó:

Bash
docker logs <container>

Lỗi 4: Build image quá lớn

Kiểm tra:

Bash
docker images

Và:

Bash
docker system df

Những nguyên nhân phổ biến:

  • node_modules bị 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:

Bash
Images
Containers
Volumes
Build cache
Logs

Theo thời gian, VPS có thể hết disk nếu không quản lý.

Kiểm tra:

Bash
docker system df

Sau đó 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.
  • Dockerfile.
  • .dockerignore.
  • Base image sử dụng version phù hợp.
  • Dependency được cài trong image.
  • Không copy .env và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:

Bash
Image
Container
Dockerfile
Volume
Network

Level 2 – Docker thực chiến

Biết:

Bash
docker build
docker run
docker ps
docker logs
docker exec
docker stop
docker rm

Level 3 – Docker Compose

Quản lý:

Bash
App
Database
Redis
Worker

Level 4 – Production

Hiểu:

Bash
Docker
+
Reverse Proxy
+
HTTPS
+
Domain
+
Volume
+
Backup

Level 5 – CI/CD

Hoàn thiện:

Bash
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:

Bash
AI
 
Source Code
 
Dockerfile
 
Docker Image
 
Container
 
Ubuntu VPS

bạ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

Đánh giá bài viết này

Tác giả

Thái Duy Khang
Thái Duy Khang Thiết kế & lập trình tại EZ TECH
Tôi là Thái Duy Khang Một Creative Designer, UX/UI Designer và Web Developer chuyên xây dựng những sản phẩm số giúp doanh nghiệp phát triển thương hiệu, nâng cao trải nghiệm khách hàng và tối ưu hiệu quả kinh doanh. Trong hơn 10 năm, tôi đã làm việc ở giao điểm giữa thiết kế, trải nghiệm người dùng và công nghệ. Sự kết hợp này cho phép tôi nhìn nhận một dự án không chỉ dưới góc độ thẩm mỹ, mà còn từ chiến lược thương hiệu, hành vi người dùng và tính khả thi khi triển khai.
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất