Docker & Docker Compose Q&A Notes
1. Docker Compose vs Docker Run Commands
Q: Command này có đúng không: docker-compose -f ./docker-compose.prod.yml up --name fastify-api -p 80:8000 -d --remove-orphans?
A: SAI. Có một số vấn đề:
--name fastify-api- Đây là flag củadocker run, không phảidocker-compose up-p 80:8000- Đây cũng là flag củadocker run
Command đúng:
bash
docker-compose -f ./docker-compose.prod.yml up -d --remove-orphansĐể có tên container và port mapping, định nghĩa trong file docker-compose.yml:
yaml
services:
fastify-api:
container_name: fastify-api
ports:
- '80:8000'2. Docker Build vs Docker Compose
Q: Command này có đúng không: docker build -f docker/docker-compose.base.yml -f docker/docker-compose.prod.yml?
A: SAI. Đang nhầm lẫn giữa docker build và docker-compose.
Vấn đề:
docker builddùng để build image từ Dockerfile- Flag
-ftrongdocker buildchỉ định đường dẫn tới Dockerfile, không phải docker-compose files
Commands đúng:
Sử dụng docker-compose với multiple files:
bash
docker-compose -f docker/docker-compose.base.yml -f docker/docker-compose.prod.yml up --buildBuild từ Dockerfile:
bash
docker build -f docker/Dockerfile -t image-name .3. Build Docker với Target Production
Q: Làm thế nào để build target production từ multi-stage Dockerfile?
A: Sử dụng flag --target:
bash
docker build --target production -t fastify-api:prod .Các target khả dụng:
local- Development với hot reloaddevelopment- Development với compiled codeproduction- Production optimized
Ví dụ build các targets:
bash
# Local development
docker build --target local -t fastify-api:local .
# Production
docker build --target production -t fastify-api:prod .4. Docker Compose Deployment Issues
Q: Chỉ chạy docker compose -f docker-compose.prod.yml up -d --remove-orphans thì code mới có được cập nhật?
A: KHÔNG. Code mới sẽ KHÔNG được cập nhật.
Vấn đề:
- Container đang chạy → Docker Compose sẽ skip việc recreate
- Ngay cả khi image mới đã pull về, container cũ vẫn chạy với image cũ
- Docker Compose chỉ recreate khi detect config changes, không phải image changes
Giải pháp:
Option 1: Force recreate (Recommended)
bash
docker compose -f docker-compose.prod.yml up -d --force-recreate --remove-orphansOption 2: Build và up cùng lúc
bash
docker compose -f docker-compose.prod.yml up -d --build --remove-orphansOption 3: Stop trước, sau đó up
bash
docker compose -f docker-compose.prod.yml down
docker compose -f docker-compose.prod.yml up -d --remove-orphans5. ECR Deployment Best Practices
Q: Deployment flow đúng cho production với ECR như thế nào?
A: Best practice flow:
bash
# 1. Pull latest images từ ECR
docker compose -f docker-compose.prod.yml pull
# 2. Recreate containers với image mới
docker compose -f docker-compose.prod.yml up -d --force-recreate --remove-orphansCheck deployment:
bash
# Check image hiện tại của container
docker inspect <container-name> | grep Image
# Check images có sẵn
docker images | grep your-appKey Takeaways
- Không nhầm lẫn giữa
docker runflags vàdocker-composesyntax docker build≠docker-compose- mỗi cái có mục đích khác nhau- Sử dụng
--targetđể build specific stage trong multi-stage Dockerfile --force-recreatelà cần thiết để ensure container chạy với image mới- Always pull trước khi deploy với ECR để ensure latest image