# docker network connect

## 描述

将一个容器连接到指定的网络。

你可以通过容器名称或容器 ID 将其连接到网络。一旦连接成功，该容器就可以与同一网络中的其他容器进行通信。

## 用法

```bash
docker network connect [OPTIONS] NETWORK CONTAINER
```

## 选项

| 选项                | 默认值 | 描述                                    |
| ----------------- | --- | ------------------------------------- |
| `--alias`         | 无   | 为容器添加网络作用域的别名（可在该网络中通过别名访问容器）         |
| `--driver-opt`    | 无   | 网络驱动程序的选项                             |
| `--ip`            | 无   | 指定分配给容器接口的 IPv4 地址（例如：172.30.100.104） |
| `--ip6`           | 无   | 指定分配给容器接口的 IPv6 地址（例如：2001:db8::33）   |
| `--link`          | 无   | 添加对另一个容器的链接（传统方式，不推荐在用户自定义网络中使用）      |
| `--link-local-ip` | 无   | 为容器添加链路本地（link-local）IP 地址            |

## 示例

### 1. 将正在运行的容器连接到网络

```bash
$ docker network connect multi-host-network container1
```

### 2. 启动容器时直接连接到网络

你也可以在启动容器时通过 `--network` 选项将其连接到网络：

```bash
$ docker run -itd --network=multi-host-network busybox
```

### 3. 指定容器在该网络中使用的 IP 地址（`--ip`）

```bash
$ docker network connect --ip 10.10.36.122 multi-host-network container2
```

> **注意**：为确保 IP 地址可用，建议在创建网络时使用 `--ip-range` 指定动态分配范围，并从该范围之外选择静态 IP。例如：
>
> ```bash
> $ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network
> $ docker network connect --ip 172.20.128.2 multi-host-network container2
> ```
>
> 如果容器停止后重启，Docker 会尝试重新应用之前指定的 IP。若该 IP 已被占用，则容器启动失败。

### 4. 使用传统 `--link` 选项（仅适用于默认 bridge 网络）

```bash
$ docker network connect --link container1:c1 multi-host-network container2
```

> ⚠️ 注意：`--link` 是旧版功能，在用户自定义网络中通常不需要，因为容器可通过名称或别名直接解析。

### 5. 为容器设置网络别名（`--alias`）

```bash
$ docker network connect --alias db --alias mysql multi-host-network container2
```

这样，在 `multi-host-network` 网络中的其他容器就可以通过 `db` 或 `mysql` 来访问 `container2`。

### 6. 为容器接口设置 sysctl 参数（`--driver-opt`）

你可以通过 `--driver-opt` 设置特定于网络接口的内核参数（sysctl），特别是以 `net.ipv4.` 或 `net.ipv6.` 开头的参数。需将接口名替换为 `IFNAME` 占位符。

例如，假设容器在 `multi-host-network` 中的接口名为 `eth3`，可设置如下：

```bash
$ docker network connect \
  --driver-opt="com.docker.network.endpoint.sysctls=net.ipv4.conf.IFNAME.log_martians=1,net.ipv4.conf.IFNAME.forwarding=0" \
  multi-host-network container2
```

> **注意**：网络驱动可能会限制可修改的 sysctl 参数。出于网络安全考虑，未来版本可能增加更多限制。

### 容器启停对网络的影响

* 你可以暂停、重启或停止已连接到网络的容器。
* 容器在启动时会自动连接到其配置的网络。
* 若指定了静态 IP，容器重启时会尝试重新使用该 IP。如果该 IP 不再可用，容器将无法启动。

### 验证连接

使用以下命令查看网络详情，确认容器是否已连接：

```bash
$ docker network inspect multi-host-network
```

要断开容器与网络的连接，请使用：

```bash
$ docker network disconnect multi-host-network container2
```

### 跨主机通信

对于支持多主机通信的网络驱动（如 `overlay` 网络或某些第三方插件），即使容器运行在不同的 Docker 引擎上，只要它们连接到同一个多主机网络，也能通过容器名或 IP 直接通信。

### 多网络支持

一个容器可以同时连接到多个网络，且这些网络可以是不同类型（例如同时连接到 `bridge` 和 `overlay` 网络）。
