溫馨提示×

溫馨提示×

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

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

Docker怎么配置固定IP及橋接

發(fā)布時間:2022-05-26 16:24:17 來源:億速云 閱讀:409 作者:iii 欄目:大數(shù)據(jù)

今天小編給大家分享一下Docker怎么配置固定IP及橋接的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、docker的四種網(wǎng)絡(luò)模式

docker在創(chuàng)建容器時有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時使用--net去指定。

  1. bridge模式,使用--net=bridge指定,默認(rèn)設(shè)置。

  2. none模式,使用--net=none指定。

  3. host模式,使用--net=host指定。

  4. container模式,使用--net=container:容器名稱或id指定。(如:--net=container:30b668ccb630)

bridge模式:docker網(wǎng)絡(luò)隔離基于網(wǎng)絡(luò)命名空間<network namespace>,在物理機上創(chuàng)建docker容器時會為每一個docker容器分配網(wǎng)絡(luò)命名空間,并且把容器ip橋接到物理機的虛擬網(wǎng)橋上。

none模式:此模式下創(chuàng)建容器是不會為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、ip、通信路由等,全部需要自己去配置。

host模式:此模式創(chuàng)建的容器沒有自己獨立的網(wǎng)絡(luò)命名空間,是和物理機共享一個network namespace,并且共享物理機的所有端口與ip,并且這個模式認(rèn)為是不安全的。

container模式:此模式和host模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的ip和端口而不是物理機,此模式容器自身是不會配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會發(fā)現(xiàn)里邊的ip是你所指定的那個容器ip并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等。

二、docker配置自己的網(wǎng)橋

例子一、

1)、自定義新網(wǎng)橋

root@docker:~# dpkg -l | grep bridge*    #查看是否有安裝brctl命令包
ii bridge-utils 1.5-6ubuntu2  amd64    utilities for configuring the linux ethernet bridge

root@docker:~# apt-get install bridge-utils #安裝brctl命令包

root@docker:~# docker -v          #docker版本

docker version 1.5.0, build a8a31ef

root@docker:~# ps -ef | grep docker     #正在運行 
root   6834  1 0 16:28 ?    00:00:00 /usr/bin/docker -d

root@docker:~# service docker stop     #停止


root@docker:~# ifconfig | grep docker0   #docker默認(rèn)網(wǎng)橋
docker0 link encap:以太網(wǎng) 硬件地址 56:84:7a:fe:97:99

root@docker:~# ifconfig docker0 down    #停止docker默認(rèn)網(wǎng)橋

root@docker:~# brctl show          #查看物理機上有哪些網(wǎng)橋

root@docker:~# brctl delbr docker0     #刪除docker默認(rèn)網(wǎng)橋

root@docker:~# brctl addbr docker_new0   #自定義網(wǎng)橋

root@docker:~# ifconfig docker_new0 192.168.6.1 netmask 255.255.255.0  #給自定義網(wǎng)橋指定ip和子網(wǎng)

root@docker:~# ifconfig | grep docker_new0 #查看發(fā)現(xiàn)自定義網(wǎng)橋已經(jīng)啟動
docker_new0 link encap:以太網(wǎng) 硬件地址 0a:5b:26:48:dc:04 
     inet 地址:192.168.6.1 廣播:192.168.6.255 掩碼:255.255.255.0

root@docker:~# echo 'docker_opts="-b=docker_new0"' >> /etc/default/docker #指定網(wǎng)橋?qū)懭雂ocker配置文件

root@docker:~# service docker start     #啟動docker

root@docker:~# ps -ef | grep docker     #成功啟動,并且成功加載了docker_new0
root  21345  1 0 18:44 ?    00:00:00 /usr/bin/docker -d -b=docker_new0

root@docker:~# brctl show          #查看當(dāng)前網(wǎng)橋下是否有容器連接
bridge name       bridge id       stp enabled  interfaces
docker_new0      8000.fa3ce276c3b9      no      

root@docker:~# docker run -itd centos:centos6 /bin/bash         #創(chuàng)建容器測試

root@docker:~# docker attach 7f8ff622237f                #進(jìn)入容器

[root@7f8ff622237f /]# ifconfig eth0 | grep addr             #容器ip已經(jīng)和自定義網(wǎng)橋一個網(wǎng)段,該容器ip為dhcp自動分配,不屬于指定固定ip
eth0   link encap:ethernet hwaddr 02:42:c0:a8:06:02 
     inet addr:192.168.6.2 bcast:0.0.0.0 mask:255.255.255.0
     inet6 addr: fe80::42:c0ff:fea8:602/64 scope:link

root@docker:~# brctl show          #該網(wǎng)橋上已經(jīng)連接著一個網(wǎng)絡(luò)設(shè)備了
bridge name        bridge id       stp enabled  interfaces
docker_new0      8000.fa3ce276c3b9      no     veth17f560a

注:veth設(shè)備是成雙成對出現(xiàn)的,一端是容器內(nèi)部命名eth0,一端是加入到網(wǎng)橋并命名的veth17f560a(通常命名為veth*),他們組成了一個數(shù)據(jù)傳輸通道,一端進(jìn)一端出,veth設(shè)備連接了兩個網(wǎng)絡(luò)設(shè)備    并實現(xiàn)了數(shù)據(jù)通信。

