docker 1.12使用新版macvlan设置与宿主机同网段ip

******************************************

由于开发的一些特殊需求,需要将容器部署在与宿主机同一个网段中,部署步骤如下:

步骤一:创建网络
$ docker network create -d macvlan --subnet=172.16.0.0/24 --gateway=172.16.0.1 -o parent=eno16777736 mynet
548d79fe04c613d3ca180e8689f2207f71534020bc39566d62d0b5aeb67fc8b5

参数解析:
-d macvlan  加载kernel的模块名
--subnet 宿主机所在网段
--gateway 宿主机所在网段网关
-o parent 继承指定网段的网卡

步骤二:运行容器
$ docker run --net=mynet --ip=172.16.0.100 -it -d --rm centos:6.7 /bin/bash

参数解析:
--ip 可以指定容器的IP

*******************************************************************************************

http://www.itnpc.com/news/web/146104788357316.html

在知乎上看到这一段,先mark一下。

没有用过国内的云服务,不是很清楚。就像 @向军 所说的那样,修改interface可以解决问题

另外,docker不是一定要用172.*的地址段,你可以用docker -b BRIDGE指定其他的interface,使用其他的IP段
参见:https://docs.docker.com/articles/networking/#bridge-building
e.g.
# brctl addbr mydockerbridge
# ip addr add 192.168.1.1/ dev mydockerbridge
# ip link set dev mydockerbridge up # docker -d -b mydockerbridge 之后所有的docker container 就会使用192.168.1.*这个IP段了 作者:Honglin Feng
链接:https://www.zhihu.com/question/24863856/answer/29256378
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
因为阿里云默认把所有的私网地址段都加到导致docker找不到一个可用的IP段了。要解决这个问题只需要一步,修改/etc/network/interface 去掉172那段的路由,然后ip route del 172.段的路由。

腾讯云没用过,按照相同思路排查下。

作者:向军
链接:https://www.zhihu.com/question/24863856/answer/29253733
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

 

必须在--net=none模式下才能拿用pipework设置ip.

1、网络模式

docker支持四种网络模式,使用--net选项指定:

  • host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个。容器将不会虚拟出自己的网卡,IP等,而是使用宿主机的IP和端口,也就是说如果容器是个web,那直接访问宿主机:端口,不需要做NAT转换,跟在宿主机跑web一样。容器中除了网络,其他都还是隔离的。

  • container,--net=container:NAME_or_ID,与指定的容器共同使用网络,也没有网卡,IP等,两个容器除了网络,其他都还是隔离的。

  • none ,--net=none,获得独立的network namespace,但是,并不为容器进行任何网络配置,需要我们自己手动配置。

  • bridge,--net=bridge,默认docker与容器使用nat网络,一般分配IP是172.17.0.0/16网段,要想改为其他网段,可以直接修改网桥IP地址,例如:

$ sudo ifconfig docker0 192.168.10.1 netmask 255.255.255.0

 

2、容器默认网络配置过程

先创建一个docker0的网桥,使用Veth pair创建一对虚拟网卡,一端放到新创建的容器中,并重命名eth0,另一端放到宿主机中,以veth+随机7个字符串名字命名,并将这个网络设备加入到docker0网桥中,网桥自动为容器分配一个IP,并设置docker0的IP为容器默认网关。同时在iptables添加SNAT转换网桥段IP,以便容器访问外网。

Veth par是用于不同network namespace间进行通信的方式,而network namespace是实现隔离网络。

3、容器桥接宿主机网络

关闭docker并设置桥接模式:

$ sudo apt-get install bridge-utils

$ sudo service docker stop

#关闭默认网桥

$ sudo ip link set dev docker0 down

#删除默认网桥

$ sudo brctl delbr docker0

创建桥接网卡:

$ sudo brctl addbr br0    #创建网桥

$ sudo vi /etc/network/interfaces #将原有宿主机IP配置到新创建的网桥上

1
2
3
4
5
6
7
8
auto  eth0
iface eth0 inet manual
auto  br0
iface br0 inet static
    address 192.168.10.10   #宿主机IP
    netmask 255.255.255.0
    gateway 192.168.10.1
    dns-nameservers 192.168.10.1

$ sudo /etc/init.d/networking restart

重启网卡后,再通过ifconfig命令查看,多了br0网桥,并且IP地址也绑定在了上面。

#修改docker桥接网桥,并重启

$ sudo  vi /etc/default/docker

DOCKER_OPTS="-b=br0"

$ sudo service docker restart

接下来启动一个容器,先不配置网络信息:

$ sudo docker run -itd --name=ubuntu_test --net=none ubuntu

不配置ip的原因是:容器启动后自动随机分配一个网桥段的IP,这个IP不管你宿主机网络中是否已经分配,它都会根据自身的算法来分配IP,docker有自己的一套分配算法。
所以既然选择桥接网络,就要事先规划好IP分配。

