[TOC]
## 橋接網絡 Bridge Network
docker的橋接網絡使用虛擬網橋,bridge網絡用于同一主機上的docker容器相互通信,連接到同一個網橋的docker容器可以相互通信,當我們啟動docke時,會自動創建一個默認bridge網絡,除非我們進行另外的配置,新創建的容器都會自動連接到這個網絡,我們也可以自定義自己的bridge網絡,docker文檔建議使用自定義bridge網絡,默認的bridge網絡具有一定的缺陷
<br>
### 相關操作命令
* #### 創建一個自定義網絡 `docker network create [net-name]`
* #### 實例化容器到自定義網絡:`docker run --network [net-name] [CONTAINER]`
* #### 運行容器加入到自定義網絡`docker network connect [net-name] [CONTAINER]`
* #### 離開用戶自定義網絡`docker network disconnect [net-name] [CONTAINER]`
* #### 查看當前網絡模式 `docker network ls`
* #### 移除自定義網絡:`docker network rm [net-name]`
>[warning]*ps:移除自定義網絡前先移除該網絡上的所有容器*
### 實例演示:容器之間通過自定義bridge通訊
1. 創建自定義網絡test-bridge
```
docker network create test-bridge
```
2. 初始化容器mysql_bridge,加入到自定義網絡test-bridge
```
docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7
```
>[success]*ps:我們這里的mysql服務沒有發布端口,依然可以在bridge網絡內暴露使用*
3. 初始化容器redis_bridge,加入到自定義網絡test-bridge中,并發布端口6397
```
docker run -d --name redis_bridge --network test-bridge -p 16397:6397 redis:5.0
```
4. 檢查mysql_bridge與redis_bridge網絡
```
root@ubuntu:/home/guanfuchang# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
607aa323a3a2 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 3306/tcp, 33060/tcp mysql_bridge
b9b2ca3e0cff redis:5.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp, 0.0.0.0:16397->6397/tcp redis_bridge
```
從redis容器中測試連接mysql
```
root@ubuntu:/home/guanfuchang# docker exec -it redis_bridge /bin/bash
root@b9b2ca3e0cff:/data#
root@b9b2ca3e0cff:/data# ping mysql_bridge
PING mysql_bridge (172.19.0.3) 56(84) bytes of data.
64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.125 ms
64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=2 ttl=64 time=0.137 ms
64 bytes from mysql_bridge.test-bridge (172.19.0.3): icmp_seq=3 ttl=64 time=0.131 ms
^C
--- mysql_bridge ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2043ms
rtt min/avg/max/mdev = 0.125/0.131/0.137/0.005 ms
root@b9b2ca3e0cff:/data#
root@b9b2ca3e0cff:/data# telnet mysql_bridge 3306
Trying 172.19.0.3...
Connected to mysql_bridge.
Escape character is '^]'.
```
由上面的結果可知,在redis容器中,已成功與mysql容器進行通信。
## 宿主網絡 Host Network
如果在創建容器的時候使用`--network=host`選項,那么容器會使用宿主機的網絡,容器與宿主機的網絡并沒有隔離。
使用這種網絡類型的好處就是網絡性能很好,基本上跟宿主機的網絡一樣,它很大的弊端就是不安全。如果你的程序是用root用戶運行的,有可能會通過Docker容器來控制宿主機的網絡。
```
docker run -it --network=host redis:5.0
```
```
root@ubuntu:/home/guanfuchang# netstat -nap | grep "6379"| grep -w LISTEN
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 31894/redis-server
tcp6 0 0 :::6379 :::* LISTEN 31894/redis-server
```
## Overlay Network
overlay 網絡驅動程序在多個 Docker 守護進程主機之間創建一個分布式網絡(跨docker主機通信),所有連接該自定義網絡的容器自動相互暴露所有端口。
### 相關操作命令
* #### 將 Docker 守護進程初始化為 swarm manager `docker swarm init`
* #### 創建overlay網絡 `docker network create --driver=overlay --attachable [net-name]`
* #### 加入overlay網絡 `docker run --network [net-name] [CONTAINER]`
* #### 加入集群 `docker swarm join [OPTIONS] HOST:PORT`
* #### 離開集群 `docker swarm leave`
>更多命令,請參考docker官方文檔
[https://docs.docker.com/engine/reference/commandline/swarm/](https://docs.docker.com/engine/reference/commandline/swarm/)
### 實例演示:容器之間通過自定義Overlay 跨主機通訊
為了演示跨主機,我這里克隆一個虛擬機,現兩個虛擬機的信息如下
| 虛擬機 | IP | 安裝 |
| --- | --- | --- |
| ubuntu | 192.168.147.128 | redis |
| ubuntu_copy1 | 192.168.147.130 | mysql |
1. 在128上初始化集群
```
docker swarm init
```

2. 在128上查看當前節點
```
docker node ls
```

3. 在128上創建overlay network
```
docker network create --driver=overlay --attachable test-overlay
```

4. 在128上實例redis容器,并加入overlay 網絡
```
docker run -tid --name redis_overlay --network test-overlay redis:5.0
```

5. 在130中,加入集群
```
docker swarm join --token SWMTKN-1-32pd1ytuwho780hrehx8687y4s54g0fvhf4sh8tx8ea1qp9a6g-9foali4ph3tm0xn5vmu0emomd 192.168.147.128:2377
```
>[warning] 如果不記得token了,可以在128上執行命令
> docker swarm join-token worker 即可顯示加入集群的命令
6. 在130上實例mysql容器,并加入overlay網絡
```
docker run -tid --name mysql_overlay --network test-overlay -e MYSQL_ROOT_PASSWORD=root mysql:5.6
```

7. 從128中redis容器中測試連接130中的mysql容器
```
docker exec -it redis_overlay /bin/bash
```
```
telnet mysql_overlay 3306
```

到這里,已經說明通過加入overlay網絡,在兩個主機的兩個容器之間可以實現通信了。
>如果容器內telnet命令不存在,在容器內先更新apt,然后安裝telnet即可
```apt update```
```apt install telnet```
---
:-: 
<span style="color: #993366;"><em>***<span style="text-decoration: underline;"><span style="text-decoration: underline;">微信掃一掃,關注“python測試開發圈”,了解更多測試教程!!</span></span>***</em></span>