<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Docker開啟IPv6

馬哥Linux運維 ? 來源:rectcircle.cn ? 2023-01-10 09:24 ? 次閱讀

背景知識

Docker 網絡

在 Docker 中,網絡是一個重要抽象。一個 Docker 可以有多個網絡,每個容器可以連接到一個或多個中。

docker 安裝完成后,會自動創建三個網絡,分別是 bridge、host 和 none。通過 docker network ls 命令可以查看:

NETWORKIDNAMEDRIVERSCOPE
11da7fc827b4bridgebridgelocal
4cd2eae9c4cdhosthostlocal
12730ca5becanonenulllocal

其中名字為 bridge 的 bridge 類型網絡,就是 docker 的默認網絡(docker run 默認使用的網絡)。

默認網絡的實現是在宿主機環境創建一個名為 docker0 的 bridge 設備,并為其配置一個私有網段的網關 IP 地址。通過 ip addr show docker0 可以查看更該設備信息。

3:docker0:mtu1500qdiscnoqueuestateUPgroupdefault
link/ether02xxxx:xxbrdffffff:ff
inet172.17.0.1/16brd172.17.255.255scopeglobaldocker0
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

docker bridge 網絡,在 IPv4 場景下拓撲如下所示(來自于:KVM + LinuxBridge 的網絡虛擬化解決方案實踐):

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|Host|Container1|Container2|
||||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
||NewworkProtocolStack|||NewworkProtocolStack|||NewworkProtocolStack||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
|↑↑|↑|↑|
|............|.............|.....................................|...................|.....................|....................|....................|
|↓↓|↓|↓|
|+------++--------+|+-------+|+-------+|
||.3.101||.9.1|||.9.2|||.9.3||
|+------++--------++-------+|+-------+|+-------+|
||eth0||br0|<--->|veth|||eth0|||eth0||
|+------++--------++-------+|+-------+|+-------+|
|↑↑↑|↑|↑|
|||+-------------------------------------------+|||
||↓||||
||+-------+||||
|||veth|||||
||+-------+||||
||↑||||
||+-------------------------------------------------------------------------------|--------------------+|
|||||
|||||
|||||
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
↓
PhysicalNetwork(192.168.3.0/24)

通過 docker network inspect bridge 可以查看某該默認網絡配置:

[
{
"Name":"bridge",
"Id":"11da7fc827b4dxxx",
"Created":"2021-11-22T1203.408536176+08:00",
"Scope":"local",
"Driver":"bridge",
"EnableIPv6":false,
"IPAM":{
"Driver":"default",
"Options":null,
"Config":[
{
"Subnet":"172.17.0.0/16",
"Gateway":"172.17.0.1"
}
]
},
"Internal":false,
"Attachable":false,
"Ingress":false,
"ConfigFrom":{
"Network":""
},
"ConfigOnly":false,
"Containers":{
"0d744147030829f0247xx":{
"Name":"container1",
"EndpointID":"6f539a054ae35cbxx",
"MacAddress":"02xxxx:xx",
"IPv4Address":"172.17.0.14/16",
"IPv6Address":""
},
},
"Options":{
"com.docker.network.bridge.default_bridge":"true",
"com.docker.network.bridge.enable_icc":"true",
"com.docker.network.bridge.enable_ip_masquerade":"true",
"com.docker.network.bridge.host_binding_ipv4":"0.0.0.0",
"com.docker.network.bridge.name":"docker0",
"com.docker.network.driver.mtu":"1500"
},
"Labels":{}
}
]

可以通過 docker network create 命令,創建一個自定義 bridge 網絡。關于,默認網絡和自定義 bridge,有如下不同:

自定義 bridge 網絡會使用 docker 內嵌的 dns server 服務,配置地址為 127.0.0.11,通過 iptables 轉發到 43747 端口。因此可以直接通過 container name 訪問同一個自定義網絡下的其他容器網絡。而默認網絡則不支持。

自定義 bridge 有更好的隔離性。

一個容器可以在運行時動態的連接/斷開一個自定義 bridge,默認網絡只能重新創建。

自定義 bridge 可以在創建的時候配置 Linux bridge,如果要修改默認網絡的 bridge 則需要重啟 docker daemon。因此,官方更推薦在生產環境使用自定義 bridge 而非默認網絡。

默認網絡支持 IPv6

本章節介紹的是如何配置默認的 bridge 網絡支持 ipv6。(未經過測試,僅供參考)

前置條件:確保自己的設備被分配了一個 IPv6。通過 ip addr show 查看當前設備的 IPv6。其輸出的物理網卡存在包含 inet6 和 scope global 的行時,表示該網卡支持 IPv6。需要注意的是:其 IPv6 地址的前綴不能是 /128,如果是 /128,建議通過 IPv6NAT 方式去支持 IPv6。

