为什么要让docker桥接物理网络?


docker默认提供了一个隔离的内网环境,启动时会建立一个docker0的虚拟网卡,每个容器都是连接到docker0网卡上的。而docker0的ip段为172.17.0.1,若想让容器与宿主机同一网段的其他机器访问,就必须在启动docker的时候将某个端口映射到宿主机的端口上才行,例如:docker run -itd -p 22 centos。这是我们所不能接受的,想想每个应用都要绞尽脑汁的去设置端口,因为不能重复,如果应用有多端口那更是不堪设想啊。所以为了让容器与宿主机同一个网段,我们需要建立自己的桥接网络。

centos7宿主机上建立Docker桥接物理网络过程


宿主机网卡信息:

DEVICE=ens33
IPADDR=192.168.179.99
GATEWAY=192.168.179.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8

创建桥接物理网络

(1)新建br0桥接网络,brctl show可以查看(需安装bridge-utils)

(2)将宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置到br0上

(3)删除宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置

(4)将宿主机物理网卡加入到br0

过程步骤如下


自定义br0桥接网卡

[root@localhost ~]# cd  /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33.bak
[root@localhost network-scripts]# vim ifcfg-ens33
BRIDGE="br0"#加上一行任意位置,指定桥接网卡的名字,告诉ens33 br0的流量可以通过ens33

创建一个br0网卡,ens33是物理网卡,br0是桥接网卡

[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@localhost network-scripts]# vim ifcfg-br0
BOOTPROTO="static"
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"  #桥接网卡,不是物理网卡,流量会桥接到真实网卡上面去
IPADDR=192.168.179.99
GATEWAY=192.168.179.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@localhost network-scripts]# ifup ifcfg-br0
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# [root@localhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.179.99  netmask 255.255.255.0  broadcast 192.168.179.255inet6 fe80::20c:29ff:feb4:8832  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:b4:88:32  txqueuelen 1000  (Ethernet)RX packets 19  bytes 1288 (1.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 18  bytes 1668 (1.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 fe80::42:55ff:feda:5064  prefixlen 64  scopeid 0x20<link>ether 02:42:55:da:50:64  txqueuelen 0  (Ethernet)RX packets 103  bytes 6328 (6.1 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 71  bytes 78767 (76.9 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500ether 00:0c:29:b4:88:32  txqueuelen 1000  (Ethernet)RX packets 8524  bytes 8954821 (8.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2524  bytes 278175 (271.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000c29934261   no      ens33
docker0     8000.0242b435f546   no      veth5404ab5

将docke0干掉

