docker的網絡(docker network指令詳解)
Docker的網絡子系統是可插拔的,使用驅動程序。默認情況下存在多個驅動程序,並提供核心網絡功能:
- bridge:docker默認的網絡驅動。如果未指定驅動程序,則這是需要創建的網絡類型。當應用程序在需要通信的獨立容器中運行時,通常會使用橋接網絡。
- host:對於獨立的容器,刪除容器和Docker主機之間的網絡隔離,並直接使用主機的網絡(若啟用特權容器,將可以直接修改宿主機網絡設置)。host僅適用於Docker 17.06及更高版本上的swarm群集服務。
- overlay:Overlay networks將多個Docker守護程序連接在一起,並使swarm群集服務能夠相互通信
- macvlan:Macvlan網絡允許為容器分配MAC地址,使其顯示為網絡上的物理設備。Docker守護程序通過其MAC地址將流量路由到容器。macvlan在處理期望直接連接到物理網絡的傳統應用程序時,使用該驅動程序有時是最佳選擇,而不是通過Docker主機的網絡堆棧進行路由。
- none:對於此容器,禁用所有網絡。通常與自定義網絡驅動程序一起使用,none不適用於swarm集群服務。
選擇不同的場景:
- 當多個容器在同一個Docker主機上進行通信時,用戶定義的橋接網絡是最佳選擇。
- 當網絡堆棧不應與Docker主機隔離時,主機網絡最佳,但您希望隔離容器的其他方面。
- 不同Docker主機上運行的容器進行通信時,或當多個應用程序使用swarm服務協同工作時,覆蓋網絡overlay是最佳選擇。
- 當您從VM設置遷移或需要您的容器看起來像網絡上的物理主機(每個都具有唯一的MAC地址)時,Macvlan網絡是最佳的。
- 第三方網絡插件允許您將Docker與專用網絡堆棧集成
bridge網絡
橋接網絡適用於在同一個Docker守護程序宿主機上運行的容器之間通信。
對於在不同Docker
啟動Docker時,會自動創建默認橋接網絡(也稱為bridge),並且除非另行指定,否則新啟動的容器將連接到該橋接網絡。還可以創建用戶自定義網橋,用戶定義的網橋優於默認bridge網橋
用戶定義的網橋與默認網橋之間的差異:
- 用戶定義的橋接網絡可在容器化應用程序之間提供更好的隔離和互操作性。
連接到同一個用戶自定義的網橋的容器會自動將所有端口相互暴露(互操作性),而不會向外界顯示任何端口
- 用戶定義的橋接器在容器之間提供自動DNS解析
默認網橋上的容器只能通過IP地址相互訪問(或啟動容器時使用--link選項連接到另一個容器,這樣兩個容器也可相互通信,不推薦再使用)。在用戶定義的橋接網絡上,容器可以通過主機名相互解析
- 容器可以在運行中隨時與用戶自定義的bridge網絡連接和分離
在容器的生命周期中,可以動態地將其與用戶自定義的網絡連接或斷開。而從默認橋接網絡中刪除容器,則需要停止容器並使用不同的網絡選項重新創建容器
- 每個用戶定義的網絡都會創建一個可配置的網橋
如果容器使用默認橋接網絡,則可以對其進行配置,但所有容器都使用相同的設置,如MTU和iptables規則。此外,配置默認橋接網絡發生在Docker服務之外,並且需要重新啟動Docker。
- 默認橋接網絡上的相互鏈接容器(使用--link選項互聯)共享環境變量。
最初,在兩個容器之間共享環境變量的唯一方法是使用--link選項鏈接,用戶定義的網絡無法實現這種類型的變量共享,但有更好的方法來共享環境變量:
- 多個容器可以使用Docker volume掛載包含共享信息的文件或目錄。
- 可以使用docker-compose一起啟動多個容器,並且compose文件可以定義共享變量。
- 可以使用swarm服務而不是獨立容器,並利用secrets和configs共享。
使用docker network create創建和配置用戶定義的網橋。如果不同的應用程序組具有不同的網絡要求,則可以在創建時單獨配置每個用戶定義的網橋。
1、管理用戶自定義網絡
docker network create \
--subnet 172.20.0.1/16 \
--ip-range 172.20.0.1/24 \
--gateway 172.20.0.1 \
my-net
可以指定子網,IP地址範圍,網關和其他選項
docker network rm my-net #刪除用戶定義的橋接網絡
當創建或刪除用戶定義的網橋或從用戶定義的網橋連接或斷開容器時,Docker使用特定於操作系統的工具來管理底層網絡基礎結構(例如iptables在Linux上添加或刪除網橋設備或配置規則)
2、將容器連接到用戶定義的橋
創建新容器時,可以指定一個或多個--network標誌
此示例將Nginx容器連接到my-net網絡。它還將容器中的端口80發布到Docker宿主機上的端口8080,因此外部客戶端可以訪問該端口8080。連接到my-net網絡的任何其他容器都可以訪問my-nginx容器上的所有端口,反之亦然。
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
docker run
若要將正在運行的容器連接到現有的用戶定義的橋,使用docker network connect命令(被連接的自定義bridge網絡在創建時必須有--attachable選項,而默認的bridge網絡默認可以被其他容器連接)
以下命令將已在運行的my-nginx容器連接到已存在的my-net網絡:
$ docker network connect my-net my-nginx
要斷開正在運行的容器與用戶定義的橋接器的連接,使用docker network disconnect命令。
以下命令將my-nginx容器與my-net網絡斷開連接。
$ docker network disconnect my-net my-nginx
示例:
docker network inspect bridge
docker run -itd --name alpine1 alpine
docker run -itd --name alpine2 alpine
docker network inspect bridge
進入兩個容器中分別使用ip地址(通)、容器名(不通)、主機名(自己通,其他不通)互ping
docker container stop alpine1 alpine2
docker container rm alpine1 alpine2
快捷鍵:Ctrl+P+Q(在使用docker attach進入容器後退出容器,不不關閉容器,容器將繼續運行)
docker run -dit --name alpine1 --network my-net alpine
docker run -dit --name alpine2 --network my-net alpine
docker run -dit --name alpine3 alpine
docker run -dit --name alpine4 --network my-net alpine
此時進入alpine4中ping 各個容器的IP、主機名、容器名:
alpine4和alpine1及alpine2之間均是通的
alpine4和alpine3均不通
docker network connect bridge alpine4 #讓alpine4連接到bridge網絡上
此時進入alpine4 ping各個容器的IP、主機名、容器名:
alpine4和alpine1及alpine2之間均是通的
alpine4可ping通alpine3的IP,ping不通alpine3容器的容器名和主機名
由以上說明:
使用默認的bridge各個容器只能使用IP互通
使用自定義的bridge各個容器的IP、主機名、容器名均可互通
docker network disconnect my-net alpine4
docker container stop alpine1 alpine2 alpine3 alpine4
docker container rm alpine1 alpine2 alpine3 alpine4
docker network rm my-net
啟用從Docker容器轉發到外部網絡
默認情況下,來自連接到默認網橋的容器的流量不會轉發到外部(即容器的流量不能到達外網)。宿主機啟用轉發,需要更改兩個設置。這些不是Docker命令,它們會影響Docker主機的內核。
- 配置Linux內核以允許IP轉發。
$ sysctl net.ipv4.conf.all.forwarding=1
- 將策略的iptables FORWARD策略更改DROP為ACCEPT。
$ sudo iptables -P FORWARD ACCEPT
docker的網絡(docker network指令詳解)