Hướng Dẫn Docker Từ Cơ Bản Đến Nâng Cao

Hướng Dẫn Docker Từ Cơ Bản Đến Nâng Cao

Docker là một nền tảng mã nguồn mở giúp phát triển, vận hành và triển khai ứng dụng dễ dàng hơn bằng cách sử dụng container. Hướng dẫn này sẽ giúp bạn nắm vững Docker từ những kiến thức cơ bản đến các kỹ thuật nâng cao.

Phần 1: Docker Cơ Bản#

1. Docker Là Gì?#

Docker sử dụng container để đóng gói ứng dụng cùng với tất cả phụ thuộc (libraries, config files, ...) trong một môi trường chạy độc lập. Điều này giúp ứng dụng hoạt động nhất quán trên các môi trường khác nhau.

Ưu Điểm:

  • Nhẹ và nhanh: Docker container khởi động nhanh hơn nhiều so với máy ảo (VM).
  • Di động: Chạy container trên bất kỳ hệ thống nào hỗ trợ Docker.
  • Dễ dàng quản lý: Các image và container có thể được chia sẻ qua Docker Hub.

2. Các Thành Phần Chính Trong Docker#

  1. Docker Image:
    • Là một file tĩnh chứa tất cả các thành phần cần thiết để chạy ứng dụng.
    • Ví dụ: Image cho Node.js hoặc Python.
  2. Docker Container:
    • Là một instance đang chạy của Docker Image.
    • Có thể coi container như một "máy chủ ảo" nhỏ.
  3. Dockerfile:
    • Là file định nghĩa cách tạo Docker Image.
  4. Docker Hub:
    • Kho lưu trữ image trực tuyến, nơi bạn có thể tải và chia sẻ các image.

3. Cài Đặt Docker#

Trên Windows 11:

  1. Tải Docker Desktop từ trang chủ Docker.
  2. Cài đặt và kích hoạt WSL 2 để chạy Docker.
  3. Sau khi cài đặt, mở Docker Desktop và kiểm tra bằng lệnh:
    docker --version

Trên Linux:

  1. Cài đặt Docker Engine:
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  2. Kiểm tra phiên bản:
    docker --version

4. Các Lệnh Docker Cơ Bản#

  1. Kiểm tra Docker đã hoạt động:
    docker run hello-world
  2. Liệt kê container đang chạy:
    docker ps
  3. Tải image từ Docker Hub:
    docker pull <image_name>
  4. Chạy container từ image:
    docker run -it <image_name>
  5. Dừng container:
    docker stop <container_id>

5. Tạo Dockerfile#

Dockerfile định nghĩa cách tạo Docker Image. Ví dụ, Dockerfile cho một ứng dụng Python:
# Sử dụng image Python chính thức
FROM python:3.9-slim

# Sao chép mã nguồn vào container
WORKDIR /app
COPY . /app

# Cài đặt các thư viện cần thiết
RUN pip install -r requirements.txt

# Chạy ứng dụng
CMD ["python", "app.py"]
Tạo image từ Dockerfile:
docker build -t my-python-app .
Chạy container từ image:
docker run -d -p 5000:5000 my-python-app

Phần 2: Docker Nâng Cao#

1. Docker Compose#

Docker Compose giúp quản lý nhiều container cùng một lúc thông qua file docker-compose.yml.

Ví dụ:

Cấu hình WordPress và MySQL bằng Docker Compose:
version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: root
      WORDPRESS_DB_NAME: wordpress

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
Chạy các dịch vụ:
docker-compose up -d

2. Docker Network#

Docker Network cho phép các container giao tiếp với nhau.

Tạo mạng riêng:

docker network create my_network

Kết nối container vào mạng:

docker network connect my_network <container_id>

3. Docker Volume#

Volume giúp lưu trữ dữ liệu vĩnh viễn bên ngoài container.

Tạo Volume:

docker volume create my_volume

Gắn Volume vào container:

docker run -v my_volume:/data -it ubuntu

