您好,登錄后才能下訂單哦!
Docker 中的網絡功能介紹
默認情況下,容器可以建立到外部網絡的連接,但是外部網絡無法連接到容器。
Docker 允許通過外部訪問容器或容器互聯的方式來提供網絡服務
外部訪問容器:
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 參數來指定端口映射。
實驗環境:
Centos7 運行一個容器,提供web服務和ssh服務
宿主機啟用路由轉發(net.ipv4.ip_forward=1)
實驗步驟:
之前已經創建好鏡像啦
執行docker p_w_picpaths查看新生成的鏡像
當使用–P(大寫)標記時,Docker 會隨機映射一個隨機的端口到內部容器開放的網絡端口。
注:-P使用時需要指定--expose選項或dockerfile中用expose指令容器要暴露的端口,指定需要對外提供服務的端口
使用 docker ps 可以看到,本地主機的32770被映射到了容器的22端口,本地主機的32769被映射到了容器的80端口,本地主機的32768被映射到了容器的443 端口
此時訪問本機的 32770端口即可訪問容器內 ssh 應用
查看容器運行的httpd進程
注:192.168.190.128是宿主機目錄
此時訪問本機的 32769端口即可訪問容器內 web 應用
-p(小寫)則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器
注意:
容器有自己的內部網絡和 ip 地址(使用 docker inspect 可以獲取所有的變量。)
-p 標記可以多次使用來綁定多個端口
映射所有接口地址:
使用 hostPort:containerPort 格式,將本地的10111端口映射到容器的 22 端口,本地的801端口映射到容器的80端口可以執行
測試訪問:
1)ssh測試:
使用xshell工具:
測試web訪問
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式,指定映射使用一個特定地址
映射到指定地址的任意端口
使用 ip::containerPort 綁定192.168.190.128的任意端口到容器的80端口,本地主機會自動分配一個口。--name為啟動的容器指定一個容器名
使用 docker port 來查看當前映射的端口配置,也可以查看到綁定的地址
Docker NAT iptables實現
默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器
容器訪問外部實現
容器所有到外部網絡的連接,源地址都會被 NAT 成本地系統的 IP 地址(即docker0地址)。這是使用 iptables 的源地址偽裝操作實現的
查看主機的 NAT 規則
外部訪問容器實現
容器允許外部訪問,可以在 docker run 時候通過 -p 或 -P 參數來啟用,不管用那種辦法,其實也是在本地的 iptable 的 nat 表中添加相應的規則
使用 -P 時
iptables -t nat –nvL
使用 -p 80:80 時
iptables -t nat –nvL
docker0 網橋
Docker服務默認會創建一個 docker0 網橋(其上有一個 docker0 內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網絡。
Docker 默認指定了 docker0 接口的 IP 地址和子網掩碼,讓主機和容器之間可以通過網橋相互通信
由于目前 Docker 網橋是 Linux 網橋,用戶可以使用 brctl show 來查看網橋和端口連接信息
注:brctl 命令在centos中可以使用yum install bridge-utils 來安裝
每次創建一個新容器的時候,Docker 從可用的地址段中選擇一個空閑的 IP 地址分配給容器的 eth0端口。使用本地主機上 docker0 接口的 IP 作為所有容器的默認網關
Docker 網絡配置
Docker 四種網絡模式
docker run 創建 Docker 容器時,可以用 --net 選項指定容器的網絡模式,Docker 有以下 4 種網絡模式:
host 模式,使用 --net=host 指定。
container 模式,使用 --net=container:NAMEorID 指定。
none 模式,使用 --net=none 指定。
bridge 模式,使用 --net=bridge 指定,默認設置
host 模式
如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 NetworkNamespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。
例如,我們在192.168.190.128/24 的機器上用 host 模式啟動一個含有 web 應用的 Docker 容器,監聽 tcp 80 端口。當我們在容器中執行任何類似 ifconfig 命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用192.168.190.128:80 即可,不用任何 NAT 轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
啟動容器前,執行pgrep http查看宿主機httpd進程
上面顯示結果說明宿主機沒有httpd進程運行
用 host 模式啟動一個含有 web 應用的 Docker 容器
用瀏覽器訪問宿主機地址的80端口
注意防火墻
這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。
運行一個容器:查看容器的IP
將容器切換到后臺運行:ctrl+p ctrl+q
在運行一個容器使用container模式:查看新容器的地址
將這個網絡設備加入到docker0網橋中,可以通過brctl show命令查看;從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。
容器內部訪問外網以及容器和主機之間的端口映射都是通過Iptables實現的,可以查看Iptables表分析。
查看當前 docker0地址
在容器運行時,每個容器都會分配一個特定的虛擬機口并橋接到 docker0。每個容器都會配置同 docker0 ip 相同網段的專用 ip 地址,docker0 的 IP 地址被用于所有容器的默認網關。
運行一個容器
并且查看
通過brctl show命令查看
執行docker network inspect bridge查看橋接網絡的詳細信息
除了默認的 docker0 網橋,用戶也可以指定網橋來連接各個容器。在啟動 Docker 服務的時候,使用 -b BRIDGE 或 --bridge=BRIDGE 來指定使用的網橋。
Docker 允許你管理 docker0 橋接或者通過-b選項自定義橋接網卡,需要安裝bridge-utils軟件包。
基本步驟如下:
1.確保 docker 的進程是停止的
2.創建自定義網橋
3.給網橋分配特定的 ip
4.以 -b 的方式指定網橋
具體操作步驟:
如果服務已經運行,那需要先停止服務,并刪除舊的網橋
然后創建一個網橋 bridge0,給網橋分配特定的 ip
查看確認網橋創建并啟動
(兩種方法)
修改/etc/sysconfig/docker文件
添加 –b=bridge0
啟動 Docker 服務
新建一個容器,可以看到它已經橋接到了 bridge0 上
進入容器,查看容器的IP
docker 服務啟動成功并綁定容器到新的網橋,新建一個容器,你會看到它的 ip 是我們的設置的新 ip段, docker 會自動檢測到它。用 brctl show 可以看到容器啟動或則停止后網橋的配置變化,在容器中使用 ip a和 ip r 來查看 ip 地址配置和路由信息。
下面通過配置一個以 --net=none 啟動的容器,使他達到跟平常一樣具有訪問網絡的權限。來介紹docker 是如何連接到容器中的。
啟動一個運行 /bin/bash的容器,并指定 --net=none
再開啟一個新的終端,查找這個容器的進程 id ,然后創建它的命名空間,后面的 ip netns 會用到
檢查橋接網卡的 ip 和子網掩碼
創建一對” peer“接口A 和 B ,綁定 A 到網橋,并啟用它
將 B 放到容器的網絡命名空間,命名為 eth0, 配置一個空閑的 ip
可以使用網絡了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。