首先讲一下docker的网络模式:

我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式:
1:bridge模式,--net=bridge(默认)。
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:
2:host模式,--net=host。
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
3:container模式,--net=container:NAME_or_ID。
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。
4:none模式,--net=none。
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以
以下是几种分配IP的方式:
一、pipework
首先讲一下docker的网络模式:
我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式:
1:bridge模式,--net=bridge(默认)。
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:
2:host模式,--net=host。
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
3:container模式,--net=container:NAME_or_ID。
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。
4:none模式,--net=none。
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置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 创建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容器分配了一个172.17.42.100的IP地址。
二、 docker默认使用'bridge'来设置container的网络模式(即从与docker0同网段的未使用的IP中取一个作为container的IP),我们这里使用'none'来实现自己手动配置container的网络。
首先我们以**--net='none'**的方式启动一个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中没有获取到IP,甚至连网卡都没有,下面我们开始给container配置IP
首先获取container的pid(我们需要通过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
因而我们需要创建一个链接
[yaxin@cube2x ~]$sudo ln -s /proc/23090/ns/net /var/run/netns/23090
然后创建一对端到端的网卡,将veth_db84e747c3绑定到docker0网桥,并启动。将另一块网卡X放到container内部
[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
这时查看container的IP,会发现多了一个名为X的网卡
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)
然后对container内部新添加的网卡进行配置(可以通过man ip-netns更详细查看)
[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在同一网段,且给container的网关应该为docker0的IP
最后,写成shell脚本如下:
#!/usr/bin/env bash# filename: bind_addr.sh
if [ `id -u` -ne 0 ];then
echo '必须使用root权限'
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
运行并写入ip和容器名称
配置容器与主机IP同一网段
先配置主机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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# docker
# 主机同网段
# 网段
# Docker默认网段的正确修改步骤
# Docker如何实现修改Docker0网桥默认网段
# 详解Docker 容器跨主机多网段通信解决方案
# Docker实现同Ip网段联通的实现
# Docker 如何分配宿主机网段 IP
# Docker 容器指定自定义网段的固定IP/静态IP地址
# Docker默认网段修改实现方法解析
# 模式下
# 网桥
# 这是
# 创建一个
# 其他的
# 要在
# 才可以
# 可以使用
# 不为
# 将不
# 连接到
# 文件系统
# 默认设置
# 一句
# 中有
# 可以通过
# 不存在
# 可以看到
# 几种
# 为其
相关文章:
Swift中swift中的switch 语句
兔展官网 在线制作,怎样制作微信请帖?
如何选择美橙互联多站合一建站方案?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
建站之星图片链接生成指南:自助建站与智能设计教程
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
大连网站制作公司哪家好一点,大连买房网站哪个好?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
,石家庄四十八中学官网?
Python多线程使用规范_线程安全解析【教程】
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
潮流网站制作头像软件下载,适合母子的网名有哪些?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
孙琪峥织梦建站教程如何优化数据库安全?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
如何在万网ECS上快速搭建专属网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机选哪家性价比最高?
浅谈Javascript中的Label语句
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
javascript中的try catch异常捕获机制用法分析
建站之星3.0如何解决常见操作问题?
建站之星后台管理如何实现高效配置?
*服务器网站为何频现安全漏洞?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何快速生成ASP一键建站模板并优化安全性?
用v-html解决Vue.js渲染中html标签不被解析的问题
郑州企业网站制作公司,郑州招聘网站有哪些?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
常州企业网站制作公司,全国继续教育网怎么登录?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
c++ stringstream用法详解_c++字符串与数字转换利器
如何通过VPS搭建网站快速盈利?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何选择靠谱的建站公司加盟品牌?
PHP 500报错的快速解决方法
javascript基本数据类型及类型检测常用方法小结
历史网站制作软件,华为如何找回被删除的网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
建站之星如何修改网站生成路径?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
济南企业网站制作公司,济南社保单位网上缴费步骤?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何安全更换建站之星模板并保留数据?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
*请认真填写需求信息,我们会在24小时内与您取得联系。