一、docker网络模式有哪些?都有什么用?
Docker提供了多种网络模式,每种模式适用于不同的场景。以下是Docker的主要网络模式及其作用:
---
### 1. **Bridge 模式(默认模式)**
- **定义**:Docker会创建一个虚拟网络桥(`docker0`),容器通过这个桥连接到宿主机网络。
- **特点**:
- 容器分配独立的IP地址。
- 容器之间可以通过IP地址通信。
- 容器可以通过宿主机的IP和端口映射与外部网络通信。
- **适用场景**:
- 单主机上运行多个容器,且容器之间需要通信。
- 需要对外暴露服务的场景。
- **示例**:
```bash
docker run -d --name mycontainer nginx
```
---
### 2. **Host 模式**
- **定义**:容器直接使用宿主机的网络栈,与宿主机共享IP和端口。
- **特点**:
- 容器没有独立的IP地址,直接使用宿主机的IP。
- 性能较高,因为没有额外的网络隔离。
- 端口冲突风险较高。
- **适用场景**:
- 对网络性能要求高的场景。
- 不需要多容器隔离的场景。
- **示例**:
```bash
docker run -d --name mycontainer --network host nginx
```
---
### 3. **None 模式**
- **定义**:容器没有网络接口,完全隔离于网络。
- **特点**:
- 容器无法与外部网络通信。
- 适用于完全隔离的场景。
- **适用场景**:
- 安全性要求极高的场景。
- 不需要网络通信的容器。
- **示例**:
```bash
docker run -d --name mycontainer --network none nginx
```
---
### 4. **Overlay 模式**
- **定义**:用于跨主机的容器通信,通常与Docker Swarm或Kubernetes等编排工具结合使用。
- **特点**:
- 支持多主机之间的容器通信。
- 容器可以在不同主机上通过虚拟网络通信。
- **适用场景**:
- 分布式应用或多主机集群。
- 需要跨主机通信的场景。
- **示例**:
```bash
docker network create --driver overlay myoverlay
docker service create --network myoverlay --name myservice nginx
```
---
### 5. **Macvlan 模式**
- **定义**:为容器分配一个独立的MAC地址,使其在物理网络中像一个独立的设备。
- **特点**:
- 容器可以直接接入物理网络。
- 每个容器有自己的MAC地址和IP地址。
- **适用场景**:
- 需要容器直接接入物理网络的场景。
- 对网络性能要求高的场景。
- **示例**:
```bash
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mymacvlan
docker run -d --name mycontainer --network mymacvlan nginx
```
---
### 6. **IPvlan 模式**
- **定义**:与Macvlan类似,但多个容器共享同一个MAC地址,通过不同的IP地址区分。
- **特点**:
- 容器共享宿主机的MAC地址。
- 支持L2(链路层)和L3(网络层)模式。
- **适用场景**:
- 需要节省MAC地址资源的场景。
- 对网络性能要求高的场景。
- **示例**:
```bash
docker network create -d ipvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 myipvlan
docker run -d --name mycontainer --network myipvlan nginx
```
---
### 7. **自定义网络**
- **定义**:用户可以创建自定义的Docker网络,指定子网、网关等参数。
- **特点**:
- 支持自定义网络配置。
- 容器之间可以通过容器名称通信(DNS解析)。
- **适用场景**:
- 需要灵活配置网络的场景。
- 多容器之间需要名称解析的场景。
- **示例**:
```bash
docker network create --subnet=172.18.0.0/16 mynetwork
docker run -d --name mycontainer --network mynetwork nginx
```
---
### 8. **Container 模式**
- **定义**:容器共享另一个容器的网络栈。
- **特点**:
- 两个容器共享IP和端口。
- 适用于需要紧密耦合的容器。
- **适用场景**:
- 需要共享网络的容器(如Sidecar模式)。
- **示例**:
```bash
docker run -d --name container1 nginx
docker run -d --name container2 --network container:container1 nginx
```
---
### 总结
| 网络模式 | 特点 | 适用场景 |
|---------------|----------------------------------------------------------------------|------------------------------------------|
| **Bridge** | 默认模式,容器通过虚拟桥接网络通信 | 单主机多容器通信,对外暴露服务 |
| **Host** | 容器直接使用宿主机网络栈 | 高性能需求,不需要网络隔离 |
| **None** | 容器无网络接口,完全隔离 | 安全性要求高,无需网络通信 |
| **Overlay** | 支持跨主机容器通信 | 分布式应用,多主机集群 |
| **Macvlan** | 容器直接接入物理网络,有独立MAC地址 | 容器需要直接接入物理网络 |
| **IPvlan** | 容器共享MAC地址,通过IP地址区分 | 节省MAC地址资源,高性能需求 |
| **自定义网络**| 用户自定义网络配置,支持DNS解析 | 灵活配置网络,多容器名称解析 |
| **Container** | 容器共享另一个容器的网络栈 | 需要紧密耦合的容器(如Sidecar模式) |
根据具体需求选择合适的网络模式,可以更好地管理容器的网络通信和隔离性。
二、实战部署几个常用的网络模式
[root@cjr ~]# docker run -it --name test1 --net=none centos bash
[root@08d53fdc2dd5 /]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
[root@cjr ~]# docker run -it --name test2 --net=container:test1 centos bash
[root@b95bf4bf1137 /]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
[root@cjr ~]# docker run -it --name test4 --net=host centos bash