root@docker:~# wget https://github.com/jpetazzo/pipework/archive/master.zip #下載 pipework

root@docker:~# unzip master.zip      #解壓

root@docker:~# cp pipework-master/pipework /usr/bin/           #拷貝pipework到 /usr/bin/下

root@docker:~# chmod +x /usr/bin/pipework  #賦予該命令執(zhí)行權(quán)限

root@docker:~# pipework docker_new0 -i eth1 $(docker run -itd -p 9197:80 centos:centos6 /bin/bash) 192.168.6.27/24@192.168.6.1 #創(chuàng)建容器,并指定固定ip
格式:pipework 網(wǎng)橋名 -i 指定在那塊網(wǎng)卡上配置 <容器名or容器id> 指定容器內(nèi)ip/子網(wǎng)@網(wǎng)關(guān) 注:容器內(nèi)網(wǎng)關(guān)就是物理機網(wǎng)橋的ip       

 

root@docker:~# docker attach 2966430e2dbe  #進(jìn)入新容器
 

[root@2966430e2dbe /]# ifconfig       #容器內(nèi)ip為指定的ip 192.168.6.27
eth0   link encap:ethernet hwaddr 02:42:c0:a8:06:05          
     inet addr:192.168.6.7 bcast:0.0.0.0 mask:255.255.255.0    #docker_new0網(wǎng)橋創(chuàng)建容器時dhcp分配的ip


eth1   link encap:ethernet hwaddr 82:db:f7:a3:33:92 
     inet addr:192.168.6.27 bcast:0.0.0.0 mask:255.255.255.0    #pipework指定的固定ip,網(wǎng)橋還是docker_new0


[root@2966430e2dbe /]# route -n       #查看路由路徑
kernel ip routing table
destination  gateway    genmask    flags metric ref  use iface
0.0.0.0    192.168.6.1  0.0.0.0    ug  0   0    0 eth0
192.168.6.0  0.0.0.0    255.255.255.0 u  0   0    0 eth0
192.168.6.0  0.0.0.0    255.255.255.0 u  0   0    0 eth1


[root@2966430e2dbe /]# ping www.linuxidc.com  #測試網(wǎng)絡(luò)
ping www.linuxidc.com (119.75.218.70) 56(84) bytes of data.
64 bytes from 119.75.218.70: icmp_seq=1 ttl=127 time=3.98 ms
64 bytes from 119.75.218.70: icmp_seq=2 ttl=127 time=2.98 ms


[root@2966430e2dbe /]# netstat -anptu | grep 80               #容器內(nèi)80端口已經(jīng)開啟
tcp    0   0 :::80           :::*            listen   -

root@docker:~# telnet 192.168.6.27 80    #物理機上測試指定的ip是否和映射的端口等通信正常
trying 192.168.6.27...
connected to 192.168.6.27.
escape character is '^]'.

root@docker:~# iptables-save > iptables-rules #拷貝防火墻規(guī)則到本地文件

root@docker:~# vi iptables-rules       #打開規(guī)則文件查看你會發(fā)現(xiàn)你物理機的防火墻自動添加了很多條規(guī)則,這個是容器到網(wǎng)橋到本地網(wǎng)卡到公網(wǎng)的地址轉(zhuǎn)換通信規(guī)則

Docker怎么配置固定IP及橋接

例子二:

首先,配置一個用于創(chuàng)建container interface的網(wǎng)橋,可以使用ovs,也可以使用linux bridge,以linux bridge為例:

br_name=docker
brctl addbr $br_name
ip addr add 192.168.33.2/24 dev $br_name
ip addr del 192.168.33.2/24 dev em1
ip link set $br_name up
brctl addif $br_name eth0

接著,可以啟動容器了,注意用--net=none方式啟動:

# start new container
hostname='docker.test.com'
cid=$(docker run -d -i -h $hostname --net=none -t centos)
pid=$(docker inspect -f '{{.state.pid}}' $cid)

下面,為該容器配置網(wǎng)絡(luò)namespace,并設(shè)置固定ip:

# set up netns
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
# set up bridge
ip link add q$pid type veth peer name r$pid
brctl addif $br_name q$pid
ip link set q$pid up
# set up docker interface
fixed_ip='192.168.33.3/24'
gateway='192.168.33.1'
ip link set r$pid netns $pid
ip netns exec $pid ip link set dev r$pid name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $fixed_ip dev eth0
ip netns exec $pid ip route add default via 192.168.33.1

這樣,容器的網(wǎng)絡(luò)就配置好了,如果容器內(nèi)部開啟了sshd服務(wù),通過192.168.33.3就可以直接ssh連接到容器,非常方便。上面的步驟比較長,可以借助pipework來為容器設(shè)置固定ip(除了設(shè)置ip,還封裝了配置網(wǎng)關(guān)、macvlan、vlan、dhcp等功能):

pipework docker0 be8365e3b2834 10.88.88.8/24

那么,當(dāng)容器需要刪除的時候,怎么清理網(wǎng)絡(luò)呢,其實也很簡單:

# stop and delete container
docker stop $cid
docker rm $cid
# delete docker's net namespace (also delete veth pair)
ip netns delete $pid

以上就是“Docker怎么配置固定IP及橋接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

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

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

AI