草庐IT

macos - Docker:MacOS 向主机公开容器端口

coder 2023-05-06 原文

在我的工作中,我使用 docker 和选项 --net=host 就像将 docker 容器端口转发到机器的魅力一样。这允许我通过示例添加使用某些端口的 grunt 任务:

  • 在 9001 端口提供我的覆盖率报告的任务
  • 在端口 9000 中提供的应用的本地部署版本
  • watch 实时重载 35729 端口
  • 对于单元测试运行器,请使用 9876 端口

当我开始在 Mac 中使用 Docker 时,我遇到的第一个问题是:--net=host 选项不再起作用。 我研究并理解为什么这是不可能的(Mac 中的 Docker 在自己的虚拟机中运行),我的临时解决方案是使用 -p 选项来公开端口,但这限制了我添加越来越多的任务使用端口,因为我需要为我需要公开的每个端口运行显式 -p 命令。

有人遇到同样的问题吗?如何处理?

最佳答案

您的问题很可能是您正在使用 dockertoolbox 或 dhingy/dlite 或任何其他提供成熟的 linux 虚拟机,然后托管 docker 以在此虚拟机中运行您的容器。当然,这个虚拟机在主机上有自己的网络堆栈和自己的 IP,这就是你的工具会遇到的问题。容器暴露的端口不是暴露给OSX host localhost,而是暴露给OSX Docker-VM-ip

优雅地解决这些问题

从容器中向 OSX localhost 公开端口

  1. 首先,使用/安装 docker-for-mac https://docs.docker.com/engine/installation/mac/而不是 dockertoolbox 或其他。它基于一个特殊的 xhyve 堆栈,可重用您的主机网络堆栈
  2. 当您现在执行 docker run -p 3306:3306 percona 时,它将在 osx-host-localhost 上绑定(bind) 3306,因此所有其他 osx-tool 都会尝试附加到 localhost:3306 将起作用(非常有用),就像您在使用 brew install mysql 或类似方式安装 mysql 时所习惯的一样
  3. 如果您在 OSX 上与 docker 容器共享代码时遇到性能问题,请查看 http://docker-sync.io - 它与 docker-for-mac 兼容(提示:我对此有偏见)

将端口从 OSX 主机导出到容器

您并没有真正导出任何特别的东西,而是让它们可以从所有容器(OSX-host-localhost 的所有端口)作为一个整体访问

如果您想附加到您在 OSX 主机上提供的端口,从容器内,例如在 xdebug session 期间,您的 IDE 在端口 9000 上监听 OSX-host-localhost 并且运行 FPM/PHP 的容器应该 attach 到这个 osx-localhost:9000 上mac,你需要这样做:https://gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c

因此,您创建了一个虚拟环回 ip,这样您就可以使用 10.254.254.254:9000 从没有容器的情况下访问您的 OSX 主机端口 - 这是可移植的,基本上为您提供了像以前一样开发所需的一切


因此,您可以将容器暴露端口连接到在 mac 上运行并尝试连接到 localhost:port 的应用程序

如果容器中的某些内容想要附加到主机上的端口,则第二个相反。

关于macos - Docker:MacOS 向主机公开容器端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38733992/

有关macos - Docker:MacOS 向主机公开容器端口的更多相关文章

  1. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

  5. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  6. ruby - 找不到 macOS Mojave 'ruby/config.h' 文件 - 2

    当我尝试在macOSMojave(10.14.1)上构建带有ruby​​支持(--enable-rubyinterp)的vim(8.1.0509)时,出现错误:Infileincludedfrom/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby.h:33:/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/ruby.h:24:10:fatalerror:'ru

  7. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  8. ruby-on-rails - 无法访问 ruby​​ on rails 上的本地主机 - 2

    当我运行服务器并转到localhost:3000时,我收到此错误:ActiveRecord::ConnectionNotEstablishedNoconnectionpoolwithidprimaryfound.有问题的代码:activerecord(5.0.0)lib/active_record/connection_adapters/abstract/connection_pool.rb:874:in`retrieve_connection' 最佳答案 我会发表评论,但我缺乏声誉。反正这个错误有时候是sqlite版本导致的。我建

  9. ruby-on-rails - 更新 Ruby-Gems 时出现未知主机错误 - 2

    我正在尝试使用以下方法更新ruby​​gems:gemupdate--system但是我得到了错误:ERROR:Whileexecutinggem...(Gem::RemoteFetcher::UnknownHostError)nosuchname(https://rubygems.org/specs.4.8.gz). 最佳答案 不确定您安装的是哪个版本的ruby​​gems,但是可以通过三种方式修复:网络问题-稍后重试。您的版本已变砖无法更新,您需要以其他方式安装NOTE:RubyGems1.1and1.2haveproblems

  10. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

随机推荐