Hướng Dẫn Toàn Diện Về Docker: Từ Cài Đặt Đến Triển Khai Cụm Ứng Dụng

Chào bạn, dưới đây là hướng dẫn chi tiết từng bước để bạn có thể làm chủ Docker, từ việc cài đặt trên các nền tảng phổ biến như Windows 11 và Ubuntu 22.04, cho đến việc triển khai một cụm ứng dụng hoàn chỉnh sử dụng Docker Compose.

1. Triển Khai Docker trên Windows 11 và Ubuntu 22.04

Việc cài đặt Docker là bước đầu tiên và quan trọng nhất. Dưới đây là hướng dẫn cho hai hệ điều hành phổ biến:

Trên Windows 11:

Docker Desktop là cách dễ dàng nhất để có Docker trên Windows. Nó tích hợp WSL 2 (Windows Subsystem for Linux) để mang lại trải nghiệm tốt nhất.

  • Yêu cầu hệ thống:
    • Windows 11 phiên bản 64-bit: Home, Pro, Enterprise, hoặc Education.
    • Bật tính năng ảo hóa trong BIOS/UEFI.
    • Ít nhất 4GB RAM.
  • Các bước cài đặt:
    1. Tải Docker Desktop: Truy cập trang web chính thức của Docker (https://www.docker.com/products/docker-desktop/) và tải về trình cài đặt cho Windows. Lưu ý xem bản OS của bạn là 64 hay 32 và chọn cho phù hợp.
    2. Chạy trình cài đặt: Mở file .exe vừa tải về. Trong quá trình cài đặt, hãy chắc chắn rằng bạn đã chọn tùy chọn “Use WSL 2 instead of Hyper-V”.
    3. Khởi động lại máy tính: Sau khi cài đặt hoàn tất, khởi động lại máy tính của bạn.
    4. Khởi động Docker Desktop: Docker Desktop sẽ tự động khởi động sau khi bạn đăng nhập lại. Biểu tượng cá voi Docker sẽ xuất hiện trên thanh tác vụ.
    5. Kiểm tra cài đặt: Mở PowerShell hoặc Command Prompt và gõ lệnh sau:
    6. docker –version

Trên Ubuntu 22.04:

Trên Linux, chúng ta sẽ cài đặt Docker Engine từ kho lưu trữ chính thức của Docker.

  • Các bước cài đặt:
    1. Cập nhật hệ thống:sudo apt update && sudo apt upgrade -y
    2. Cài đặt các gói cần thiết:sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
    3. Thêm Docker’s official GPG key: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    4. Thêm kho lưu trữ Docker: echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    5. Cài đặt Docker Engine:sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io
    6. Thêm người dùng hiện tại vào nhóm docker (để không cần sudo mỗi khi chạy lệnh docker):sudo usermod -aG docker ${USER}" –>Bạn cần đăng xuất và đăng nhập lại để thay đổi này có hiệu lực.
    7. Kiểm tra cài đặt: docker --version

2 .Dùng Portainer Enterprise để quản lý các Host (Bài này mình làm trên Ubuntu)

  1. Tạo một volume để lưu trữ dữ liệu của Portainer:
    • docker volume create portainer_data
  2. Chạy Portainer Server:
    • docker run -d -p 8000:8000 -p 9443:9443 –name portainer –restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data_portainer/portainer-ce:latest
      • p 9443:9443: Port cho giao diện web HTTPS.
      • -p 8000:8000: Port cho tunnel (không cần thiết trong trường hợp này nhưng nên có).
      • -v /var/run/docker.sock...: Cho phép Portainer quản lý Docker trên chính host này.
    • Kết nối hai Host trong Portainer:
      • Mở trình duyệt và truy cập vào giao diện Portainer trên máy Ubuntu: https://<IP_CUA_MAY_UBUNTU>:9443.
      • Tạo tài khoản admin lần đầu đăng nhập.
      • Trong giao diện chính, chọn Environments -> Add environment.
      • Chọn Docker Standalone và nhấn Start Wizard.
      • Chọn Agent. Đặt tên cho môi trường (ví dụ: Docker-Windows) và nhập địa chỉ IP của máy Windows vào ô Environment URL (ví dụ: <IP_CUA_MAY_WINDOWS>:9001).
      • Nhấn Connect. Giờ đây bạn có thể chuyển đổi giữa hai môi trường (local Ubuntu và remote Windows) từ menu của Portainer.
  3. Tạo một Registry Local (Ví dụ ở đây Nginx).
    • Bước 1: Chạy Registry Local
      • Đầu tiên, bạn cần khởi chạy một container từ image registry chính thức. Container này sẽ hoạt động như một máy chủ lưu trữ các image Docker của riêng bạn.
        • docker run -d -p 5000:5000 –restart=always –name local-registry registry:2
      • Bước 2: Lấy và Tag Image Nginx
        • Bây giờ, bạn cần một image để đẩy lên registry vừa tạo. Chúng ta sẽ sử dụng image Nginx chính thức từ Docker Hub.
        • Kéo (pull) image Nginx về máy: (Tự động kéo từ trang chủ docker về)
          • docker pull nginx:latest
        • Tag lại image:
          • Để đẩy một image lên registry local, bạn cần “tag” (gắn thẻ) nó với một cái tên mới theo định dạng [địa_chỉ_registry]/[tên_image]. Vì registry đang chạy trên chính máy của bạn (localhost) ở port 5000, địa chỉ sẽ là localhost:5000.
          • Chạy lệnh sau để tag lại image nginx:latest:
          • docker tag nginx:latest localhost:5000/my-nginx
            • nginx:latest: Image gốc.
            • localhost:5000/my-nginx: Tên mới của image, trỏ đến registry local của bạn. my-nginx là tên bạn tự đặt.
      • Bước 3: Đẩy (Push) Image lên Registry Local
        • Khi đã tag xong, bạn chỉ cần đẩy image với tên mới này lên registry.
          • docker push localhost:5000/my-nginx
          • Nếu lệnh chạy thành công, bạn sẽ thấy output cho thấy các layer của image đang được đẩy lên
      • Bước 4: Kiểm tra lại 🧐
        • Để chắc chắn rằng image đã được lưu trữ thành công trên registry local, bạn có thể thực hiện các bước sau:
          • Xóa các image Nginx khỏi bộ nhớ cache của Docker trên máy: docker rmi nginx:latest docker rmi localhost:5000/my-nginx
          • Kéo (pull) lại image từ chính registry local của bạn: docker pull localhost:5000/my-nginx
          • Chạy container từ image vừa kéo về để xác nhận: docker run --rm -d -p 8081:80 --name test-nginx localhost:5000/my-nginx
        • Bây giờ, hãy mở trình duyệt và truy cập vào http://localhost:8081. Nếu bạn thấy trang chào mừng của Nginx, điều đó có nghĩa là bạn đã tạo thành công registry local và đã đẩy/kéo image Nginx từ đó một cách thành công! 🎉
  4. Viết Dockerfile và triển khai dự án Shopping-Cart (Java Spring Boot)
    • ## Phần 0: Chuẩn bị Môi trường (Bạn chỉ cần làm 1 lần) 🛠️
      Cài đặt Java Development Kit (JDK)
      https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
      Sử dụng edit và biên dịch bằng Visual Core.
      Cài đặt Docker Desktop for Windows
      Tạo tài khoản Docker Hub (tự tạo và đăng nhập docker hub).
      ## Phần 1: Tạo dự án Spring Boot “Shopping Cart” Đơn giản 🏗️
      Bước 1: Truy cập https://start.spring.io/
      Bước 2: Cấu hình dự án như sau:Bạn có thể tạo dự án Spring Boot bằng cách sử dụng Spring Initializr, chọn các dependencies như:
      Spring Web
      Spring Data JPA
      H2 Database (hoặc MySQL/PostgreSQL nếu bạn muốn dùng cơ sở dữ liệu khác)
      Spring Boot DevTools (tùy chọn)
      Bước 2: Nhấn nút GENERATE. Một file .zip sẽ được tải về.
      Bước 3: Giải nén file shopping-cart.zip ra một thư mục nào đó.
      Bước 4: Mở VS Code, chọn File > Open Folder... và chọn thư mục shopping-cart bạn vừa giải nén.
      ·  Bước 5: Mở VS Code, chọn File > Open Folder... và chọn thư mục shopping-cart bạn
      ## Phần 2: Viết “Bản thiết kế” – Dockerfile 📝
      1. Viết Dockerfile ⚙️
      Tạo Dockerfile trong thư mục gốc của dự án Spring Boot:
       # Bước 1: Chọn image nền từ Docker Hub
      FROM openjdk:17-jdk-slim
      # Bước 2: Thiết lập thư mục làm việc trong container
      WORKDIR /app
      # Bước 3: Sao chép file JAR của Spring Boot vào container
      COPY target/shopping-cart-0.0.1-SNAPSHOT.jar app.jar
      # Bước 4: Mở cổng cho container (thường Spring Boot chạy trên cổng 8080)
      EXPOSE 8080
      # Bước 5: Chạy ứng dụng Spring Boot khi container khởi động
      ENTRYPOINT [“java”, “-jar”, “app.jar”]
      ·  Giải thích các bước:
      FROM openjdk:17-jdk-slim: Sử dụng OpenJDK 17 là môi trường chạy Java.
      WORKDIR /app: Thiết lập thư mục làm việc là /app.
      COPY target/shopping-cart-0.0.1-SNAPSHOT.jar app.jar: Sao chép file JAR đã build vào container.
      EXPOSE 8080: Mở cổng 8080 cho ứng dụng Spring Boot.
      ENTRYPOINT [“java”, “-jar”, “app.jar”]: Chạy file JAR khi container bắt đầu.
      2.Xây dựng ứng dụng Spring Boot:
                  Chạy lệnh sau trong terminal để tạo file JAR từ mã nguồn:
                  ./mvnw clean package

      3. Đóng gói Image 📦
      docker build -t hoatrancntt/shopping-cart:latest .
      4.Kiểm tra images đã build –dùng lên : docker images.
      5: Public Docker Image lên Docker Hub

5. Viết Dockerfile và triển khai dự án Shopping-Cart (Java Spring Boot)

– Viết Dockerfile và triển khai dự án Shopping-Cart dùng Java sprint boost trên:
+ Viết Dockerfile
+ Đóng gói image
+ Public image lên docker hub
+ Docker Linux

– Triển khai một cụm docker-compose đầy đủ:
+ Backup end
+ Frond end
+ Health check

5.1 Cấu trúc dự án (ví dụ)

Tạo dự án trên https://start.spring.io:
  • Project: Maven
  • Language: Java
  • Spring Boot: 3.x+
  • Dependencies:
    • Spring Web
    • Spring Boot DevTools
    • Spring Boot Actuator

shopping-cart/
├── backend/
│ ├── Dockerfile
│ └── target/shopping-cart-0.0.1-SNAPSHOT.jar
├── frontend/
│ ├── Dockerfile
│ └── build/
├── docker-compose.yml

5.2 Viết Dockerfile cho Backend (Spring Boot)

–> Sau khi tải file từ spring.io –> giải nén –> coppy vào backend.

Trong backend tạo Dockerfile

FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY target/shopping-cart-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT [“java”, “-jar”, “app.jar”]

5.3 Build & Push Image lên Docker Hub

cd backend
./mvnw clean package -DskipTests

docker build -t yourdockerhubusername/shopping-cart-backend:latest .

5.4 Push lên docker Hub

docker login
docker push yourdockerhubusername/shopping-cart-backend:latest

5.6 Phần Frontend.

frontend/Dockerfile

FROM nginx:alpine
COPY build/ /usr/share/nginx/html
EXPOSE 80

Build & Push

cd frontend
docker build -t yourdockerhubusername/shopping-cart-frontend:latest .
docker push yourdockerhubusername/shopping-cart-frontend:latest

5.7 Tạo docker-compose.yml

version: ‘3.8’

services:
backend:
image: yourdockerhubusername/shopping-cart-backend:latest
container_name: shopping-backend
ports:
– “8080:8080”
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost:8080/actuator/health”]
interval: 30s
timeout: 10s
retries: 3
volumes:
– backend-data:/app/data
restart: always

frontend:
image: yourdockerhubusername/shopping-cart-frontend:latest
container_name: shopping-frontend
ports:
– “80:80”
depends_on:
backend:
condition: service_healthy
restart: always

volumes:
backend-data:

5.8 Chạy Docker Compose

docker-compose up -d

5.9 Kiểm tra & Health Check

Truy cập:

  • http://localhost:8080 → Backend Spring Boot
  • http://localhost → Frontend React
  • http://localhost:8080/actuator/health → Health check