[root@localhost network-scripts]# ifconfig docker0 down
[root@localhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.179.99  netmask 255.255.255.0  broadcast 192.168.179.255inet6 fe80::20c:29ff:feb4:8832  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:b4:88:32  txqueuelen 1000  (Ethernet)RX packets 159  bytes 10966 (10.7 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 84  bytes 10820 (10.5 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500ether 00:0c:29:b4:88:32  txqueuelen 1000  (Ethernet)RX packets 8664  bytes 8966459 (8.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2591  bytes 288933 (282.1 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@localhost ~]# brctl delbr docker0
[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000c29934261   no      ens33

以后的容器使用br0这个网桥,就不再使用docker0了,因为新建了桥接网卡就不需要docker0了,只要保证有一个桥接网卡就行。

这个时候每一个容器的ip都和物理机的IP在一个网段了,容器可以直接上网,别的机器也可以连接容器了,跨网段也可以访问了。

[root@www ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -b br0 -H fd:// --containerd=/run/containerd/containerd.sock
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker[root@localhost  ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost  ~]# docker run -itd centos7-ssh
3a4e99ca426dd1586d831cfb02941a3c0652ade34c14875942dbe34edaca52ab
[root@www ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3a4e99ca426d        centos7-ssh         "/bin/sh -c /usr/sbi??   3 seconds ago       Up 2 seconds        22/tcp              upbeat_kirch
[root@localhost  ~]# docker exec -it 3a4e99ca426d ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.179.1  netmask 255.255.255.0  broadcast 192.168.179.255ether 02:42:c0:a8:b3:01  txqueuelen 0  (Ethernet)RX packets 10  bytes 768 (768.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2  bytes 84 (84.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@localhost  ~]# ifconfig | grep veth
veth0635c6e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
[root@localhost  ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000c29934261   no      ens33veth0635c6e[root@localhost ~]# docker exec 3a4e99ca426d   route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.179.99  0.0.0.0         UG    0      0        0 eth0
192.168.179.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

外网可以直接访问容器就不需要做NAT端口映射

Connecting to 192.168.179.1:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

如果不想通过DHCP分配使用(为了避免自动分配IP和宿主机的网关发生冲突)


安装pipework

[root@localhost ~]# yum install  git -y
[root@localhost ~]# git clone https://github.com/jpetazzo/pipework
Cloning into 'pipework'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 518 (delta 2), reused 5 (delta 2), pack-reused 510
Receiving objects: 100% (518/518), 182.72 KiB | 13.00 KiB/s, done.
Resolving deltas: 100% (272/272), done.[root@localhost ~]# cp  pipework/pipework /usr/local/bin/

如果不想通过DHCP分配使用,为了避免自动分配IP和宿主机的网关发生冲突

[root@localhost ~]# docker run -itd  --name=os5 --net=none centos7-ssh
c4d7dfddd5167d7c0d1f2ef0f7c2cf418e6c4e58bb1284ca68494baf3732e480[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c4d7dfddd516        centos7-ssh         "/bin/sh -c /usr/sbi…"   11 seconds ago      Up 11 seconds                           os5[root@localhost ~]# docker inspect c4d7dfddd516 | grep -i ipaddr"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "",
#24位配置掩码  @后面接上网关(br0的Ip地址)
[root@localhost ~]# pipework br0 c4d7dfddd516  192.168.179.110/24@192.168.179.99
[root@localhost ~]# docker exec -it c4d7dfddd516 /bin/bash
[root@6fd3a25a39e9 ansible]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.179.110  netmask 255.255.255.0  broadcast 192.168.179.255ether da:35:b9:e9:b7:6d  txqueuelen 1000  (Ethernet)RX packets 34  bytes 3337 (3.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 11  bytes 873 (873.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@6fd3a25a39e9 ~]# traceroute www.baidu.com
traceroute to www.baidu.com (180.101.49.11), 30 hops max, 60 byte packets1  * * *2  192.168.179.2 (192.168.179.2)  0.246 ms  0.155 ms  0.113 ms[root@6fd3a25a39e9 ansible]# ping www.baidu.com
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=50 time=16.6 ms
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=50 time=20.4 ms
^C

Docker CentOS 7.x underlay网络 桥接网络配置相关推荐

  1. 使用Docker的macvlan为容器提供桥接网络及跨主机通讯

    对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人.相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍 ...

  2. linux网络管理(链路聚合、桥接网络、故障排查、常用工具)

    文章目录 网络进阶管理 链路聚合 桥接网络 链路聚合配置 Centos7/RHEL7配置bond聚合链路 Centos7/RHEL7配置bond0 Centos7/RHEL7配置bond1 Cento ...

  3. Linux下的网络桥接与链路聚合

    一.配置网络桥接 网络桥接: 网络桥接用网络桥实现共享上网主机和客户机除了利用软件外,还可以用系统自带的网络桥建立连接用双网卡的机器做主机. 网桥: 虚拟机和真实主机可以通信,使虚拟机可以直接使用真实 ...

  4. Linux——网络桥接

    什么是网络桥接? 在网络的使用中,有时需要搭建网络桥来实现网络桥接.例如在一台主机上制作一台虚拟机, 虚拟机是没有物理网卡的,这时虚拟机数据的发送和接收就需要通过主机上的物理网卡,需要主机 的内核来处 ...

  5. 如何在linux下配置网络桥接?-使初学者轻松远离ping不通的烦恼

    1.弄清楚什么是网桥(网络桥接)? 真机上的网卡是一个真实的物理设备,真机与外界进行通信需要网卡这个设备,网卡是由内核进行控制的 真机上的虚拟机也是一个真实的设备,但是这个虚拟机的网卡是虚拟的,它也有 ...

  6. 高级网络配置(包括链路聚合和网络桥接)

    1.网卡的链路聚合 网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行 可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度 网卡的链路聚合一般常用的有" ...

  7. Linux下网络桥接

    网络桥接 配置文件配置 编写配置文件在物理网卡上虚拟出桥接接口 DEVICE=enp0s25 BOOTPROTO=none ONBOOT=YES BRIDGE=br0 编写配置文件使用该桥接接口 DE ...

  8. 高级网络配置-网络桥接

    网络桥接 桥接主要应用于虚拟化,它使虚拟机与真机在网络连接上从寄生变成平行的关系 网络桥接的配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE ...

  9. 配置KVM网络桥接功能

    配置KVM网络桥接功能 配置之前我们来说说网桥: 网桥设备(Bridge),相当于现在的二层交换机,将同一网段的所有机器连接起来.我们配置的网络桥接功能就是将网络设备eth0加进br0(相当于一个交换 ...

最新文章

  1. java标识符的规则等
  2. vue中父组件怎么调用子组件
  3. python 生成器函数_Python 生成器函数
  4. std::string与output-operator的兼容问题
  5. ArcGIS 使用等高线和高程点数据生成DEM栅格数据
  6. Picture Control控件图象保存为bmp,jpg,emf,tif,gif
  7. J2EE(集合框架)
  8. 摩登天空音乐节,谁去?(更新4个舞台演出时间表)
  9. ACS高级计算机科学,2018-2019澳洲八大ACS认证学位全盘点!③
  10. 一些实用的功能强大的绘图软件
  11. uniapp实现微信小程序websocket+背景音频语音播报
  12. jpeg2000(j2k)图像编码解码:c++实现openjpeg内存流接口(memory stream)
  13. Windows10 常用快捷键
  14. iOS开发——单元测试
  15. 《zw版·Halcon-delphi系列原创教程》 邮票艺术品自动分类脚本
  16. 1转自 饮水思源 bbs.sjtu.edu.cn·[FROM: 202.120.25.97]
  17. bzoj3875 【Ahoi2014】骑士游戏 spfa处理后效性动规
  18. 教你如何在3分钟安装ps笔刷——黎乙丙
  19. 「XCS」以专用控制器视角,探讨智能机器人领域发展与应用
  20. 小程序页面绑定的点击事件不能触发

热门文章

  1. mac怎么强制退出程序,强制退出Mac程序,mac 强制退出程序
  2. rk3288 调试dvp摄像头_RK3288 - 双路摄像头的硬件外接实现
  3. 微众银行区块链李辉忠:多方大数据隐私计算平台为数据隐私加“安全锁”
  4. iOS-扫描二维码and条形码
  5. [转] R 解读逻辑回归结果:回归系数,OR
  6. linux中清除git记住密码的方法
  7. Idea 中出现:运行 Test 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。
  8. excel表格怎么筛选出空白的单元格
  9. search engin学习笔记1
  10. Pandas 统计分析基础 笔记2 任务4.2 掌握DataFrame的常用操作