4. Triển Khai Ứng Dụng Thực Tế#

Triển khai ứng dụng Flask với Redis Cache:

  1. Dockerfile cho Flask:
    FROM python:3.9
    WORKDIR /app
    COPY . /app
    RUN pip install flask redis
    CMD ["python", "app.py"]
  2. docker-compose.yml:
    version: '3.8'
    
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        depends_on:
          - redis
      redis:
        image: redis:latest
  3. Chạy ứng dụng:
    docker-compose up

Phần 3: Docker Trong Sản Xuất#

1. Triển Khai Với Docker Swarm#

Docker Swarm giúp quản lý cụm container để triển khai ứng dụng ở quy mô lớn.

Tạo cluster:

docker swarm init

Triển khai stack:

Tạo file stack.yml:
version: '3.8'

services:
  app:
    image: my-app:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
      restart_policy:
        condition: on-failure
Chạy stack:
docker stack deploy -c stack.yml my_stack

2. Tối Ưu Hóa Image#

  • Giảm kích thước: Sử dụng image nền nhỏ như alpine.
  • Sử dụng multi-stage builds để chỉ giữ lại những phần cần thiết.

Ví dụ:

# Build stage
FROM node:16 as builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# Production stage
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

3. Kết Hợp CI/CD#

Docker dễ dàng tích hợp vào các pipeline CI/CD như Jenkins, GitHub Actions, hoặc GitLab CI để tự động hóa việc build và triển khai container.

Kết Luận#

Docker là một công cụ mạnh mẽ cho mọi giai đoạn phát triển phần mềm, từ thiết lập môi trường, phát triển, kiểm thử, đến triển khai. Khi hiểu rõ các khái niệm cơ bản và nắm vững các kỹ thuật nâng cao, bạn sẽ tối ưu hóa quy trình làm việc và tăng hiệu suất đáng kể. Hãy bắt đầu với Docker ngay hôm nay!

Phần 4: Chức Năng Của Docker#

Docker là một nền tảng giúp xây dựng, triển khai, và chạy các ứng dụng bằng cách sử dụng container. Các container này gói gọn mọi thứ cần thiết để ứng dụng hoạt động, bao gồm mã nguồn, thư viện, và môi trường chạy. Điều này mang lại nhiều lợi ích như:
  1. Đóng gói ứng dụng: Docker giúp gói ứng dụng và tất cả phụ thuộc của nó vào một container để đảm bảo chạy nhất quán trên mọi môi trường (Windows, macOS, Linux).
  2. Triển khai dễ dàng: Container Docker có thể dễ dàng di chuyển từ máy phát triển sang máy chủ sản xuất mà không lo gặp lỗi do khác biệt môi trường.
  3. Nhẹ và nhanh: So với máy ảo, container Docker nhẹ hơn và khởi động nhanh chóng vì chúng chia sẻ kernel của hệ điều hành.
  4. Khả năng mở rộng: Docker cho phép chạy nhiều container cùng lúc, giúp ứng dụng dễ dàng mở rộng hoặc chạy các phiên bản khác nhau của dịch vụ.

Phần 5: Ví Dụ Thực Tế Sử Dụng Docker#

1. Ứng Dụng Web Với Các Thành Phần Khác Nhau#

Giả sử bạn đang phát triển một ứng dụng web với các thành phần:
  • Frontend: React
  • Backend: Node.js
  • Cơ sở dữ liệu: PostgreSQL

Truyền Thống

Khi làm việc mà không có Docker:
  • Cần cài đặt Node.js và PostgreSQL trên máy tính của bạn.
  • Phụ thuộc môi trường, phiên bản phần mềm có thể gây lỗi (ví dụ, Node.js v16 hoạt động, nhưng v18 thì không).
  • Khó khăn trong việc chia sẻ dự án với nhóm, vì họ cần cấu hình môi trường giống bạn.

