如何手动给Docker容器设置静态IP

时间:2022-04-28
本文章向大家介绍如何手动给Docker容器设置静态IP,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

要点:

1.首先需要在宿主机上虚拟出来一个真实可用桥接网卡比如br0

2.docker启动的时候默认使用br0进行桥接网络

3.创建docker容器的时候使用--net=none模式

4.手动为每个创建的容器生成静态ip。但是ip每次在重启容器的时候就会失效

这样的方式其实也是必须自己维护一个ip资源池,不然的话可能ip有问题就会导致不能访问

其实还是利用了docker桥接网络的模式,在宿主机创建一对虚拟网卡,然后将一块桥接到本地网桥上,经另外一块网卡通过容器的命名空间绑定到该容器上,然后对容器 命名空间中的网卡进行设置ip。

理解了netns相应的原理之后可以进行模拟实践:

# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
jdk6-tomcat6-sshd-new     latest              ee3e2b60058d        4 days ago          970.3 MB

创建一个无网络环境的容器sshd-test,该容器创建好后默认只会有一个lo回环网口。
# docker run -itd --name sshd-test -h testssh --net=none jdk6-tomcat6-sshd-new 
3ceb61136590f1362be67f1911591d0b3ca41657c6b33f45982b0df4489f5f73

获取该容器的PID为13157,后面会用到
# docker inspect -f "{{.State.Pid}}" 3ceb61136590f1362be67f1911591d0b3ca41657c6 
13157

添加一对虚拟网卡,分别为veth_3ceb6和eth0
# ip link add veth_3ceb6 type veth peer name eth0
将虚拟网卡veth_3ceb6桥接到br0上
# brctl addif br0 veth_3ceb6 
激活veth_3ceb6网卡,并容器内部的网卡eth0绑定到该容器的网络命名空间内
# ip link set veth_3ceb6 up
# ip link set eth0 netns 13157
将该容器的网络命名空间暴露出来
# mkdir -p /var/run/netns
# ln -s /proc/13157/ns/net /var/run/netns/13157 

此时查看该容器就会发现已经多了一块网卡eth0@if850
# docker exec sshd-test ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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
849: eth0@if850: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 46:0a:e8:5b:ac:c0 brd ff:ff:ff:ff:ff:ff

查看网络状况,新加的网卡名称为eth0
# docker exec sshd-test ifconfig -a 
eth0      Link encap:Ethernet  HWaddr 46:0A:E8:5B:AC:C0  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

通过netns激活该容器内部的eth0网卡,并添加网络信息
# ip netns exec 13157 ip link set dev eth0 name eth0
# ip netns exec 13157 ip link set eth0 up
# ip netns exec 13157 ip addr add 10.0.0.2/23 dev eth0
# ip netns exec 13157 ip route add default via 10.0.0.254
完成最后的网络信息的添加后,就可以实现给该容器附加一个独立vlan中的网络。

以上操作相当于是手工给容器设置了一个网络栈,并通过netns将可用的IP附加到容器内部,以实现最基本的容器内部固定ip,且和宿主机共享vlan。

参考文档:

https://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html https://www.xiaomastack.com/2015/02/06/docker-static-ip/ http://blog.csdn.net/samxx8/article/details/46776073