网站首页 > 技术文章 正文
概述
在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。
下面我们就使用pipework工具来实现这一需求。
pipework 工作原理分析
如果配置了pipework,在 docker attach 到 test上,可以发现容器中多了一块 eth1的网卡,并且配置了 XX.XX.XX.XX/24 的 IP,而且默认路由也自动改了。这中间容器到底发生了哪些变化呢?
?首先 pipework 检查是否存在 br0 网桥,若不存在,就自己创建。
?创建 veth pair 设备,用于为容器提供网卡并连接到 br0 网桥。
?使用 docker inspect 找到容器在主机中的 PID,然后通过 PID 将容器的网络命名空间链接到var/run/netns/目录下。这么做的目的是,方便在主机上使用 ip netns 命令配置容器的网络。因为,在 Docker 容器中,我们没有权限配置网络环境。
?将之前创建的 veth pair 设备分别加入容器和网桥中。在容器中的名称默认为 eth1,可以通过 pipework 的-i 参数修改该名称。
?然后就是配置新网卡的 IP。若在 IP 地址的后面加上网关地址,那么 pipework 会重新配置默认路由。这样容器通往外网的流量会经由新配置的 eth1 出去,而不是通过 eth0 和 docker0。(若想完全抛弃自带的网络设置,在启动容器的时候可以指定--net=none)
以上就是 pipework 配置 Docker 网络的过程,这和 Docker 的 bridge 模式有着相似的步骤。事实上,Docker 在实现上也采用了相同的底层机制。
通过源代码,可以看出,pipework 通过封装 Linux 上的 ip、brctl 等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。当然,如果想了解底层的操作,我们也可以直接使用这些 Linux 命令来完成工作,甚至可以根据自己的需求,添加额外的功能。
安装pipework
$ git clone https://github.com/jpetazzo/pipework
$ sudo cp pipework/pipework /usr/local/bin/
使用pipework
首先看一下,当前我的主机的IP地址为192.168.0.109/24,网关为192.168.0.1,使用的是eth0这块网卡。假定我需要给Docker容器的分配的地址为192.168.0.200。
首先创建一个容器
$ sudo docker run -itd --name test ubuntu /bin/bash
此时,查看容器的IP地址信息,其中只有一个eth0,IP地址是172.17.0.3/16 是Docker默认分配的地址,如下:
$ sudo docker exec test ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 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 25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever
下面配置容器test的网络,并连接到网桥br0上,其中@后面是网关地址
$ sudo pipework br0 test 192.168.0.200/24@192.168.0.1
这一步中,pipework首先会检查主机是否存在br0网桥,若不存在,就自己创建一个。这里以”br”开头,所以创建的是Linux bridge。如果以”ovs”开头,就会创建OpenVswitch网桥。
另外,如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP
$ sudo pipework br0 test dhcp
此时查看容器的IP地址信息,发现新增加了一个网卡eth1,分配的IP地址是192.168.0.200/24,如下:
$ sudo docker exec test ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 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 25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever 27: eth1@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue qlen 1000 link/ether 4e:ab:e0:c5:a7:81 brd ff:ff:ff:ff:ff:ff inet 192.168.0.200/24 brd 192.168.0.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::4cab:e0ff:fec5:a781/64 scope link valid_lft forever preferred_lft forever
将主机eth0桥接到br0上,并把eth0的IP配置在br0上。这里由于是远程操作,中间网络会断掉,所以放在一条命令中执行。
$ sudo ip addr add 192.168.0.109/24 dev br0 $ sudo ip addr del 192.168.0.109/24 dev eth0 $ sudo brctl addif br0 eth0 $ sudo ip route del default $ sudo ip route add default via 192.168.0.1 dev br0
上面的命令执行过程中会断一次网,所以可以将上面的命令放到一步中执行,如下:
$ sudo ip addr add 192.168.0.109/24 dev br0; \ sudo ip addr del 192.168.0.109/24 dev eth0; \ sudo brctl addif br0 eth0; \ sudo ip route del default; \ sudo ip route add default via 192.168.0.1 dev br0
注:上面这一步只有在第一次绑定容器地址的时候会用到,一旦执行过后,就会在主机上把原来eth0的IP地址分配给br0,然后把eth0和br0连起来。所以以后再创建容器就不需要执行这一步了。而只需要执行下面的绑定容器地址的命令就可以了。
$ sudo pipework br0 test 192.168.0.200/24@192.168.0.1
运行上面命令后查看主机的IP地址信息,如下:
$ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000 link/ether 76:e0:49:4f:00:ac brd ff:ff:ff:ff:ff:ff inet 192.168.0.109/24 brd 192.168.0.255 scope global dynamic eth0 valid_lft 1464sec preferred_lft 1464sec inet6 fe80::6be1:989e:26e9:488e/64 scope link valid_lft forever preferred_lft forever $ ip addr show br0 12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 76:e0:49:4f:00:ac brd ff:ff:ff:ff:ff:ff inet 192.168.0.109/24 scope global br0 valid_lft forever preferred_lft forever inet6 fe80::fc31:97ff:fe9e:872c/64 scope link valid_lft forever preferred_lft forever
现在,另开一个终端,可以通过ping 192.168.0.200来测试容器网络。或者从其它物理主机上ping这个容器地址
上面就是用pipework来实现将Docker容器配置到本地网络环境中的一个方式,大家有兴趣可以在自己本地虚拟机上尝试下。
后面会分享更多devops和DBA内容,感兴趣的朋友可以关注下~
猜你喜欢
- 2024-10-14 Docker Overlay 网络学习 dockercompose 网络
- 2024-10-14 盘点c++几种常见的设计模式及具体实现
- 2024-10-14 Docker新手福音!这个开源控制面板让你更快上手Docker
- 2024-10-14 Docker-掌握这三种方法,创建自己的docker镜像
- 2024-10-14 docker 基础概念 docker基于什么
- 2024-10-14 小白也能轻松上手,深度体验绿联私有云DX4600 Docker功能
- 2024-10-14 一文带你了解docker常用命令 docker常用命令及参数
- 2024-10-14 Docker最佳实践的反模式 docker反向代理
- 2024-10-14 docker中容器如何实现通信 docker容器之间如何通信
- 2024-10-14 工程化Docker:确保应用程序的可靠性、可扩展性和可维护性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)