Skip to main content

Command Palette

Search for a command to run...

Bài 7: Networking trong Docker

Published
3 min readView as Markdown

7.1. Giới thiệu về Docker Networking

Networking trong Docker cho phép các container giao tiếp với nhau hoặc với thế giới bên ngoài. Mỗi container được gắn vào một mạng nhất định khi chạy, giúp quản lý kết nối giữa các container và bảo mật dữ liệu mạng.

Các loại mạng trong Docker:
  1. Bridge (mặc định):

    • Kết nối các container trên cùng một máy chủ.

    • Các container có thể giao tiếp với nhau qua tên container.

  2. Host:

    • Container chia sẻ mạng với máy chủ host.

    • Không có cách ly mạng giữa container và host.

  3. None:

    • Container không kết nối mạng.

    • Phù hợp với các container không cần giao tiếp mạng.

  4. Overlay:

    • Kết nối container trên nhiều máy chủ khác nhau.

    • Thường dùng trong các hệ thống phân tán (Docker Swarm hoặc Kubernetes).


7.2. Kết nối các container với nhau

Ví dụ: Kết nối Spring Boot với MySQL

Tạo một mạng tùy chỉnh để các container giao tiếp dễ dàng hơn.

  1. Tạo mạng tùy chỉnh:

     docker network create app-network
    
  2. Chạy MySQL container và kết nối mạng:

     docker run --name mysql-container \
       --network app-network \
       -e MYSQL_ROOT_PASSWORD=root \
       -e MYSQL_DATABASE=mydb \
       -d mysql:8.0
    
  3. Chạy ứng dụng Spring Boot và kết nối cùng mạng:

     docker run --name springboot-container \
       --network app-network \
       -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-container:3306/mydb \
       -e SPRING_DATASOURCE_USERNAME=root \
       -e SPRING_DATASOURCE_PASSWORD=root \
       -p 8080:8080 \
       -d spring-boot-app
    
  4. Kiểm tra kết nối mạng:

    • Kiểm tra các container trên mạng:

        docker network inspect app-network
      

7.3. Cấu hình network cho ứng dụng Spring Boot và cơ sở dữ liệu

Sử dụng Docker Compose

Tạo file docker-compose.yml để cấu hình mạng tự động:

version: '3.9'
services:
  springboot-app:
    build: .
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-container:3306/mydb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
    networks:
      - app-network

  mysql-container:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

Chạy lệnh:

docker-compose up --build

Mạng app-network được tạo tự động và các container được kết nối với nhau.


7.4. Debug network với docker network inspect

Kiểm tra cấu hình mạng
  • Lệnh:

      docker network inspect app-network
    
  • Kết quả hiển thị thông tin chi tiết về mạng:

    • Tên container kết nối.

    • Địa chỉ IP của từng container.

Truy cập container để kiểm tra kết nối
  1. Truy cập vào container Spring Boot:

     docker exec -it springboot-container /bin/sh
    
  2. Kiểm tra kết nối tới MySQL:

     ping mysql-container
    
  3. Kết nối MySQL bằng lệnh:

     mysql -h mysql-container -u root -p
    

7.5. Thực hành: Thiết lập network cho ứng dụng multi-container

Bước 1: Tạo cấu trúc dự án

Thư mục dự án:

docker-network-example/
├── src/
├── Dockerfile
├── docker-compose.yml
├── pom.xml
Bước 2: Tạo Dockerfile
FROM openjdk:11
COPY target/spring-boot-app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Bước 3: Tạo file docker-compose.yml

Sử dụng nội dung ở phần 7.3.

Bước 4: Chạy ứng dụng
  1. Build và chạy:

     docker-compose up --build
    
  2. Kiểm tra API Spring Boot: Truy cập http://localhost:8080.

Bước 5: Kiểm tra mạng
  • Kiểm tra mạng:

      docker network ls
      docker network inspect app-network
    

Tóm tắt

  • Docker cung cấp các loại mạng như bridge, host, none và overlay để quản lý kết nối container.

  • Sử dụng Docker Compose để dễ dàng cấu hình và quản lý mạng multi-container.

  • Debug mạng bằng cách sử dụng lệnh docker network inspect và kiểm tra kết nối giữa các container.

More from this blog

hoangkim

366 posts