Docker固定IP配置与Weave管理工具使用指南

作者:技术拾光时间:2026-07-25 09:15:23浏览:274

为Docker配置固定IP 对于很多新手来说,配置容器固定IP常常让人觉得繁琐。实际上,核心思路并不复杂:先创建一个网桥,将物理网卡桥接上去,然后容器以--net=none方式启动,最后手动配置网络命名空间。下面以Linux bridge为例,详细介绍完整流程。 首先,准备一个网桥。假设命名为doc

为Docker配置固定IP

对于很多新手来说,配置容器固定IP常常让人觉得繁琐。实际上,核心思路并不复杂:先创建一个网桥,将物理网卡桥接上去,然后容器以--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也会自动清理,无需额外操作。

使用Weave管理Docker网络

除了手动配置,社区中还有一种更优雅的方案——Weave。它专门用于解决跨主机容器间通信的问题,同时在网络隔离、动态添加方面表现优异。

Weave简单使用

安装过程非常直接:

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

启动Weave路由器(它本身以Docker容器运行):

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

启动后查看网桥,会发现多了一个weave桥:

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

容器列表中也能看到Weave的路由器:

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

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

c1=$(weave 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=$(weave 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)

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

weave 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/avg/max/mdev = 1.131/1.667/2.345/0.505 ms

Weave其他特性

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

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

总结:手动配置固定IP适合对网络细节有完全掌控需求的场景,而Weave则在跨主机、动态调度、安全隔离方面提供了更开箱即用的解决方案。具体选择哪种方式,取决于实际部署规模和运维习惯。