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
[root@localhost ~]git clone 
https://github.com/jpetazzo/pipework
[root@localhost ~] cp pipework/pipework /usr/local/bin/

2.宿主机配置桥接网络(可以省略)
宿主机物理网卡em1配置:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-em1 
TYPE=Ethernet
BOOTPROTO=none
DEVICE=em1
ONBOOT=yes
BRIDGE=br0

宿主机桥接网卡br0配置:
[root@localhost ~]# 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 首先创建一个容器

[root@localhost ~] docker run -itd --name test ubuntu /bin/bash

此时,查看容器的IP地址信息,其中只有一个eth0,IP地址是172.17.0.2 是Docker默认分配的地址,如下:
root@c64b5871157f:/# 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上,其中@后面是网关地址
[root@localhost ~] pipework br0 test 10.207.0.236/24@10.207.0.1

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

另外,如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP
[root@localhost ~] pipework br0 test dhcp

此时查看容器的IP地址信息,发现新增加了一个网卡eth1,分配的IP地址是10.207.0.236/24,如下:
root@c64b5871157f:/# 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命令来完成工作,甚至可以根据自己的需求,添加额外的功能。


 本文转自 sjfbjs 51CTO博客,原文链接:http://blog.51cto.com/11886896/1981901

相关文章
|
1月前
|
监控 Linux Shell
【Shell 命令集合 网络通讯 】Linux 配置和管理网络流量的形状 shapecfg命令 使用指南
【Shell 命令集合 网络通讯 】Linux 配置和管理网络流量的形状 shapecfg命令 使用指南
39 0
|
23天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
92 0
|
16天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
2天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
29 1
|
3天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
26 0
|
3天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
8天前
|
数据采集 数据可视化
R语言用相关网络图可视化分析汽车配置和饮酒习惯
R语言用相关网络图可视化分析汽车配置和饮酒习惯
13 0
|
15天前
|
网络协议
centos8 网卡 Nmcli(是network的简写 Nmcli)配置网络
centos8 网卡 Nmcli(是network的简写 Nmcli)配置网络
15 0
|
19天前
|
Ubuntu 网络安全 数据安全/隐私保护
ubuntu篇-配置FTP服务,本机和docker安装
通过以上步骤,你可以在Ubuntu上配置FTP服务,无论是本机安装还是Docker内安装,都可以提供FTP文件传输服务。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
20 1
|
27天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2

热门文章

最新文章