侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 119171 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

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

2023-12-01 星期五 / 0 评论 / 0 点赞 / 8 阅读 / 3989 字

要点:1.首先需要在宿主机上虚拟出来一个真实可用桥接网卡比如br02.docker启动的时候默认使用br0进行桥接网络3.创建docker容器的时候使用--net=none模式4.手动为每个创建的容器

要点:

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

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

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

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

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

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

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

# docker imagesREPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZEjdk6-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 a1: 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 forever849: 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.htmlhttps://www.xiaomastack.com/2015/02/06/docker-static-ip/http://blog.csdn.net/samxx8/article/details/46776073

广告 广告

评论区