文章目录

  • 背景
  • 解决过程一
    • 分析
  • 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共享宿主机端口的解决方案相关推荐

  1. jenkin swindows启动_mac系统下docker 部署jenkin s

    mac系统下docker 安装jenkins前提需要安装完docker,在进行以下步骤操作: 1.为了方便容器内对配置文件进行修改,需要先创建Jenkins挂载目录并授权权限; mkdir /User ...

  2. Mac 系统下 Rstudio连接虚拟机(远程)oracle数据库

    Mac 系统下 Rstudio连接虚拟机(远程)oracle数据库 因为之前做的一个项目需要在mac系统上用Rstudio远程访问Oracle数据库,以对获得的数据进行进一步的分析~但是在网上找了很多 ...

  3. esxi 内核 linux,大娃套小娃系列-ESXI虚拟机安装Debian系统实现Docker容器

    大娃套小娃系列-ESXI虚拟机安装Debian系统实现Docker容器 2021-04-03 20:01:00 8点赞 60收藏 12评论 先介绍一下我的新小主机,具体配置是Lenovo M93P+i ...

  4. windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同

    windows下wsl2中的ubuntu和ubuntu系统下docker使用gpu的异同 介绍ubuntu系统下配置docker下GPU使用环境的文章很多,本文算是一个比较性梳理. 主要比较一下wsl ...

  5. Mac系统下Gitlab部署、使用的详细教程

    Mac系统下Gitlab部署.使用的详细教程 1.Gitlab部署前的准备工作 2.gitLab 创建账户.Group(组).Projects(项目) 3.Gitlab通用配置 GIT最小配置(use ...

  6. mac系统下,解决git clone速度慢导至失败的问题

    mac系统下,解决git clone速度慢导至失败的问题 参考文章: (1)mac系统下,解决git clone速度慢导至失败的问题 (2)https://www.cnblogs.com/helenM ...

  7. 网络工程师必备知识:苹果MAC系统下使用USB转console线配置交换机的连接方法

    现在用苹果操作系统的人越来越多,作为网络工程师的使用工具之一USB转串口线的转接头,如果在苹果系统下使用呢? 1.首先自然是先安装转接头光盘自带的驱动程序了.也可以到使用的品牌的官网上去下载. 2.安 ...

  8. 苹果电脑上使用linux环境变量,mac系统下修改环境变量

    苹果电脑使用率越来越高,在mac系统下研发,性能要比在windows下快不少,既然要开发,免不了要配置环境变量.下面是学习啦小编收集整理的mac系统下修改环境变量,希望对大家有帮助~~ mac系统下修 ...

  9. Mac系统下SVN命令

    Mac系统下SVN命令 安裝 Subversion 首先您須要在您所要工作的機器上安裝 Subversion 這套系統. 若您的機器上已經安裝好了, 您可以跳過這一步. 若您在 FreeBSD 底下, ...

最新文章

  1. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
  2. Spring boot的配置类
  3. flow 静态类型检查 js
  4. html按钮分享功能实现,一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)...
  5. 东莞村财登录显示服务器断开,“东莞村财”APP运行一年多,还有很多村民股东未注册...
  6. 在Windows系统下搭建ELK日志分析平台
  7. 后代选择+++margin-right:auto
  8. 在SIP对讲机中RTP/RTCP的实现
  9. slk文件转换器安卓版_CoolUtils Total Excel Converter下载
  10. 2020年如何利用外链提升网站排名和权重?
  11. C程序-超简单的猜数字-游戏
  12. worldpress php部署,用XAMPP搭建本地主机(附worldpress的安装)
  13. DCOS(centos 7.4/7.6)
  14. 7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学
  15. 安卓修改电池容量教程_手机电池校正 - 安卓最精确的电量校正方法 - iTeknical
  16. Ubuntu命令下卸载软件
  17. Golang 二叉树遍历
  18. 使用man命令,出现 ”No manual entry for” 的解决办法
  19. CDN到底是个什么鬼?看完这篇你就懂了!
  20. 【Android】性能测试之获取Android流量数据

热门文章

  1. python 机器学习——K 近邻分类理论及鸢尾( Iris )数据集实例操作
  2. weka中的arff格式数据
  3. 从时间管理到管理情绪,这些自我管理的技巧你知道几个?
  4. Cisco综合配置实验——二层、三层交换机、路由器
  5. mov ah,4ch int 21的作用
  6. 计算机体系结构的一知半解
  7. eNSP学习记录一——创建网络拓扑并配置
  8. google adwords express使用心得
  9. 电脑c语言小游戏,C语言中的一个小游戏的排行榜系统...
  10. ViewModel是如何在配置更改后继续留存数据的