2:eth0:mtu1500qdiscmqstateUPgroupdefaultqlen1000
link/etherfaxxxx:xxbrdffffff:ff
inet10.227.8.141/22brd10.227.11.255scopeglobaleth0
valid_lftforeverpreferred_lftforever
inet62xxx:xxxx/64scopeglobal
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

修改 /etc/docker/daemon.json,其中 fixed-cidr-v6 是上一步獲取到的 IPv6 網段的子網(配置默認網絡,前綴長度最大為 /80)。

{
"ipv6":true,
"fixed-cidr-v6":"2xxx:/80"
}

reload 配置,docker daemon 將會使用 IPv6 網絡。

sudosystemctlreloaddocker

通過 docker network inspect bridge 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

注意經測試,如下場景可能不會生效:

/etc/docker/daemon.json 存在 "live-restore": true 字段。

reload 時有容器仍然存在。

根據眾多博客的說法,還需如下兩步:

/etc/sysctl.conf 添加,并執行 sysctl -f,配置宿主機和 docker0 網卡支持 NDP proxy。

#docker0是docker默認的網橋(bridge)
net.ipv6.conf.docker0.proxy_ndp=1
#eth0表示物理網卡,注意替換為物理網卡
net.ipv6.conf.eth0.proxy_ndp=1

默認的 ndp 鄰居發現配置僅允許單個 IP 配置。需要安裝 ndppd 服務來轉發鄰居發現消息(這一步還有一個替代方案:手動為每一個容器配置如:ip -6 neigh add proxy 2xxx:1 dev ens3,其中,2xxx:1 為容器的分配的 IPv6,ens3 為宿主機綁定 IPv6 的網卡)。

apt-getupdate-y
apt-getinstall-yndppd
cp/usr/share/doc/ndppd/ndppd.conf-dist/etc/ndppd.conf

