目錄node
docker的橋接網絡使用虛擬網橋,bridge網絡用於同一主機上的docker容器相互通訊,鏈接到同一個網橋的docker容器能夠相互通訊,當咱們啓動docke時,會自動建立一個默認bridge網絡,除非咱們進行另外的配置,新建立的容器都會自動鏈接到這個網絡,咱們也能夠自定義本身的bridge網絡,docker文檔建議使用自定義bridge網絡,默認的bridge網絡具備必定的缺陷python
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:移除自定義網絡前先移除該網絡上的全部容器mysql
docker network create test-bridge
docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7
[success]ps:咱們這裏的mysql服務沒有發佈端口,依然能夠在bridge網絡內暴露使用redis
docker run -d --name redis_bridge --network test-bridge -p 16397:6397 redis:5.0
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容器中測試鏈接mysqlsql
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容器進行通訊。docker
若是在建立容器的時候使用--network=host
選項,那麼容器會使用宿主機的網絡,容器與宿主機的網絡並無隔離。
使用這種網絡類型的好處就是網絡性能很好,基本上跟宿主機的網絡同樣,它很大的弊端就是不安全。若是你的程序是用root用戶運行的,有可能會經過Docker容器來控制宿主機的網絡。ubuntu
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 網絡驅動程序在多個 Docker 守護進程主機之間建立一個分佈式網絡(跨docker主機通訊),全部鏈接該自定義網絡的容器自動相互暴露全部端口。安全
docker swarm init
docker network create --driver=overlay --attachable [net-name]
docker run --network [net-name] [CONTAINER]
docker swarm join [OPTIONS] HOST:PORT
docker swarm leave
更多命令,請參考docker官方文檔
https://docs.docker.com/engine/reference/commandline/swarm/bash
爲了演示跨主機,我這裏克隆一個虛擬機,現兩個虛擬機的信息以下
| 虛擬機 | IP | 安裝 |
| --- | --- | --- |
| ubuntu | 192.168.147.128 | redis |
| ubuntu_copy1 | 192.168.147.130 | mysql |微信
docker swarm init
docker node ls
docker network create --driver=overlay --attachable test-overlay
docker run -tid --name redis_overlay --network test-overlay redis:5.0
docker swarm join --token SWMTKN-1-32pd1ytuwho780hrehx8687y4s54g0fvhf4sh8tx8ea1qp9a6g-9foali4ph3tm0xn5vmu0emomd 192.168.147.128:2377
[warning] 若是不記得token了,能夠在128上執行命令
docker swarm join-token worker 便可顯示加入集羣的命令
docker run -tid --name mysql_overlay --network test-overlay -e MYSQL_ROOT_PASSWORD=root mysql:5.6
docker exec -it redis_overlay /bin/bash
telnet mysql_overlay 3306
到這裏,已經說明經過加入overlay網絡,在兩個主機的兩個容器之間能夠實現通訊了。
若是容器內telnet命令不存在,在容器內先更新apt,而後安裝telnet便可
apt update
apt install telnet
:-:
微信掃一掃,關注「python測試開發圈」,瞭解更多測試教程!