在腾讯云服务器中使用pipework让Docker容器直接获得公网IP 作者: Fmq 时间: 2019-01-09 分类: 随手笔记,搬运 pipework是由Docker的工程师Jérôme Petazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用。 源码地址:[github](https://github.com/jpetazzo/pipework "github") 利用腾讯云弹性网卡可以绑定多个IP的特性,我们可以为需要暴露在公网环境下的容器配置公网IP地址。 腾讯云服务器弹性网卡环境配置参考文章-[在腾讯云服务器中用ProxmoxVE建立基于LXC的Linux虚拟机](https://www.fmqcloud.com/archives/tc-pve.html "在腾讯云服务器中用ProxmoxVE建立基于LXC的Linux虚拟机"),包括控制面板的配置和在宿主机内添加路由规则。 #### 安装 ```bash apt-get install iputils-arping git -y git clone https://github.com/jpetazzo/pipework cp pipework/pipework /usr/local/bin/ ``` #### 使用 先创建一个容器 `docker run -itd --name test debian /bin/bash ` 查看该容器的IP地址信息 [](/usr/uploads/2019/01/IP.png "IP") 用pipework配置一个名为br0的Linux bridge,并指定容器公网IP地址所对应的内网IP地址信息。 ```bash pipework br0 test 10.10.20.110@10.10.20.1 ``` 再次查看容器IP地址信息 [](/usr/uploads/2019/01/%E5%85%AC%E7%BD%91.png "公网") 这个时候,容器已经获得公网的IP地址,利用`curl ip.sb` 可以确认。 如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP。 `pipework br0 test dhcp` 支持如下dhcp客户端 - dhclient - udhcpc - dhcpcd - dhcp #### 清理 当容器被停止或者销毁时,pipework会自动销毁在宿主机和容器内添加的网卡及网桥。当再次需要获取公网IP地址时,需重新运行命令。 #### pipework的工作方式 ```bash 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 通过封装 Linux 上的 ip、brctl 等命令,简化了在复杂场景下对容器连接的操作命令,为我们配置复杂的网络拓扑提供了一个强有力的工具。 标签: 腾讯云, 弹性网卡, pipework, docker