侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Docker 配置固定IP及桥接的实现方法

Docker  /  管理员 发布于 5年前   480

docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip。这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主机的端口,因而有很多项目使用overlay来为docker提供网络的配置,比如Pipework、Flannel、Kubernetes、Weave、opencontrail等。

想要使用overlay来为docker配置网络,需要首先了解下docker的网络模式:

一、Docker的四种网络模式

Docker在创建容器时有四种网络模式,bridge为默认不需要用--net去指定,其他三种模式需要在创建容器时使用--net去指定。

  1. bridge模式,使用--net=bridge指定,默认设置。
  2. none模式,使用--net=none指定。
  3. host模式,使用--net=host指定。
  4. container模式,使用--net=container:容器名称或ID指定。(如:--net=container:30b668ccb630)

bridge模式:docker网络隔离基于网络命名空间<Network Namespace>,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

二、Docker配置自己的网桥

例子一、

1)、自定义新网桥

root@Docker:~# dpkg -l | grep bridge*    #查看是否有安装brctl命令包ii bridge-utils 1.5-6Ubuntu2  amd64    Utilities for configuring the Linux Ethernet bridgeroot@Docker:~# apt-get install bridge-utils #安装brctl命令包root@Docker:~# docker -v          #docker版本Docker version 1.5.0, build a8a31efroot@Docker:~# ps -ef | grep docker     #正在运行 root   6834  1 0 16:28 ?    00:00:00 /usr/bin/docker -droot@Docker:~# service docker stop     #停止root@Docker:~# ifconfig | grep docker0   #docker默认网桥docker0 Link encap:以太网 硬件地址 56:84:7a:fe:97:99root@Docker:~# ifconfig docker0 down    #停止docker默认网桥root@Docker:~# brctl show          #查看物理机上有哪些网桥root@Docker:~# brctl delbr docker0     #删除docker默认网桥root@Docker:~# brctl addbr docker_new0   #自定义网桥root@Docker:~# ifconfig docker_new0 192.168.6.1 netmask 255.255.255.0  #给自定义网桥指定IP和子网root@Docker:~# ifconfig | grep docker_new0 #查看发现自定义网桥已经启动docker_new0 Link encap:以太网 硬件地址 0a:5b:26:48:dc:04      inet 地址:192.168.6.1 广播:192.168.6.255 掩码:255.255.255.0root@Docker:~# echo 'DOCKER_OPTS="-b=docker_new0"' >> /etc/default/docker #指定网桥写入docker配置文件root@Docker:~# service docker start     #启动dockerroot@Docker:~# ps -ef | grep docker     #成功启动,并且成功加载了docker_new0root  21345  1 0 18:44 ?    00:00:00 /usr/bin/docker -d -b=docker_new0root@Docker:~# brctl show          #查看当前网桥下是否有容器连接bridge name       bridge id       STP enabled  interfacesdocker_new0      8000.fa3ce276c3b9      no      root@Docker:~# docker run -itd CentOS:centos6 /bin/bash         #创建容器测试root@Docker:~# docker attach 7f8ff622237f                #进入容器[root@7f8ff622237f /]# ifconfig eth0 | grep addr             #容器IP已经和自定义网桥一个网段,该容器IP为DHCP自动分配,不属于指定固定IPeth0   Link encap:Ethernet HWaddr 02:42:C0:A8:06:02      inet addr:192.168.6.2 Bcast:0.0.0.0 Mask:255.255.255.0     inet6 addr: fe80::42:c0ff:fea8:602/64 Scope:Linkroot@Docker:~# brctl show          #该网桥上已经连接着一个网络设备了bridge name        bridge id       STP enabled  interfacesdocker_new0      8000.fa3ce276c3b9      no     veth17f560a

注:veth设备是成双成对出现的,一端是容器内部命名eth0,一端是加入到网桥并命名的veth17f560a(通常命名为veth*),他们组成了一个数据传输通道,一端进一端出,veth设备连接了两个网络设备    并实现了数据通信。

