溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

docker容器如何分配靜態(tài)IP

發(fā)布時間:2022-05-26 15:14:00 來源:億速云 閱讀:718 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“docker容器如何分配靜態(tài)IP”,在日常操作中,相信很多人在docker容器如何分配靜態(tài)IP問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”docker容器如何分配靜態(tài)IP”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

默認(rèn)情況下啟動容器的時候,docker容器使用的是bridge策略比如:

docker run -ti ubuntu:latest /bin/bash

等效于

docker run -ti --net=bridge ubuntu:latest /bin/bash

 bridge策略下,docker容器自動為我們分配了一個ip地址,并連接到docker0的網(wǎng)橋上。但這里有一個問題,這個ip地址并不是靜態(tài)分配的,這對我們的對容器的實(shí)例的網(wǎng)絡(luò)管理造成一了些困難。這里筆者并不想直接給出解決方案,因?yàn)槟菢幼硬]有什么卵用,理解原理,一步一步踏實(shí)走才是。

相信看過docker介紹的讀者都知道docker是借助于cgroup和namespace技術(shù)來實(shí)現(xiàn)資源控制和隔離的。在開始之前讀者需要去看一下linux上namespace的使用,本文并不想帶入太多的其它不相關(guān)的主題。好了現(xiàn)在假設(shè)你已經(jīng)了解namespace了,那你肯定想知道docker在網(wǎng)絡(luò)上是怎么利用namespace來做手腳的。大致過程應(yīng)該和下面的一致:(下面只是個人猜測,因?yàn)楣P者并沒有太多時間去研究它的源碼)

1、創(chuàng)建一個net namespace  netns1。

2、創(chuàng)建一對veth,將peer加入到netns1,將別一端接入到網(wǎng)橋bridge0中。

3、為這兩個veth分配ip。

4、用netns1啟動容器中的程序比如/bin/bash。

可惜的是,docker run并沒有一個選項(xiàng)讓我們?nèi)ブ付ㄋ峙涞膇p,因?yàn)榫W(wǎng)絡(luò)的確是個大難題。那就得自己動手豐衣足食了。

從上面我們知道,docker在網(wǎng)絡(luò)這里用到了net namespace,veth和網(wǎng)橋bridge。注意如果你意圖使用ip netns list去查看docker在啟動容器的時候使用了那個netns,你會失望地發(fā)現(xiàn)沒有對應(yīng)netns。其實(shí)并不是沒有,而是docker為了掩蓋一些細(xì)節(jié),在做完初始化工作后,docker便將這個netns從/var/run/netns中刪除了,我們完全可以用下面的方式讓它打回原形:

ln -s /proc/${container's pid}/ns/net /var/run/netns/${the's name you want to display}
ip netns list

好了,現(xiàn)在說一下我們給容器分配靜態(tài)ip的思路:

1、用--net=none方式啟動容器,這樣容器有了自己的namespace(這一步我們無法干預(yù)的,so let it go!)

2、獲取容器的進(jìn)程號pid,然后根據(jù)pid將它的net namespace打回原型。

3、創(chuàng)建一個bridge0,用brctl工具(可以通過安裝bridge-utils工具來實(shí)現(xiàn))。

4、創(chuàng)建一對veth:vethbridge,vethcontainer,將peer端vethcontainer加入到窗口的net namespace中,將vethbridge接入到bridge0中:brctl add...

5、設(shè)置vethcontainer的ip。

6、重啟容器的network service。

下面以我機(jī)器為例(deepin 2015 kernel 4.5.0)

1、 啟動容器:

docker容器如何分配靜態(tài)IP

2、獲取容器的進(jìn)程號:

docker容器如何分配靜態(tài)IP

3、根據(jù)進(jìn)程號將容器的net namespace打回原型:

docker容器如何分配靜態(tài)IP

4、創(chuàng)建網(wǎng)橋bridge0

docker容器如何分配靜態(tài)IP

5、創(chuàng)建veth,配置對應(yīng)的veth,最后重啟容器的network service

docker容器如何分配靜態(tài)IP

6、在容器中可以看到靜態(tài)分配的ip: 192.168.9.10

docker容器如何分配靜態(tài)IP

注意,現(xiàn)在容器還不能與主機(jī)通信,因?yàn)橹鳈C(jī)沒有到bridge的設(shè)備,如果需要和主機(jī)進(jìn)行通信的話可以添加一對veth,將一端接入bridge。如果容器需要我外部通信的話,可以通過啟用內(nèi)核轉(zhuǎn)發(fā),并在iptables中添加相應(yīng)的轉(zhuǎn)發(fā)規(guī)則。

到此,關(guān)于“docker容器如何分配靜態(tài)IP”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI