使用pipework将Docker容器桥接到本地网络环境中

在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。pipework工具来实现这一需求

1.安装pipework

2.宿主机配置桥接网络(可以省略)

3.给容器添加桥接地址

实验环境:

宿主机:10.207.0.99/24 网关:10.207.0.0.1

容器test:10.207.0.236/24

1.安装pipework

[[email protected] ~]git clone https://github.com/jpetazzo/pipework

[[email protected] ~] cp pipework/pipework /usr/local/bin/

2.宿主机配置桥接网络(可以省略)

宿主机物理网卡em1配置:

[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-em1

TYPE=Ethernet

BOOTPROTO=none

DEVICE=em1

ONBOOT=yes

BRIDGE=br0

宿主机桥接网卡br0配置:

[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

BOOTPROTO=none

DEVICE=br0

ONBOOT=yes

IPADDR=10.207.0.99

NETMASK=255.255.255.0

GATEWAY=10.207.0.1

3.给容器添加桥接地址

3.1 首先创建一个容器

[[email protected] ~] docker run -itd --name test ubuntu /bin/bash

此时,查看容器的IP地址信息,其中只有一个eth0,IP地址是172.17.0.2 是Docker默认分配的地址,如下:

[email protected]:/# ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
     inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever

10: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
     inet 172.17.0.2/16 scope global eth0
        valid_lft forever preferred_lft forever
     inet6 fe80::42:acff:fe11:2/64 scope link
        valid_lft forever preferred_lft forever
       

3.2 在宿主机配置容器test的网络,并连接到网桥br0上,其中@后面是网关地址

[[email protected] ~] pipework br0 test 10.207.0.236/[email protected]

注意:这一步中,pipework首先会检查主机是否存在br0网桥,若不存在,就自己创建一个。这里以"br"开头,所以创建的是Linux bridge。如果以"ovs"开头,就会创建OpenVswitch网桥。


另外,如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP

[[email protected] ~] pipework br0 test dhcp

此时查看容器的IP地址信息,发现新增加了一个网卡eth1,分配的IP地址是10.207.0.236/24,如下:

[email protected]:/# ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
     inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever

10: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
     inet 172.17.0.2/16 scope global eth0
        valid_lft forever preferred_lft forever
     inet6 fe80::42:acff:fe11:2/64 scope link
        valid_lft forever preferred_lft forever

12: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
     link/ether e2:e3:56:c0:9d:ca brd ff:ff:ff:ff:ff:ff
     inet 10.207.0.236/24 brd 10.207.0.255 scope global eth1
        valid_lft forever preferred_lft forever
     inet6 fe80::e0e3:56ff:fec0:9dca/64 scope link
        valid_lft forever preferred_lft forever

现在,可以通过ping 10.207.0.236来测试容器网络。或者从其它物理主机上ping这个容器地址。


扩展部分:

pipework工作原理分析

#创建br0网桥

#若ovs开头,则创建OVS网桥 ovs-vsctl add-br ovs*

brctl addbr $IFNAME

#创建veth pair,用于连接容器和br0

ip link add name $LOCAL_IFNAME mtu $MTU type veth peer name $GUEST_IFNAME mtu $MTU

#找到Docker容器test1在主机上的PID,创建容器网络命名空间的软连接

DOCKERPID=$(docker inspect --format=‘{{ .State.Pid }}‘ $GUESTNAME)

ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID

#将veth pair一端放入Docker容器中,并设置正确的名字eth1

ip link set $GUEST_IFNAME netns $NSPID

ip netns exec $NSPID ip link set $GUEST_IFNAME name $CONTAINER_IFNAME

#将veth pair另一端加入网桥

#若为OVS网桥则为 ovs-vsctl add-port $IFNAME $LOCAL_IFNAME ${VLAN:+"tag=$VLAN"}

brctl addif $IFNAME $LOCAL_IFNAME

#为新增加的容器配置IP和路由

ip netns exec $NSPID ip addr add $IPADDR dev $CONTAINER_IFNAME

ip netns exec $NSPID ip link set $CONTAINER_IFNAME up

ip netns exec $NSPID ip route delete default

ip netns exec $NSPID ip route add $GATEWAY/32 dev $CONTAINER_IFNAME

1.首先pipework检查是否存在br0网桥,若不存在,就自己创建。若以"ovs"开头,就会创建OpenVswitch网桥,以"br"开头,创建Linux bridge。

2.创建veth pair设备,用于为容器提供网卡并连接到br0网桥。

3.使用docker inspect找到容器在主机中的PID,然后通过PID将容器的网络命名空间链接到/var/run/netns/目录下。这么做的目的是,方便在主机上使用ip netns命令配置容器的网络。因为,在Docker容器中,我们没有权限配置网络环境。

4.将之前创建的veth pair设备分别加入容器和网桥中。在容器中的名称默认为eth1,可以通过pipework的-i参数修改该名称。

5.然后就是配置新网卡的IP。若在IP地址的后面加上网关地址,那么pipework会重新配置默认路由。这样容器通往外网的流量会经由新配置的eth1出去,而不是通过eth0和docker0。(若想完全抛弃自带的网络设置,在启动容器的时候可以指定--net=none)

以上就是pipework配置Docker网络的过程,这和Docker的bridge模式有着相似的步骤。事实上,Docker在实现上也采用了相同的底层机制。

通过源代码,可以看出,pipework通过封装Linux上的ip、brctl等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。当然,如果想了解底层的操作,我们也可以直接使用这些Linux命令来完成工作,甚至可以根据自己的需求,添加额外的功能。

时间: 2024-08-27 16:39:25

使用pipework将Docker容器桥接到本地网络环境中的相关文章

Docker 网络之pipework 工具(2)将Docker容器配置到本地网络环境中

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求.这个需求其实很容易实现,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了.下面我们来操作一下,我主机A地址为192.168.1.107/24,网关为192.168.1.1,需要给Docker容器的地址配置为192.168.1.150/24.在主机A上做如下操作:安装pipework下载地址:wgethttps://github.com/jpetazz

使用pipework配置docker容器固定ip

首先讲一下docker的网络模式: 我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式: 1:bridge模式,--net=bridge(默认). 这是dokcer网络的默认设置.安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址.并默认连接到docker0网桥,以此实现容器与宿主机的网络互通.如下: 2:host模式,--ne

云计算进阶学习路线图课件:Docker容器的四种网络模式

Docker容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装Docker引擎的服务器上,也可以实现虚拟化.随着云计算的飞速发展以及企业需求的多样化,Docker容器技术成为云计算人才必备的技能之一.很多人想要快速掌握Docker容器技术,接下来就给大家讲解Docker容器的四种网络模式. 1.closed container 封闭式网络模式 没有网络协议栈的通信使用none模式,Docker容器拥有自己的Network Nam

docker 实战---多台物理主机的联网,容器桥接到物理网络拓扑图(四)

很多朋友说上一篇中对网络的描述不够清楚,感谢热心的群友彩笔程序员: 提供了他理解的图,在这里贴一下: 我自己也补画了一副多台机器互联的图,欢迎大家留言讨论: 主机A和主机B的网卡一都连着物理交换机的同一个vlan 101,这样网桥一和网桥三就相当于在同一个物理网络中了,而容器一.容器三.容器四也在同一物理网络中了,他们之间可以相互通信. 主机A上的网卡二连接了vlan102 桥接网桥二,它不与其他物理主机和容器相通.

虚拟化技术—docker容器—PIPEWORK解读与实践

本文通过3个样例 -- 将Docker容器配置到本地网络环境中.单主机Docker容器的VLAN划分.多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pipework是如何工作的. 1.pipework的使用以及源码分析 Docker自身的网络功能比较简单,不能满足很多复杂的应用场景.因此,有很多开源项目用来改善Docker的网络功能,如pipework.weave.flannel等.这里,就先介绍一下pipework的使用和工作原理. pip

Kubernetes &amp; Docker 容器网络终极之战(十四)

目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 通信方案 2.2.容器网络规范 2.3.网络通信实现方案 2.4.Kubernetes 网络模型 三.跨主机 Docker 网络 3.1 Flannel 网络方案 3.2.Calico 网络方案 3.3.Canal 网络方案 3.4.Docker overlay 网络方案 3.5.Docker ma

Kubernetes &amp; Docker 容器网络终极之战

与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Docker 容器出现,容器的网络通信一直是众人关注的焦点,而容器的网络方案又可以分为两大部分: 单主机的容器间通信: 跨主机的容器间通信. 一.单主机 Docker 网络通信 利用 Net Namespace 可以为 Docker 容器创建隔离的网络环境,容器具有完全独立的网络栈,与宿主机隔离.也可以使

Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)

自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker.前面已经在Docker容器学习梳理--基础知识(2)这一篇中详细介绍了Docker的网络配置以及pipework工具. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的

docker容器网络通信原理分析

概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求.而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信.而本文将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以