• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > docker 指定IP地址、与主机同网段IP

docker 指定IP地址、与主机同网段IP

作者:wangdaoge 字体:[增加 减小] 来源:互联网

本文主要包含docker,主机同网段,docker,网段等服务器相关知识,wangdaoge 希望可以进行参考

首先讲一下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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • 梦工厂数据中心:云和虚拟化不到20%
  • VMware 12安装及激活图文教程
  • Docker 限制容器的 Block IO使用
  • Docker 实现浏览器里开发Android应用的功能
  • docker使用阿里云镜像仓库的方法
  • XenServer安装后修改IP与域名并解析测试的方法
  • 浅谈docker学习之docker数据卷(volume)
  • 浅谈Docker 客户端和守护进程
  • docker连接spring boot和mysql容器方法介绍
  • 使用phpstorm对docker中的脚本进行debug的方法

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 深入理解Xen虚拟机克隆复制实战
    • java读写hdfs简单demo,javahdfsdemo
    • Docker v1.13.0 正式版发布
    • Docker中配置国内镜像设置
    • Openstack 启动instance 'hvm'错误问题解决办法
    • docker 如何删除none镜像
    • docker中使用mysql数据库详解(在局域网访问)
    • docker学习笔记之把容器commit成镜像的方法
    • VirtualBox安装Archlinux并配置桌面环境
    • 从零开始构建docker基础镜像的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有