Skip to content

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ủa docker run, không phải docker-compose up
  • -p 80:8000 - Đây cũng là flag của docker 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 builddocker-compose.

Vấn đề:

  • docker build dùng để build image từ Dockerfile
  • Flag -f trong docker build chỉ đị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 --build

Build 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 reload
  • development - Development với compiled code
  • production - 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-orphans

Option 2: Build và up cùng lúc

bash
docker compose -f docker-compose.prod.yml up -d --build --remove-orphans

Option 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-orphans

5. 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-orphans

Check 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-app

Key Takeaways

  1. Không nhầm lẫn giữa docker run flags và docker-compose syntax
  2. docker builddocker-compose - mỗi cái có mục đích khác nhau
  3. Sử dụng --target để build specific stage trong multi-stage Dockerfile
  4. --force-recreate là cần thiết để ensure container chạy với image mới
  5. Always pull trước khi deploy với ECR để ensure latest image

Today I Learned