游乐游手机版
首页/系统平台/文章详情

Docker设置固定IP与Weave管理工具使用教程

时间:2026-06-16 10:13
为Docker容器配置固定IP的详细教程 对于许多Docker新手来说,配置容器固定IP可能显得繁琐。但核心思路其实很简单:先创建一个Linux网桥,将物理网卡桥接上去,然后以--net=none模式启动容器,最后手动配置网络命名空间即可。下面以Linux bridge为例,详细介绍完整流程。 首先

为Docker容器配置固定IP的详细教程

对于许多Docker新手来说,配置容器固定IP可能显得繁琐。但核心思路其实很简单:先创建一个Linux网桥,将物理网卡桥接上去,然后以--net=none模式启动容器,最后手动配置网络命名空间即可。下面以Linux bridge为例,详细介绍完整流程。

首先,创建一个网桥,这里假设命名为docker:

br_name=docker
brctl addbr $br_name
ip addr add 192.168.33.2/24 dev $br_name
ip addr del 192.168.33.2/24 dev em1
ip link set $br_name up
brctl addif $br_name eth0

网桥准备就绪后,启动容器时务必指定--net=none参数:

hostname='docker.test.com'
cid=$(docker run -d -i -h $hostname --net=none -t centos)
pid=$(docker inspect -f '{{.State.Pid}}' $cid)

接下来最关键的一步:为容器配置网络命名空间并分配固定IP:

# 设置网络命名空间
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid

# 创建veth pair并接入网桥
ip link add q$pid type veth peer name r$pid
brctl addif $br_name q$pid
ip link set q$pid up

# 配置容器内部网卡
fixed_ip='192.168.33.3/24'
gateway='192.168.33.1'
ip link set r$pid netns $pid
ip netns exec $pid ip link set dev r$pid name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add $fixed_ip dev eth0
ip netns exec $pid ip route add default via 192.168.33.1

完成上述配置后,容器的网络完全独立。如果容器内运行了sshd服务,就能通过192.168.33.3直接SSH连接,极为便捷。虽然手动步骤较多,但使用Pipework工具可以一行命令完成——它封装了网关配置、macvlan、VLAN、DHCP等所有功能:

pipework docker0 be8365e3b2834 10.88.88.8/24

当需要删除容器时,网络清理同样简单:

docker stop $cid
docker rm $cid
ip netns delete $pid

提示:删除网络命名空间时,veth pair会自动清理,无需手动处理。

使用wea ve管理Docker跨主机网络

除了手动配置,社区还提供了更优雅的解决方案——Wea ve。它专为跨主机Docker容器间通信而设计,在网络隔离和动态添加方面表现出色。

wea ve简单使用

安装过程非常直接:

sudo wget -O /usr/local/bin/wea ve https://raw.githubusercontent.com/zettio/wea ve/master/wea ve
sudo chmod a+x /usr/local/bin/wea ve

启动Wea ve路由器,它本身以Docker容器形式运行:

[root@h-46mow360 ~]# wea ve launch
Unable to find image 'zettio/wea ve' locally
3b3a3db2c186fccb5203dcc269b3febbbbf126591a7ebd8117a8a5250683749f

启动完成后,查看网桥会发现新增一个wea ve桥接:

