Bài 7: Networking trong Docker
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:
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.
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.
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.
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.
Tạo mạng tùy chỉnh:
docker network create app-networkChạ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.0Chạ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-appKiể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-networkKế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
Truy cập vào container Spring Boot:
docker exec -it springboot-container /bin/shKiểm tra kết nối tới MySQL:
ping mysql-containerKế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
Build và chạy:
docker-compose up --buildKiể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 inspectvà kiểm tra kết nối giữa các container.