CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口

注意第一种方法是在网上找的 , 我并没有执行成功 , 但是他分析的很不错,
可以参考第二种方法

首先需要明确docker的网桥模式,网桥工作在二层(OSI堆栈),是通用网络设备的一种,可以设置IP地址。有了IP地址,Linux便可通过路由表或IP表,在网络层定位网桥,这就相当于有了一个虚拟网卡,即docker0。docker0默认的地址划分:IP(172.17.0.1/16),在启动容器时,docker会在宿主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备,容器启动时,Docker引擎将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在宿主机中,以veth***这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

方法一:

1. 首先检查宿主机的网络配置

需要先安装网桥管理工具包

yum install bridge-utils -y

1)检查网桥brctl show

[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.000000000000       no
2) 检查ip
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:85:de:4a brd ff:ff:ff:ff:ff:ffinet 192.168.137.130/24 brd 192.168.137.255 scope global dynamic eno16777736valid_lft 1627sec preferred_lft 1627secinet6 fe80::20c:29ff:fe85:de4a/64 scope linkvalid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWNlink/ether 02:42:32:06:66:2d brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:32ff:fe06:662d/64 scope linkvalid_lft forever preferred_lft forever

可以看到docker创建的虚拟网卡docker0的网段为172.17.0.1/16

3)查看路由: ip route

[root@localhost ~]# ip route
default via 192.168.137.2 dev eno16777736  proto static  metric 100
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1
192.168.137.0/24 dev eno16777736  proto kernel  scope link  src 192.168.137.130  metric 100

即172.17.0.0/16网段的包均通过docker0网桥来转发.

  1. 再来查看容器的ip: docker exec -it <容器名称> ip a
[root@localhost ~]# docker exec -it mn  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
129: eth0@if130: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP   link/ether 02:42:ac:11:0a:02 brd ff:ff:ff:ff:ff:ff  inet 172.17.0.0/16 brd 172.17.10.255 scope global eth0  valid_lft forever preferred_lft forever

可以看到虚拟网卡eth0的ip为172.17.0.0

  1. 查看容器内的路由: docker exec -it c_name ip route
[root@localhost ~]# docker exec -it mn ip route
default via 172.17.10.1 dev eth0
172.17.0.0/16 dev eth0 scope link  src 172.17.0.1

由此可知172.17.0.0网段的包均走容器内的eth0,默认网关为172.17.10.1

  1. 如果容器中无法ping通外网,首先查看能否ping通网关。如果网关都无法ping通,说明网桥或网段有问题。这里就可以用tcpdump来查看。比如监控上面第一步的网桥接口tcpdump -i vethaef304e -nn,正常的网络包应答如下:bash-4.4# ping -c 1 8.8.8.8
[root@localhost ~]#  tcpdump -i vethaef304e -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vethaef304e, link-type EN10MB (Ethernet), capture size 262144 bytes
17:17:16.282976 IP 172.17.10.2 > 8.8.8.8: ICMP echo request, id 2304, seq 0, length 64
17:17:16.325812 IP 8.8.8.8 > 172.17.10.2: ICMP echo reply, id 2304, seq 0, length 64
17:17:21.297595 ARP, Request who-has 172.17.10.1 tell 172.17.10.2, length 28
17:17:21.297656 ARP, Reply 172.17.10.1 is-at f2:29:f4:5b:3d:f2, length 28

异常时就只有request who-has包,没有reply

  1. 问题解决

查看网桥,路由和ip均没发现问题,试试修改docker0的默认网段,居然成功了,步骤如下:

1) 删除原有配置

service docker stop
ip link set dev docker0 down
brctl delbr docker0
iptables -t nat -F POSTROUTING
  1. 创建新的网桥
brctl addbr docker0
ip addr add 172.17.10.1/24 dev docker0
ip link set dev docker0 up
  1. 修改docker配置,在/etc/docker/daemon.json中追加bip如下,注意json的格式,bip前面需要有,root@XXXXXX~# cat /etc/docker/daemon.json
vim /etc/docker/daemon.json
{"insecure-registries":["x.x.x"],"bip": "172.17.10.1/24"
}

4)重启docker: systemctl restart docker

[root@localhost ~]# systemctl  restart  docker

方法二:

docker容器自动分配的ip为172.17.0.0/24网段的ip,开发用的物理机和这个容器不在一个网段,根本没法访问到,这时候网上查到docker有一种网络模式是–net=host,就是让容器直接使用宿主服务器的ip,这样开发用的物理机就能够访问这个容器的接口了