更改 proxy eth0 { 行到宿主機綁定 IPv6 的網卡,如:proxy ens3 {。更改 rule 1111:: { 行為需要暴露的網段 2xxx:/80 {。最后執行 systemctl restart ndppd

注意:

本方法僅針對新裝 Docker 場景

本章節 和 自定義網絡支持 IPv6 配置的 IPv6 和 docker 默認 IPv4 是不同的。容器的 IPv6 用的不是私有網段,而是宿主機網絡或者是宿主機網絡的一個子網。因此,宿主機所在的網絡的所有實例可以直接通過 IPv6 的地址。也就是說:容器的所有端口對于 IPv6 來說都是公開的,而無需 public。而容器的 IPv4 分配的是私有網段,因此,容器網段和宿主機網段是通過 NAT 轉發數據的,因此宿主機所在網絡的其他實例是無法直接訪問容器。也就是說:容器的所有端口對于 IPv4 來說都是私有的,需 public 到 host 網絡才能被外部訪問到。

自定義網絡支持 IPv6

本章節介紹的是如何創建一個支持 IPv6 的 bridge 網絡。(未經過測試,僅供參考)

前置條件:確保自己的設備被分配了一個 IPv6。

創建一個支持 IPv6 的 bridge 網絡。其中 --subnet 參數為上一步獲取到的 IPv6 網段的子網(自定義 bridge 網絡,前綴長度不限制,可以大于于 80)。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="2xxx:/80"

通過 docker network inspect my-net-ipv6 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

創建容器時,通過 --network my-net-ipv6 參數,給容器開啟 IPv6 網絡,如 docker run --network my-net-ipv6 -it busybox ip addr show,可以看到,網卡被分配了 IPv6 地址。

通過 IPv6NAT 方式支持 IPv6

測試可行,推薦使用該方式。

上文也提到,上文展示的方案,容器獲得的 IPv6 IP 并不是私有網絡 IP,是和外部網絡直接連通,而不會經過 NAT。在如下場景下,以上方式可能不能滿足要求:

安全性,要求容器的網絡是私有的,需要容器的網絡行為和 Docker IPv4 的行為一致,只有特定端口才能訪問。

宿主機處于一個很小范圍的網段(前綴大于 /80),如 xxx::xx/128,沒有多余的 IPv6 可以分給容器。此時就需要,給容器配置一個私有 IPv6 網段,并啟用 NAT。

但是 Docker 官方并沒有內置 IPv6 的 NAT,如果想要使用 IPv6 NAT,需要安裝外掛的 IPv6 啟動,參見:https://github.com/robbertkl/docker-ipv6nat。

有這些準備后,實施步驟如下所示:

使用如下命令,后臺啟動 IPv6 NAT(通過 --restart always 配置了開機自啟)。

dockerrun-d--nameipv6nat--privileged--networkhost--restartalways-v/var/run/docker.sock:/var/run/docker.sock:ro-v/lib/modules:/lib/modules:rorobbertkl/ipv6nat

和 自定義網絡支持 IPv6 類似,創建一個支持 IPv6 的 bridge 網絡。其中 --subnet 參數為 fe80::/10 的一個子網。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="fd00:1/80"--gateway="fd00:1"

通過 docker network inspect my-net-ipv6 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

創建容器時,通過 --network my-net-ipv6 參數,給容器開啟 IPv6 網絡,如 docker run --network my-net-ipv6 -it busybox sh:

ip addr show ,可以看到,網卡被分配了 IPv6 地址。 wget https://ipv6.icanhazip.com -O /dev/stdout 2>/dev/null 可以看到出網 IPv6 地址。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網絡
    +關注

    關注

    14

    文章

    7280

    瀏覽量

    87716
  • IPv6
    +關注

    關注

    6

    文章

    632

    瀏覽量

    59044
  • 容器
    +關注

    關注

    0

    文章

    482

    瀏覽量

    21924
  • 命令
    +關注

    關注

    5

    文章

    638

    瀏覽量

    21863
  • Docker
    +關注

    關注

    0

    文章

    441

    瀏覽量

    11655

原文標題:Docker 開啟 IPv6

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STMCUBE如何設置IPV6地址?

    小弟最近在學習開發STMCUBE,請問遇到一個問題,STMCUBE 在設置LWIP關于IPV6配置的時候,如何設置IPV6地址,我在電腦PING IPV6的時候,PING哪個地址
    發表于 04-18 07:41

    3種開啟寬帶IPv6的方法,免費得IPV6公網地址,免費看IPTV直播

    IPv6
    jf_97106930
    發布于 :2023年05月19日 12:22:13

    TP的ap+ac怎么開啟ipv6,體驗ipv6地址?#ipv6 #全屋wifi

    IPv6網絡通信
    jf_97106930
    發布于 :2023年05月19日 19:22:44

    IPv6地址是什么,IPv6的意思

    IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為“互聯網協議”。它是IETF設計的用于替代現行版本IP協議-IPv4-的下一代IP
    發表于 01-25 16:39

    IPv6技術培訓資料 ppt下載

    IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為“互聯網協議”。IPv6是IETF(互聯網工程任務組,Internet
    發表于 02-15 17:00

    基于IPv6的Winsock網絡編程

    Protocol”,1995年底確定了IPng的協議規范,并稱為“IP版本6”,即IPv6。0 IPv6概述IPv6指的是網絡協議版本6,
    發表于 05-08 06:14

    阿里云企業IPv6部署方案

    )DDoS公網的安全防護也是客戶不得不考慮的問題之一,因此在IPv6發布的第一天,阿里云就已經支持v6的DDoS功能,默認對客戶開啟基礎免費版本。六、客戶解決方案下面兩個場景主要是對第一期遷移任務提出的,由于
    發表于 07-09 16:18

    IPv6如何啟用和測試/驗證功能

    在WICE中是否有任何額外的步驟來支持IPv6?我對IPv6是新的,所以我真的不知道從哪里開始測試IPv6功能。當我的應用程序啟動時,無論是在FrReToS+LWIP還是
    發表于 09-26 10:25

    IPv6的特色應用

    業務匱乏一直是制約IPv6發展的重要因素。隨著移動互聯網的發展,IPv6的特色應用業務漸漸浮出水面。1 IPv6與家庭網絡“家庭網絡”已經成為全業務運營商大力發展家庭用戶的重要業務舉措。然而,由于
    發表于 07-15 08:18

    怎樣去部署IPv6園區網?求過程

    IPv6園區網的整體結構是如何構成的?怎樣去部署IPv6園區網?
    發表于 05-27 07:06

    IPv6相對于IPv4 WinSock的改變是什么?

    IPv6相對于IPv4 WinSock的改變是什么?兼容IPv4與IPv6的WinSock網絡編程規則是什么?IPv4與
    發表于 05-31 07:09

    請教下怎么配置來支持IPV6

    現在板子使用ipv4沒有問題,想增加ipv6的支持。根據《RT-Thread編程指南》里面關于ipv6的部分配置過但是不能使用,2019-01-01版本。文檔里面的lwIP還是在
    發表于 09-21 11:22

    IPv6,IPv6的應用,IPv6的原理是什么?

    IPv6,IPv6的應用,IPv6的原理是什么? IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為“互聯網協議”。
    發表于 03-29 17:19 ?2011次閱讀

    ipv6功能有什么用 ipv6開啟好還是關閉好

    。本文將探討IPv6的功能,以及為什么開啟IPv6可能更好。 IPv6的功能: 擴展地址空間:IPv6的主要功能是擴展地址空間,由于
    的頭像 發表于 02-05 10:06 ?1.4w次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>