4、创建容器没配置网络,该怎么配置呢?

pipework是一个LXC网络管理工具,用shell写的,有200多行代码。可以给容器配置固定IP地址:

$ git clone https://github.com/jpetazzo/pipework.git

$ sudo cp pipework/pipework /usr/local/bin/

$ sudo pipework br0 ubuntu_test 192.168.18.29/24@192.168.18.1

Warning: arping not found; interface may not be immediately reachable

这一步是给配置容器网络并连接网桥,@左边是与宿主机同网段IP,右边是网关。

提示arping命令没发现,可以通过apt-get install arping来安装。

$ sudo brctl show   #查看虚拟网卡veth开头的已加入网桥

$ sudo docker attach ubuntu_test

#进入容器用ifconfig命令查看,IP信息已经配置上,通过ping百度及同网段IP是相通的,配置成功。

pipework工具怎么实现配置的IP呢?

pipework是通过ip netns exec进入容器的net命名空间,来配置容器net命名空间的网络参数。

为docker容器设置独立ip的更多相关文章

  1. docker容器配置独立ip

    一般安装docker后都会通过端口转发的方式使用网络,比如 “-p 2294:22” 就将2294抓发到22端口来提供sftp服务,这样使用起来没有问题.但端口号很难记忆,如果前边有nginx等抓发工 ...

  2. 利用pipework为docker容器设置固定IP

    今天介绍如何在redhat/centos7系列机器上使用pipework为docker启动的容器指定一个固定ip,我们知道默认情况下,docker会使用 bridge网络模式为每一个启动的容器动态分配 ...

  3. 为Docker容器设置静态IP

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 创建docker容器 docker run -it --name=yh -h yh --net=none de ...

  4. 转:为Docker容器设置固定IP实现网络联通(1)——通过Pipework为Docker容器设置

    https://blog.csdn.net/chinagissoft/article/details/51250839 1. 创建并启动一个容器: docker run --cap-add=NET_A ...

  5. (为容器分配独立IP方法二)通过虚拟IP实现docker宿主机增加对外IP接口

    虚拟IP.何为虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配 ...

  6. docker容器分配静态IP

    最近因为工作要求需要用学习使用docker,最后卡在了网络配置这一块.默认情况下启动容器的时候,docker容器使用的是bridge策略比如: docker run -ti ubuntu:latest ...

  7. 为Docker容器配置固定IP

    当docker以桥接的方式启动容器时,容器内部的IP是经过DHCP获取的,例如:172.17.0.8/32,且每重启依次IP都会发生变动.某些特殊的情况下,需要容器内有自己固定的一个内部IP.我的实现 ...

  8. 如何获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  9. 如何获取 docker 容器(container)的 ip 地址(转)

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

随机推荐

  1. json数组某个数值对应渲染

    当你统计某一年的某个值它对应的月份总数时,后台没有直接处理好,某个月对应某个值,这样会增加统计的负担,但当数据时这样的时候,在angularjs中时不能直接引用的. "data": ...

  2. 数字(number)

    数字(number) Time Limit:2000ms   Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...

  3. 关于Control.Dispatcher.BeginInvoke卡界面

    Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住. Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不 ...

  4. jQuery选择器之属性筛选选择器

    在这么多属性选择器中[attr="value"]和[attr*="value"]是最实用的 [attr="value"]能帮我们定位不同类型 ...

  5. Linux系统使用iftop查看带宽占用情况

    Linux系统下如果服务器带宽跑满了,查看跟哪个ip通信占用带宽比较多,可以通过iftop命令进行查询,使用方法如下: 1 安装方法[软件官网地址:http://www.ex-parrot.com/~ ...

  6. QTableWidget表头样式

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7742680.html QTableView { background-color: rgba(255, 255 ...

  7. (转)Spring的三种实例化Bean的方式

    http://blog.csdn.net/yerenyuan_pku/article/details/52832793 Spring提供了三种实例化Bean的方式. 使用类构造器实例化. <be ...

  8. UGUI世界坐标转换为UI本地坐标

    以下是实现hud跟随3D物体的脚本,只是测试用,不是开发中的代码,脚本挂在任意游戏物体上 demo下载 using UnityEngine; public class SceneFollowUI : ...

  9. 旅行商问题——状态压缩DP

    问题简介 有n个城市,每个城市间均有道路,一个推销员要从某个城市出发,到其余的n-1个城市一次且仅且一次,然后回到再回到出发点.问销售员应如何经过这些城市是他所走的路线最短? 用图论的语言描述就是:给 ...

  10. uva12265 Selling Land

    见紫书.(c,h)的更新策略://前面的高度为0了,直接插入因为ans==-c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从 ...