Với Docker

  1. Tạo Dockerfile cho từng thành phần:
    • Frontend: Dockerfile cho React.
    • Backend: Dockerfile cho Node.js.
    • Database: Sử dụng image chính thức của PostgreSQL từ Docker Hub.
  2. Dùng Docker Compose để định nghĩa cách các container giao tiếp:
    version: '3.8'
    services:
      frontend:
        build: ./frontend
        ports:
          - "3000:3000"
      backend:
        build: ./backend
        ports:
          - "5000:5000"
        depends_on:
          - database
      database:
        image: postgres:latest
        environment:
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
  3. Chạy ứng dụng bằng lệnh:
    docker-compose up
  4. Lợi ích:
    • Không cần cài đặt React, Node.js, hoặc PostgreSQL trên máy bạn.
    • Mọi thứ chạy đồng nhất trên máy bạn và đồng đội, cũng như trong môi trường sản xuất.

2. Triển Khai Ứng Dụng Trên Cloud#

Tình huống:

Bạn có một ứng dụng Python (Django) và muốn triển khai nó lên AWS, Azure, hoặc Google Cloud.

Cách làm với Docker:

  1. Tạo Dockerfile:
    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY . .
    CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]
  2. Đẩy image lên Docker Hub:
    docker build -t my-django-app .
    docker tag my-django-app username/my-django-app:latest
    docker push username/my-django-app:latest
  3. Triển khai container từ Docker Hub lên server bằng lệnh:
    docker run -d -p 8000:8000 username/my-django-app:latest
  4. Lợi ích:
    • Dễ dàng chuyển đổi cloud provider mà không cần thay đổi cách triển khai.
    • Tự động mở rộng quy mô bằng cách chạy thêm container.

3. Kiểm Thử Tự Động#

Tình huống:

Bạn cần kiểm thử ứng dụng trên nhiều phiên bản khác nhau của cơ sở dữ liệu MySQL (5.7 và 8.0).

Cách làm với Docker:

  1. Chạy hai container MySQL độc lập:
    docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    docker run --name mysql80 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0
  2. Kết nối ứng dụng lần lượt đến từng container để kiểm tra tương thích.
  3. Lợi ích:
    • Không cần cài đặt nhiều phiên bản MySQL trên máy.
    • Dễ dàng tái sử dụng container cho các bài kiểm tra khác.

4. Chạy Các Dịch Vụ Phụ#

Tình huống:

Bạn đang phát triển một ứng dụng Node.js và cần RabbitMQ để xử lý hàng đợi tin nhắn.

Cách làm với Docker:

  1. Chạy RabbitMQ bằng Docker:
    docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
  2. Kết nối ứng dụng Node.js của bạn đến RabbitMQ qua localhost:5672.
  3. Lợi ích:
    • Không cần cài đặt RabbitMQ trực tiếp trên máy.
    • RabbitMQ có thể dễ dàng dừng và khởi động lại chỉ với một lệnh.

5. Đào Tạo AI/ML#

Tình huống:

Bạn muốn thử nghiệm một dự án AI sử dụng TensorFlow trên môi trường Python.

Cách làm với Docker:

  1. Sử dụng image TensorFlow từ Docker Hub:
    docker run -it --name tensorflow-env tensorflow/tensorflow:latest-jupyter
  2. Truy cập Jupyter Notebook trong trình duyệt và bắt đầu làm việc.
  3. Lợi ích:
    • Không phải cài đặt TensorFlow và các phụ thuộc phức tạp.
    • Dễ dàng xóa môi trường và bắt đầu lại nếu có lỗi.

Kết Luận#

Docker là công cụ mạnh mẽ giúp đơn giản hóa việc phát triển, kiểm thử và triển khai ứng dụng. Các ví dụ trên cho thấy Docker không chỉ giải quyết vấn đề nhất quán môi trường mà còn tăng hiệu suất làm việc nhờ khả năng linh hoạt, nhẹ và nhanh chóng. Nếu bạn làm việc trong môi trường phát triển phần mềm, Docker là công cụ không thể thiếu.

Bài viết liên quan