在执行启动命令的时候 , 加一个属性 --net=host

docker run --name mn -p 80:80 -d --net=host nginx

CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口相关推荐

  1. 在虚拟机docker启动mysql但是宿主机无法访问的问题

    在DockerHub官网查看mysql启动的命令,发现都没有指定端口映射,于是我模仿着执行的命令如下: docker run --name testmysql -e MYSQL_ROOT_PASSWO ...

  2. docker中容器与宿主机之间的网络关系

    接上一篇jupter远程访问 docker中容器与宿主机之间的网络关系 一.PC上的网络关系 1.网卡的物理地址 网卡的物理地址(MAC地址):是网卡的唯一标识.由生产厂商写入网卡中.MAC地址就如同 ...

  3. 宿主机172连接容器mysql_开发时从宿主机连接容器中的MySQL

    从宿主机连接Docker容器中的MySQL 刚接触Docker,电脑安装Docker后,使用docker命令pull了一个MySQL5.6的Docker镜像,之后docker run启动创建容器. 可 ...

  4. docker容器和宿主机的主机名映射失败

    一.为什么将 Oracle 部署在 docker容器中 我们首先通过 docker 安装了 oracle11g 版本的 Oracle 数据库--不要问我为什么通过 docker 安装数据库,正确做法或 ...

  5. Docker配置mysql以及宿主机容器目录挂载

    Docker配置mysql以及宿主机容器目录挂载 在之前的docker 挂载中主要说明了创建数据卷并挂载的方式.现在我们做一种创建普通目录并进行挂载的方式. 基于mysql镜像的拉取并进行配置. 首先 ...

  6. DOCKER容器与宿主机同网段互相通信

    相关阅读: Docker容器时间与宿主机同步 使用Docker搭建WordPress博客 Docker私有仓库搭建及镜像删除 Docker镜像的导入和导出 在Docker上部署Ambari 博主最近在 ...

  7. 宿主机无法访问docker容器的坑

    docker的网络有3中模式 bridge host none 经常用的bridge方式,安装docker后默认的bridge是docker0,按常理说在根据docker0建立容器之后,宿主机是可以p ...

  8. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

    Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 参考文章: (1)Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 (2)https://www.cnbl ...

  9. hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...

    本人有一个3节点hadoop, 启动了3个docker容器, 众所周知, docker容器内服务的端口是可以映射到宿主机的端口的, 我采用-P将容器的所有端口映射到主机端口, 命令如下: docker ...

最新文章

  1. Day 14 知识点串讲 下
  2. 如何搭建socks5和ss节点_以太坊区块链搭建与使用(三)-联盟链
  3. 常见测量矩阵的MATLAB实现
  4. java将html实体字符转换成正常字符
  5. Statement和PreparedStatement深入学习总结
  6. LeetCode 1694. 重新格式化电话号码(模拟)
  7. eclipse html tab宽度,Eclipse 设置Tab键为4个空格
  8. 物联网-移远M26模块OpenCPU开发第1讲
  9. eclipse运行java项目
  10. 树莓派安装Gqrx软件(Linux下SDR 软件无线电接收软件之一)
  11. 数据结构:线性表的顺序存储结构,实现集合的交差并补
  12. IR2104全桥驱动的自举问题
  13. 求职时,怎样判断一家公司是否靠谱?
  14. 树莓派/linux 功能配置(含网络)不定期更新
  15. 分库分表实战(第1期):一叶知秋 —— 图览分库分表外卖订单项目
  16. 基于web在线购物商城网站的设计与实现(学生网页设计作业源码)
  17. web编程期中项目作业
  18. 计算机同S7-300PLC通讯,S7-300PLC主站之间的PROFIBUS-DP通讯详解
  19. 万字整理联邦学习系统架构设计参考
  20. 【新书预告】《Adobe Flex大师之路》即将上市,敬请关注!

热门文章

  1. apache配置文件解析(httpd.conf)
  2. json mysql 字段 默认值_mysql json字段
  3. 项目管理工具-PDCA
  4. Vue3中的API——选项式API、组合式API
  5. 蒙氏教育将好的教育带给孩子
  6. Qt基础教程:对齐方式
  7. 提交方式post和get有什么区别?
  8. echarts世界地图组件轮播、鼠标移入移出事件
  9. 树莓派-C++之GUI
  10. js IntersectionObserver监听元素的显示与隐藏,图片懒加载