root@Docker:~# wget https://github.com/jpetazzo/pipework/archive/master.zip #下载 pipeworkroot@Docker:~# unzip master.zip      #解压root@Docker:~# cp pipework-master/pipework /usr/bin/           #拷贝pipework到 /usr/bin/下root@Docker:~# chmod +x /usr/bin/pipework  #赋予该命令执行权限root@Docker:~# pipework docker_new0 -i eth1 $(docker run -itd -p 9197:80 centos:centos6 /bin/bash) 192.168.6.27/[email protected] #创建容器,并指定固定IP格式:pipework 网桥名 -i 指定在那块网卡上配置 <容器名or容器ID> 指定容器内IP/子网@网关 注:容器内网关就是物理机网桥的IP        root@Docker:~# docker attach 2966430e2dbe  #进入新容器 [root@2966430e2dbe /]# ifconfig       #容器内IP为指定的IP 192.168.6.27eth0   Link encap:Ethernet HWaddr 02:42:C0:A8:06:05               inet addr:192.168.6.7 Bcast:0.0.0.0 Mask:255.255.255.0    #docker_new0网桥创建容器时DHCP分配的IPeth1   Link encap:Ethernet HWaddr 82:DB:F7:A3:33:92      inet addr:192.168.6.27 Bcast:0.0.0.0 Mask:255.255.255.0    #pipework指定的固定IP,网桥还是docker_new0[root@2966430e2dbe /]# route -n       #查看路由路径Kernel IP routing tableDestination  Gateway    Genmask    Flags Metric Ref  Use Iface0.0.0.0    192.168.6.1  0.0.0.0    UG  0   0    0 eth0192.168.6.0  0.0.0.0    255.255.255.0 U  0   0    0 eth0192.168.6.0  0.0.0.0    255.255.255.0 U  0   0    0 eth1[root@2966430e2dbe /]# ping www.linuxidc.com  #测试网络PING www.linuxidc.com (119.75.218.70) 56(84) bytes of data.64 bytes from 119.75.218.70: icmp_seq=1 ttl=127 time=3.98 ms64 bytes from 119.75.218.70: icmp_seq=2 ttl=127 time=2.98 ms[root@2966430e2dbe /]# netstat -anptu | grep 80               #容器内80端口已经开启tcp    0   0 :::80           :::*            LISTEN   -root@Docker:~# telnet 192.168.6.27 80    #物理机上测试指定的IP是否和映射的端口等通信正常Trying 192.168.6.27...Connected to 192.168.6.27.Escape character is '^]'.root@Docker:~# iptables-save > iptables-rules #拷贝防火墙规则到本地文件root@Docker:~# vi iptables-rules       #打开规则文件查看你会发现你物理机的防火墙自动添加了很多条规则,这个是容器到网桥到本地网卡到公网的地址转换通信规则

例子二:

首先,配置一个用于创建container interface的网桥,可以使用ovs,也可以使用Linux bridge,以Linux bridge为例:

br_name=dockerbrctl addbr $br_nameip addr add 192.168.33.2/24 dev $br_nameip addr del 192.168.33.2/24 dev em1ip link set $br_name upbrctl addif $br_name eth0

接着,可以启动容器了,注意用--net=none方式启动:

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

下面,为该容器配置网络namespace,并设置固定ip:

# set up netnsmkdir -p /var/run/netnsln -s /proc/$pid/ns/net /var/run/netns/$pid# set up bridgeip link add q$pid type veth peer name r$pidbrctl addif $br_name q$pidip link set q$pid up# set up docker interfacefixed_ip='192.168.33.3/24'gateway='192.168.33.1'ip link set r$pid netns $pidip netns exec $pid ip link set dev r$pid name eth0ip netns exec $pid ip link set eth0 upip netns exec $pid ip addr add $fixed_ip dev eth0ip netns exec $pid ip route add default via 192.168.33.1

这样,容器的网络就配置好了,如果容器内部开启了sshd服务,通过192.168.33.3就可以直接ssh连接到容器,非常方便。上面的步骤比较长,可以借助pipework来为容器设置固定ip(除了设置IP,还封装了配置网关、macvlan、vlan、dhcp等功能):

pipework docker0 be8365e3b2834 10.88.88.8/24

那么,当容器需要删除的时候,怎么清理网络呢,其实也很简单:

# stop and delete containerdocker stop $ciddocker rm $cid# delete docker's net namespace (also delete veth pair)ip netns delete $pid

更多docker网络的配置,可以参考官方手册。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    Visual studio 2017如何发布dotnet core到docker
    下一条:
    Docker 镜像、容器、仓库的概念及应用详解
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤(0个评论)
    • 在MacBook下laravel项目多php版本docker开发环境配置方案(0个评论)
    • 在docker环境中部署docker部署elk架构流程步骤(1个评论)
    • docker compose跟Dockerfile的区别浅析(0个评论)
    • Ubuntu 22.04系统中安装podman流程步骤(1个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2020-06
    • 2021-05
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-11
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客