[root@h-46mow360 ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.56847afe9799   no       veth801050a
wea ve       8000.7afc2a03325e   no       vethwepl2146

在容器列表中同样可以看到Wea ve路由器:

[root@h-46mow360 ~]# docker ps
CONTAINER ID   IMAGE                          COMMAND           CREATED         STATUS         PORTS                                                      NAMES
3b3a3db2c186   zettio/wea ve:git-a34e214201cb   "/home/wea ve/wea ver"   About a minute ago   Up About a minute   0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp   wea ve

现在在两台物理机上分别启动一个容器,并分配不同子网的IP:

c1=$(wea ve run 10.0.3.3/24 -t -i -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run systemd:systemd /usr/lib/systemd/systemd)
c2=$(wea ve run 10.0.3.5/24 -t -i -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run systemd:systemd /usr/lib/systemd/systemd)

此时两个容器之间无法互通,需要将两台物理机的Wea ve路由器连接起来(注意防火墙需开放6783端口,包括TCP和UDP):

wea ve connect 10.33.0.9

连接完成后,跨主机的容器即可互相ping通:

[root@host2 ~]# nsenter --mount --uts --ipc --net --pid --target $(docker inspect --format "{{.State.Pid}}" "$c2")
-bash-4.2# ping -c 3 10.0.3.3
PING 10.0.3.3 (10.0.3.3) 56(84) bytes of data.
64 bytes from 10.0.3.3: icmp_seq=1 ttl=64 time=2.34 ms
64 bytes from 10.0.3.3: icmp_seq=2 ttl=64 time=1.52 ms
64 bytes from 10.0.3.3: icmp_seq=3 ttl=64 time=1.13 ms
--- 10.0.3.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/a vg/max/mdev = 1.131/1.667/2.345/0.505 ms

wea ve其他实用特性

Wea ve的能力远不止跨主机通信,以下几个特性在实践中非常实用:

  • 应用隔离:不同子网的容器默认相互隔离。即使在同一台物理机上,10.0.3.0/24和10.0.4.0/24的容器也不会互相干扰。跨主机场景同理。
  • 动态添加网络:对于非通过wea ve run启动的容器,可使用wea ve attach 10.0.1.1/24 $id动态添加网络,使用detach删除。
  • 安全性:启动时添加-password wEaVe参数后,Wea ve节点间的通信将进行加密。
  • 与宿主机网络通信:执行wea ve expose 10.0.1.102/24后,该IP会直接配置在Wea ve网桥上,实现宿主机与容器之间的互通。
  • 查看路由状态wea ve ps命令可列出当前节点的所有Wea ve路由信息。
  • 外网访问容器:通过NAT配合iptables规则,可将容器的端口暴露到外部网络。

总结:手动配置固定IP适用于需要完全掌控网络细节的场景,而Wea ve在跨主机通信、动态调度、安全隔离等方面提供了更开箱即用的方案。具体选择哪一种,取决于你的实际部署规模和运维偏好。

来源:https://www.jb51.net/os/other/390584.html
上一篇安卓X86强制竖屏与横屏旋转解决方法 下一篇Device Mapper插件改变Docker容器大小方法详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
VMware虚拟机无法识别USB设备的解决方法
系统平台 · 2026-06-16

VMware虚拟机无法识别USB设备的解决方法

虚拟机中插入USB设备却没有反应,这是不少用户在使用VMware时都会遇到的常见问题,特别是当你急需使用U盘、加密狗或鼠标键盘时,确实令人焦虑。实际上,解决办法并不复杂,关键是要让VMware正确识别并接管USB设备。下面分别针对Windows和macOS两种系统,将详细步骤逐一说明。 一、Wind

Device Mapper插件改变Docker容器大小方法详解
系统平台 · 2026-06-16

Device Mapper插件改变Docker容器大小方法详解

在 CentOS、RHEL、Fedora 或其他默认缺少 AUFS 支持的 Linux 发行版上部署 Docker 时,Device Mapper 存储驱动几乎是必须使用的方案。一旦将其设为默认存储后端,所有容器都会被存储在一个 100GB 的稀疏文件中,且每个容器默认仅有 10GB 的容量上限。在

安卓X86强制竖屏与横屏旋转解决方法
系统平台 · 2026-06-16

安卓X86强制竖屏与横屏旋转解决方法

Android x86 在电脑上运行安卓应用时,最令人头疼的场景之一就是屏幕突然变成横屏——明明是个竖屏应用,却非得把脖子拧成麻花才能看清楚。其实解决方式并不复杂,这里提供两个经过验证的有效方法,能让所有应用强制保持竖屏显示。 Android x86 本质上是 Google 为 PC 平台量身定制的

手把手教你Docker中MySQL容器的创建与连接详细教程
系统平台 · 2026-06-16

手把手教你Docker中MySQL容器的创建与连接详细教程

在进行Docker MySQL容器创建时,业界推荐采用Dockerfile构建方式,而不是通过docker commit提交镜像。尽管后者也能实现,但团队协作中难以追溯容器内的具体变更,可维护性较差。本教程的方案基于Dockerfile,并引入supervisord多服务管理——由于Dockerfi