Mac系统下docker容器无法使用--net host共享宿主机端口的解决方案
文章目录
- 背景
- 解决过程一
- 分析
- Mac系统下docker容器无法使用--net host共享宿主机端口的原因
- docker的网络配置
- host模式
- overlay模式
- macvlan模式
- bridge模式
- docker架构
- Linux的docker架构
- Mac下的docker架构
- Mac系统对docker的限制
- 解决无法使用--net host的方案
- docker映射某个范围内的端口列表代替--net host共享宿主机端口
- docker-compose.yml
- 命令行
- Dockerfile
- 修改nginx容器的启动方式,映射端口列表
- 参考博客:
背景
最近使用了Mac系统的电脑作为了测试服务器,但是在Mac系统的电脑使用docker安装nginx进行反向代理,以前在centos7系统的电脑上无往不利的docker容器启动方式,反而出现了问题。
启动方式:
docker run -it --name nginx --net host -v /Users/mac-server/Desktop/project:/var/www/html -v /Users/mac-server/Desktop/nginx:/nginx_conf -d nginx
以前在centos7的系统上容器构建后,都可以访问成功。进入nginx执行nginx -t
,配置文件没有问题;执行nginx -s reload
,重启nginx也没有报错。但是就是不能通过浏览器访问。
排除防火墙和80端口的问题,还是不能访问。
解决过程一
在经过多次卸载重装nginx容器都没能成功的情况下,就是用最常见的容器启动命令启动:
docker run -it --name nginx -p 80:80 -d nginx
结果浏览器可以直接进行访问了。
但是这样明显是不能满足我们的需求的,nginx需要进行反向代理的时候,未来项目的端口往往是位置的,所以使用 –net host共享宿主机端口 是比较好的解决方案。
分析
对比上文的容器启动命令,一般来说不是-v映射目录的问题,要不启动时会报错。多以应该问题出自--net host
上。
于是基于此进行分析,最终找到了原因。
Mac系统下docker容器无法使用–net host共享宿主机端口的原因
docker的网络配置
docker的网络配置分为四种,:host,overlay,macvlan,bridge
host模式
与宿主机共享网络,也就是在网络这块不会与宿主机隔离,而是共享宿主机的网络配置,并且 容器不会分配自己的ip地址。
需要注意的是,因为容器是与宿主机共享网络,并且容器不存在自己的ip, 端口映射不生效, -p,–publish,-P,和–publish-all都将被忽略,并产生一个警告
WARNING: Published ports are discarded when using host network mode
使用方法:
在创建容器时添加如下配置
--net host
overlay模式
分布式网络模式。可参考:https://docs.docker.com/network/overlay/
macvlan模式
直接连接宿主机的物理网络,为每个容器的虚拟网络接口分配MAC地址,相当于直接连接了宿主机的物理网络接口。
但是使用改模式需要注意以下几点:
- 会导致宿主机上有大量的MAC地址
- 需要宿主机支持一个物理接口分配多个MAC地址
- 如果应用程序可以使用bridge,overlay模式,那最好使用这两种方式建立网络
bridge模式
类似VMware的桥接网络,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
docker架构
Linux的docker架构
docker是在linux内核容器基础上实现的,linux安装docker后,会创建一个为docker0的虚拟网卡,linux宿机与docker容器之间的通信,通过docker0虚拟网卡进行
Mac下的docker架构
docker在OSX的实现方式,是首先创建一个linux的虚拟机,在将docker放入到虚拟机中实现,而对于linux虚拟机,与OSX之间的通信,目前版本采用/var/run/docker.sock
这种socket文件来通信,在OSX宿机中自然ping不通docker容器。
Mac系统对docker的限制
参考:https://docs.docker.com/docker-for-mac/networking/
因为MacOS无法访问Docker桥接网络,而恰恰Docker默认是使用bridge模式,所以导致Docker无法联网,并且无法与宿主机沟通。
Host主机网络驱动程序仅适用于Linux主机,并且不支持Docker for Mac,Docker for Windows或Docker EE for Windows Server。
所以docker容器无法使用–net host共享宿主机端口。
解决无法使用–net host的方案
docker容器使用--net host
共享宿主机端口,无非是因为在未来使用容器的过程中,宿主机与容器通信的端口不能确定。既然--net host
不能使用,不能共享宿主机端口,那么我们可以寻找一些替代方案。
docker映射某个范围内的端口列表代替–net host共享宿主机端口
不管在Dockerfile、命令行或docker-compose.yml中,都可以使用类似于8080-8090:8080-8090
的格式,来映射多个端口
docker-compose.yml
#create by winton wang
version: '3.6'
services:web:image: nginx:1.18ports:# 将会映射8080到8090这个范围内的端口- 8080-8090:8080-8090volumes:- ./www:/www
命令行
docker run -p 8080-8090:8080-8090 nginx
Dockerfile
EXPOSE 8080-8090
注意:
使用这种形式去映射大范围的端口,会占用用户大量的内存,尽量不要这样子做
修改nginx容器的启动方式,映射端口列表
docker run -it --name nginx -p 80:80 -p 7000-8000:7000-8000 -v /Users/mac-server/Desktop/project:/var/www/html -v /Users/mac-server/Desktop/nginx:/nginx_conf -d nginx
- 使用不常用的7000-8000端口,用于nginx的反向代理未来的项目,当然端口范围可根据实际情况修改。
- 如果这样做了,7000-8000端口就会都被占用,所以慎用。
- 如果7000-8000有端口已经被占用,则容器启动失败。
参考博客:
- Mac 下Docker无法访问外网与宿主机(解决办法和原因)
- Mac Docker Host模式不能用
- MAC DOCKER无法ping通容器解决方案
- docker 映射某个范围内的端口列表
Mac系统下docker容器无法使用--net host共享宿主机端口的解决方案相关推荐
- jenkin swindows启动_mac系统下docker 部署jenkin s
mac系统下docker 安装jenkins前提需要安装完docker,在进行以下步骤操作: 1.为了方便容器内对配置文件进行修改,需要先创建Jenkins挂载目录并授权权限; mkdir /User ...
- Mac 系统下 Rstudio连接虚拟机(远程)oracle数据库
Mac 系统下 Rstudio连接虚拟机(远程)oracle数据库 因为之前做的一个项目需要在mac系统上用Rstudio远程访问Oracle数据库,以对获得的数据进行进一步的分析~但是在网上找了很多 ...
- esxi 内核 linux,大娃套小娃系列-ESXI虚拟机安装Debian系统实现Docker容器
大娃套小娃系列-ESXI虚拟机安装Debian系统实现Docker容器 2021-04-03 20:01:00 8点赞 60收藏 12评论 先介绍一下我的新小主机,具体配置是Lenovo M93P+i ...
- windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同
windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同 介绍ubuntu系统下配置docker下GPU使用环境的文章很多,本文算是一个比较性梳理. 主要比较一下wsl ...
- Mac系统下Gitlab部署、使用的详细教程
Mac系统下Gitlab部署.使用的详细教程 1.Gitlab部署前的准备工作 2.gitLab 创建账户.Group(组).Projects(项目) 3.Gitlab通用配置 GIT最小配置(use ...
- mac系统下,解决git clone速度慢导至失败的问题
mac系统下,解决git clone速度慢导至失败的问题 参考文章: (1)mac系统下,解决git clone速度慢导至失败的问题 (2)https://www.cnblogs.com/helenM ...
- 网络工程师必备知识:苹果MAC系统下使用USB转console线配置交换机的连接方法
现在用苹果操作系统的人越来越多,作为网络工程师的使用工具之一USB转串口线的转接头,如果在苹果系统下使用呢? 1.首先自然是先安装转接头光盘自带的驱动程序了.也可以到使用的品牌的官网上去下载. 2.安 ...
- 苹果电脑上使用linux环境变量,mac系统下修改环境变量
苹果电脑使用率越来越高,在mac系统下研发,性能要比在windows下快不少,既然要开发,免不了要配置环境变量.下面是学习啦小编收集整理的mac系统下修改环境变量,希望对大家有帮助~~ mac系统下修 ...
- Mac系统下SVN命令
Mac系统下SVN命令 安裝 Subversion 首先您須要在您所要工作的機器上安裝 Subversion 這套系統. 若您的機器上已經安裝好了, 您可以跳過這一步. 若您在 FreeBSD 底下, ...
最新文章
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
- Spring boot的配置类
- flow 静态类型检查 js
- html按钮分享功能实现,一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)...
- 东莞村财登录显示服务器断开,“东莞村财”APP运行一年多,还有很多村民股东未注册...
- 在Windows系统下搭建ELK日志分析平台
- 后代选择+++margin-right:auto
- 在SIP对讲机中RTP/RTCP的实现
- slk文件转换器安卓版_CoolUtils Total Excel Converter下载
- 2020年如何利用外链提升网站排名和权重?
- C程序-超简单的猜数字-游戏
- worldpress php部署,用XAMPP搭建本地主机(附worldpress的安装)
- DCOS(centos 7.4/7.6)
- 7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学
- 安卓修改电池容量教程_手机电池校正 - 安卓最精确的电量校正方法 - iTeknical
- Ubuntu命令下卸载软件
- Golang 二叉树遍历
- 使用man命令,出现 ”No manual entry for” 的解决办法
- CDN到底是个什么鬼?看完这篇你就懂了!
- 【Android】性能测试之获取Android流量数据