橋接網絡 Bridge Network
docker的橋接網絡使用虛擬網橋,bridge網絡用於同一主機上的docker容器相互通信,連接到同一個網橋的docker容器可以相互通信,當我們啓動docke時,會自動創建一個默認bridge網絡,除非我們進行另外的配置,新創建的容器都會自動連接到這個網絡,我們也可以自定義自己的bridge網絡,docker文檔建議使用自定義bridge網絡,默認的bridge網絡具有一定的缺陷
相關操作命令
-
創建一個自定義網絡
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]
ps:移除自定義網絡前先移除該網絡上的所有容器
實例演示:容器之間通過自定義bridge通訊
- 創建自定義網絡test-bridge
docker network create test-bridge
- 初始化容器mysql_bridge,加入到自定義網絡test-bridge
docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7
ps:我們這裏的mysql服務沒有發佈端口,依然可以在bridge網絡內暴露使用
- 初始化容器redis_bridge,加入到自定義網絡test-bridge中,併發布端口6397
docker run -d --name redis_bridge --network test-bridge -p 16397:6397 redis:5.0
- 檢查mysql_bridge與redis_bridge網絡
root@ubuntu:/home/hui# 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/hui# 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/
實例演示:容器之間通過自定義Overlay 跨主機通訊
爲了演示跨主機,我這裏克隆一個虛擬機,現兩個虛擬機的信息如下
虛擬機 | IP | 安裝 |
---|---|---|
ubuntu | 192.168.147.128 | redis |
ubuntu_copy1 | 192.168.147.130 | mysql |
- 在128上初始化集羣
docker swarm init
2. 在128上查看當前節點
docker node ls
3. 在128上創建overlay network
docker network create --driver=overlay --attachable test-overla
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
如果不記得token了,可以在128上執行命令
docker swarm join-token worker 即可顯示加入集羣的命令
- 在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/
telnet mysql_overlay 3306
到這裏,已經說明通過加入overlay網絡,在兩個主機的兩個容器之間可以實現通信了。
如果容器內telnet命令不存在,在容器內先更新apt,然後安裝telnet即可
apt update
apt install telnet