Docker 安裝時會自動在 host 上創建三個網絡,我們可用 docker network ls 命令查看:
none 網絡
什么都沒有的網絡,沒有任何網卡。作用用于隔離一些安全要求高,但是不需要聯網的應用
host網絡
連接到 host 網絡的容器共享 Docker host 的網絡棧,容器的網絡配置與 host 完全一樣。可以通過 --network=host 指定使用 host 網絡。
brideg網絡
Docker 安裝時會創建一個 命名為 docker0 的 linux bridge。如果不指定--network,創建的容器默認都會掛到 docker0 上。
通過 docker network inspect bridge 查看 bridge 網絡的配置信息:
bridge 網絡配置的 subnet 就是 172.18.0.0/16,并且網關是 172.18.0.1。這個網關就是 docker0
自定義網絡
我們可通過 bridge 驅動創建類似前面默認的 bridge 網絡
docker network create --driver bridge my_net #創建
docker network inspect my_net 查看my_net 的配置信息
創建網段時指定 --subnet 和 --gateway 參數可自定義網段
docker network create --driver bridge --subnet 172.22.15.0/24 --gateway 172.22.15.1 my_net
容器要使用新的網絡,需要在啟動時通過 --network 指定,--ip可配置靜態ip
注:只有使用 --subnet 創建的網絡才能指定靜態 IP。
docker run -it --network=my_net --ip 172.22.15.22 busybox
容器間的連通性
同一網絡中的容器,網關之間都是可以通的
不同網橋間通信可以為 容器添加一塊 net_my的網卡。這個可以通過docker network connect 命令實現。
Docker DNS Server
docker daemon 實現了一個內嵌的 DNS server,使容器可以直接通過“容器名”通信,啟動時用 --name 為容器命名。
下面啟動兩個容器 bbox1 和 bbox2:
docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net --name=bbox2 busybox
然后,bbox2 就可以直接 ping 到 bbox1 了:
注:只能在自定義網絡中使用
joined 容器
joined 容器是另一種實現容器間通信的方式。
joined 容器非常特別,它可以使兩個或多個容器共享一個網絡棧,共享網卡和配置信息,joined 容器之間可以通過 127.0.0.1 直接通信。
先創建一個 httpd 容器,名字為 web1。
docker run -d -it --name=web1 httpd
然后創建 busybox 容器并通過 --network=container:web1 指定 jointed 容器為 web1:
docker run -it --network=container:web1 busybox
兩容器共享網絡棧
joined適用于
1.不同容器中的程序希望通過 loopback 高效快速地通信,比如 web server 與 app server。
2.希望監控其他容器的網絡流量,比如運行在獨立容器中的網絡監控程序。
外網
docker容器默認可以訪問外網,只要通過nat,外網可以利用端口映射訪問內部容器