# 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**:

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:**
    
    ```bash
    docker network create app-network
    ```
    
2. **Chạy MySQL container và kết nối mạng:**
    
    ```bash
    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:**
    
    ```bash
    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:
        
        ```bash
        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:

```yaml
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:**

```bash
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:
    
    ```bash
    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:
    
    ```bash
    docker exec -it springboot-container /bin/sh
    ```
    
2. Kiểm tra kết nối tới MySQL:
    
    ```bash
    ping mysql-container
    ```
    
3. Kết nối MySQL bằng lệnh:
    
    ```bash
    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:

```plaintext
docker-network-example/
├── src/
├── Dockerfile
├── docker-compose.yml
├── pom.xml
```

##### **Bước 2: Tạo Dockerfile**

```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:
    
    ```bash
    docker-compose up --build
    ```
    
2. Kiểm tra API Spring Boot: Truy cập [http://localhost:8080](http://localhost:8080/).
    

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

* Kiểm tra mạng:
    
    ```bash
    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.
