欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

docker 指定IP地址、與主機(jī)同網(wǎng)段IP

 更新時(shí)間:2017年05月13日 14:54:49   作者:wangdaoge  
這篇文章主要介紹了docker 指定IP地址、與主機(jī)同網(wǎng)段IP,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

首先講一下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)用程序(步驟詳解)

    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-07
  • Docker部署RocketMQ的實(shí)現(xiàn)示例

    Docker部署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-10
  • Docker基于macvlan實(shí)現(xiàn)跨主機(jī)容器通信

    Docker基于macvlan實(shí)現(xiàn)跨主機(jī)容器通信

    這篇文章主要介紹了Docker基于macvlan實(shí)現(xiàn)跨主機(jī)容器通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Docker創(chuàng)建MySQL容器的方法

    Docker創(chuàng)建MySQL容器的方法

    本篇文章主要介紹了Docker創(chuàng)建MySQL容器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • docker配置node項(xiàng)目的實(shí)現(xiàn)步驟

    docker配置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-01
  • Docker部署MySQL8集群(一主二從)的實(shí)現(xiàn)步驟

    Docker部署MySQL8集群(一主二從)的實(shí)現(xiàn)步驟

    本文主要介紹了Docker部署MySQL8集群,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作

    Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作

    這篇文章主要介紹了Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • docker配置修改阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn)

    docker配置修改阿里云鏡像倉(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的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了使用docker安裝hadoop的詳細(xì)過(guò)程,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Docker啟動(dòng)安裝nacos的實(shí)現(xiàn)示例

    Docker啟動(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

最新評(píng)論