Chapter 1 — Startup: Từ Cloud VM đến lần Deploy đầu tiên
1. Mục tiêu
Thực hiện deployment một Todo App đơn giản lên AWS EC2 bằng:
GitHub
↓
AWS EC2
↓
Docker
↓
Docker Compose
↓
Nginx
↓
Internet
Application sử dụng:
- Node.js
- MySQL
- Docker
- Docker Compose
- Nginx
- AWS EC2
2. Architecture
Internet
│
│ HTTP :80
▼
┌───────────────┐
│ AWS EC2 │
│ Ubuntu │
│ │
│ Nginx │
│ │ │
│ ▼ │
│ Node.js App │
│ :3000 │
│ │ │
│ ▼ │
│ MySQL │
│ :3306 │
│ │
│ Docker Compose│
└───────────────┘
3. Chuẩn bị
Cần có:
□ AWS Account
□ GitHub Account
□ macOS
□ Git
□ SSH
□ Docker
4. Chạy Todo App ở Local
Clone repository:
git clone https://github.com/dockersamples/todo-list-app.git
cd todo-list-app
Kiểm tra:
ls
Chạy:
docker compose up -d --build
Kiểm tra:
docker compose ps
Mở:
http://localhost:3000
Test:
curl http://localhost:3000
5. Tạo EC2
AWS Console:
EC2
→ Instances
→ Launch Instance
Chọn:
Name:
chapter1-ec2
AMI:
Ubuntu Server 24.04 LTS
Instance type:
t3.micro
Key pair:
chapter1-key
Network:
VPC:
Default VPC
Auto-assign Public IP:
Enable
6. Security Group
Inbound rules:
✅ Allow SSH traffic from
✅ Allow HTTP traffic from the internet
Không mở:
3000
3306
7. SSH vào EC2
Download:
chapter1-key.pem
Trên Mac:
chmod 400 ./chapter1-key.pem
SSH:
ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
8. Update Ubuntu
sudo apt update
sudo apt upgrade -y
9. Cài Git
sudo apt install git -y
Kiểm tra:
git --version
10. Cài Docker, Docker Compose
sudo apt update && \
sudo apt install -y ca-certificates curl && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt update && \
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \
sudo systemctl enable --now docker && \
docker --version && \
docker compose version
11. Kiểm Ubuntu User chạy Docker
#
sudo usermod -aG docker $USER
Logout:
exit
SSH lại:
ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
Test:
docker ps
12. Chạy Docker daemon
sudo systemctl start docker
13. Clone Todo App trên EC2
cd ~
git clone https://github.com/dockersamples/todo-list-app.git
cd todo-list-app
14. Deploy lần đầu
docker compose up -d --build
Kiểm tra:
docker compose ps
Test:
curl http://localhost:3000
15. Cài Nginx
sudo apt install nginx -y
Kiểm tra:
sudo systemctl status nginx
16. Cấu hình Nginx
Xóa config mặc định:
sudo rm /etc/nginx/sites-enabled/default
Tạo config:
sudo nano /etc/nginx/sites-available/todo-app
Nội dung:
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
17. Enable Nginx
sudo ln -s \
/etc/nginx/sites-available/todo-app \
/etc/nginx/sites-enabled/todo-app
Test:
sudo nginx -t
Restart:
sudo systemctl restart nginx
18. Test từ EC2
curl http://localhost
Todo App phải trả về response.
19. Test từ Internet
Trên Mac:
curl http://<EC2_PUBLIC_IP>
Hoặc mở:
http://<EC2_PUBLIC_IP>
Kết quả:
Internet
↓
EC2 :80
↓
Nginx
↓
Node.js :3000
↓
MySQL :3306
20. Deploy lần 2
Sửa application:
cd ~/todo-list-app
Thay đổi code.
Ví dụ:
Todo App
thành:
Todo App - Chapter 1
Commit:
git add .
git commit -m "update todo app"
Push:
git push
21. Manual Deployment
SSH vào EC2:
ssh -i ~/Downloads/chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
cd ~/todo-list-app
Pull:
git pull
Build:
docker compose build
Deploy:
docker compose up -d
Kiểm tra:
docker compose ps
22. Kiểm tra version mới
Mở:
http://<EC2_PUBLIC_IP>
Version mới phải xuất hiện.
23. Deployment Flow
Sau Chapter 1:
Developer
│
▼
GitHub
│
│ SSH
▼
AWS EC2
│
├── git pull
│
├── docker compose build
│
└── docker compose up -d
24. Architecture hoàn chỉnh
┌──────────────┐
│ GitHub │
└──────┬───────┘
│
git pull
│
▼
┌─────────────────┐
│ AWS EC2 │
│ │
│ Nginx │
│ │ │
│ ▼ │
│ Node.js App │
│ │ │
│ ▼ │
│ MySQL │
│ │
│ Docker Compose │
└─────────────────┘
25. Checklist
□ AWS EC2
□ Ubuntu
□ SSH
□ Git
□ Docker
□ Docker Compose
□ Clone Todo App
□ Deploy Todo App
□ MySQL Container
□ Nginx
□ Reverse Proxy
□ Security Group
□ Public IP
□ Truy cập từ Internet
□ Deploy lần 1
□ Sửa code
□ git push
□ git pull
□ Deploy lần 2
□ Manual Deployment
Chapter 1 kết thúc ở đây.
CHAPTER 1
│
▼
Manual Deployment
│
▼
"Deploy nhiều lần bắt đầu
trở thành bottleneck"
│
▼
CHAPTER 2
│
▼
CI / CD
All rights reserved