docker 學習筆記-7

橋接網絡 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通訊

  1. 創建自定義網絡test-bridge
docker network create test-bridge
  1. 初始化容器mysql_bridge,加入到自定義網絡test-bridge
docker run -d --name mysql_bridge --network test-bridge -e MYSQL_ROOT_PASSWORD=root mysql:5.7

ps:我們這裏的mysql服務沒有發佈端口,依然可以在bridge網絡內暴露使用

  1. 初始化容器redis_bridge,加入到自定義網絡test-bridge中,併發布端口6397
 docker run -d --name redis_bridge --network test-bridge -p  16397:6397 redis:5.0
  1. 檢查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
  1. 在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 即可顯示加入集羣的命令

  1. 在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章