docker 指定IP地址、與主機(jī)同網(wǎng)段IP
首先講一下docker的網(wǎng)絡(luò)模式:
我們使用docker run創(chuàng)建容器時(shí),可以使用--net選項(xiàng)指定容器的網(wǎng)絡(luò)模式,docker一共有4中網(wǎng)絡(luò)模式:
1:bridge模式,--net=bridge(默認(rèn))。
這是dokcer網(wǎng)絡(luò)的默認(rèn)設(shè)置。安裝完docker,系統(tǒng)會(huì)自動(dòng)添加一個(gè)供docker使用的網(wǎng)橋docker0,我們創(chuàng)建一個(gè)新的容器時(shí),容器通過(guò)DHCP獲取一個(gè)與docker0同網(wǎng)段的IP地址。并默認(rèn)連接到docker0網(wǎng)橋,以此實(shí)現(xiàn)容器與宿主機(jī)的網(wǎng)絡(luò)互通。如下:
2:host模式,--net=host。
這個(gè)模式下創(chuàng)建出來(lái)的容器,將不擁有自己獨(dú)立的Network Namespace,即沒(méi)有獨(dú)立的網(wǎng)絡(luò)環(huán)境。它使用宿主機(jī)的ip和端口。
3:container模式,--net=container:NAME_or_ID。
這個(gè)模式就是指定一個(gè)已有的容器,共享該容器的IP和端口。除了網(wǎng)絡(luò)方面兩個(gè)容器共享,其他的如文件系統(tǒng),進(jìn)程等還是隔離開的。
4:none模式,--net=none。
這個(gè)模式下,dokcer不為容器進(jìn)行任何網(wǎng)絡(luò)配置。需要我們自己為容器添加網(wǎng)卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必須要在none模式下才可以
以下是幾種分配IP的方式:
一、pipework
首先講一下docker的網(wǎng)絡(luò)模式:
我們使用docker run創(chuàng)建容器時(shí),可以使用--net選項(xiàng)指定容器的網(wǎng)絡(luò)模式,docker一共有4中網(wǎng)絡(luò)模式:
1:bridge模式,--net=bridge(默認(rèn))。
這是dokcer網(wǎng)絡(luò)的默認(rèn)設(shè)置。安裝完docker,系統(tǒng)會(huì)自動(dòng)添加一個(gè)供docker使用的網(wǎng)橋docker0,我們創(chuàng)建一個(gè)新的容器時(shí),容器通過(guò)DHCP獲取一個(gè)與docker0同網(wǎng)段的IP地址。并默認(rèn)連接到docker0網(wǎng)橋,以此實(shí)現(xiàn)容器與宿主機(jī)的網(wǎng)絡(luò)互通。如下:
2:host模式,--net=host。
這個(gè)模式下創(chuàng)建出來(lái)的容器,將不擁有自己獨(dú)立的Network Namespace,即沒(méi)有獨(dú)立的網(wǎng)絡(luò)環(huán)境。它使用宿主機(jī)的ip和端口。
3:container模式,--net=container:NAME_or_ID。
這個(gè)模式就是指定一個(gè)已有的容器,共享該容器的IP和端口。除了網(wǎng)絡(luò)方面兩個(gè)容器共享,其他的如文件系統(tǒng),進(jìn)程等還是隔離開的。
4:none模式,--net=none。
這個(gè)模式下,dokcer不為容器進(jìn)行任何網(wǎng)絡(luò)配置。需要我們自己為容器添加網(wǎng)卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必須要在none模式下才可以。
pipework安裝:
# wget https://github.com/jpetazzo/pipework/archive/master.zip # unzip pipework-master.zip # cp pipework-master/pipework /usr/local/bin/ # chmod +x /usr/local/bin/pipework 創(chuàng)建none模式的容器,為其分配IP。 #ip a show docker0 #docker run -idt --name test --net=none resin #pipework docker0 test 172.17.42.100/16@172.17.42.1 #docker attach test
以上操作給新建的test容器分配了一個(gè)172.17.42.100的IP地址。
二、 docker默認(rèn)使用'bridge'來(lái)設(shè)置container的網(wǎng)絡(luò)模式(即從與docker0同網(wǎng)段的未使用的IP中取一個(gè)作為container的IP),我們這里使用'none'來(lái)實(shí)現(xiàn)自己手動(dòng)配置container的網(wǎng)絡(luò)。
首先我們以**--net='none'**的方式啟動(dòng)一個(gè)container
[yaxin@cube2x ~]$docker run -i -t --rm --net='none' ubuntu /bin/bash root@db84e747c362:/# ifconfig -a lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) root@db84e747c362:/#
可以看到,由于我們使用'none'模式,container中沒(méi)有獲取到IP,甚至連網(wǎng)卡都沒(méi)有,下面我們開始給container配置IP
首先獲取container的pid(我們需要通過(guò)pid獲取file descriptor)
[yaxin@cube2x ~]$docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db84e747c362 docker.cn/docker/ubuntu:latest "/bin/bash" 4 minutes ago Up 4 minutes sharp_kirch [yaxin@cube2x ~]$docker inspect -f "{{.State.Pid}}" sharp_kirch 23090
ip-netns的man page中有這樣一句
By convention a named network namespace is an object at /var/run/netns/NAME that can be opened. The file descriptor resulting from opening/var/run/netns/NAME refers to the specified network namespace
因而我們需要?jiǎng)?chuàng)建一個(gè)鏈接
[yaxin@cube2x ~]$sudo ln -s /proc/23090/ns/net /var/run/netns/23090
然后創(chuàng)建一對(duì)端到端的網(wǎng)卡,將veth_db84e747c3綁定到docker0網(wǎng)橋,并啟動(dòng)。將另一塊網(wǎng)卡X放到container內(nèi)部
[yaxin@cube2x ~]$sudo ip link add veth_db84e747c3 type veth peer name X [yaxin@cube2x ~]$sudo brctl addif docker0 veth_db84e747c3 [yaxin@cube2x ~]$sudo ip link set veth_db84e747c3 up [yaxin@cube2x ~]$sudo ip link set X netns 23090
這時(shí)查看container的IP,會(huì)發(fā)現(xiàn)多了一個(gè)名為X的網(wǎng)卡
root@db84e747c362:/# ifconfig -aX Link encap:Ethernet HWaddr 5a:7e:4d:ba:63:1c BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
然后對(duì)container內(nèi)部新添加的網(wǎng)卡進(jìn)行配置(可以通過(guò)man ip-netns更詳細(xì)查看)
[yaxin@cube2x ~]$sudo ip netns exec 23090 ip link set dev X name eth0 [yaxin@cube2x ~]$sudo ip netns exec 23090 ip link set eth0 up [yaxin@cube2x ~]$sudo ip netns exec 23090 ip addr add 172.17.111.10/16 dev eth0 [yaxin@cube2x ~]$sudo ip netns exec 23090 ip route add default via 172.17.42.1
注意: 指定給container的IP必須跟docker0在同一網(wǎng)段,且給container的網(wǎng)關(guān)應(yīng)該為docker0的IP
最后,寫成shell腳本如下:
#!/usr/bin/env bash# filename: bind_addr.sh if [ `id -u` -ne 0 ];then echo '必須使用root權(quán)限' exitfi if [ $# != 2 ]; then echo "使用方法: $0 容器名字 IP" exit 1fi container_name=$1bind_ip=$2 container_id=`docker inspect -f '{{.Id}}' $container_name 2> /dev/null` if [ ! $container_id ];then echo "容器不存在" exit 2fibind_ip=`echo $bind_ip | egrep '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'` if [ ! $bind_ip ];then echo "IP地址格式不正確" exit 3fi container_minid=`echo $container_id | cut -c 1-10` container_netmask=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f2` container_gw=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f1` bridge_name="veth_$container_minid" container_ip=$bind_ip/$container_netmask pid=`docker inspect -f '{{.State.Pid}}' $container_name 2> /dev/null` if [ ! $pid ];then echo "獲取容器$container_name的id失敗" exit 4fi if [ ! -d /var/run/netns ];then mkdir -p /var/run/netns fi ln -sf /proc/$pid/ns/net /var/run/netns/$pid ip link add $bridge_name type veth peer name X brctl addif docker0 $bridge_name ip link set $bridge_name up ip link set X netns $pid ip netns exec $pid ip link set dev X name eth0 ip netns exec $pid ip link set eth0 up ip netns exec $pid ip addr add $container_ip dev eth0 ip netns exec $pid ip route add default via $container_gw 運(yùn)行并寫入ip和容器名稱 配置容器與主機(jī)IP同一網(wǎng)段 先配置主機(jī)br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTPROTO=static ONBOOT=yes DELAY=0 STP=yes IPADDR=192.168.2.111 NETMASK=255.255.255.0 GATEWAY=192.168.2.1 /etc/init.d/network restart docker run -itd --name test centos /bin/bash pipework br0 test 192.168.2.201/24@192.168.2.1
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker Compose 搭建簡(jiǎn)單的Python網(wǎng)絡(luò)應(yīng)用程序(步驟詳解)
在這個(gè)頁(yè)面上,你可以建立一個(gè)簡(jiǎn)單的Python網(wǎng)絡(luò)應(yīng)用程序,運(yùn)行在Docker Compose上,這篇文章主要介紹了Docker Compose 搭建簡(jiǎn)單的Python網(wǎng)絡(luò)應(yīng)用程序,需要的朋友可以參考下2022-07-07Docker部署RocketMQ的實(shí)現(xiàn)示例
本文主要介紹了Docker部署RocketMQ的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10Docker基于macvlan實(shí)現(xiàn)跨主機(jī)容器通信
這篇文章主要介紹了Docker基于macvlan實(shí)現(xiàn)跨主機(jī)容器通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05docker配置node項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了docker配置node項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Docker部署MySQL8集群(一主二從)的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署MySQL8集群,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作
這篇文章主要介紹了Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11docker配置修改阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了docker配置修改阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07使用docker安裝hadoop的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了使用docker安裝hadoop的詳細(xì)過(guò)程,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01Docker啟動(dòng)安裝nacos的實(shí)現(xiàn)示例
本文主要介紹了Docker啟動(dòng)安裝nacos的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09