【问题标题】:Docker - Cannot forward ports for an interactive shellDocker - 无法转发交互式 shell 的端口
【发布时间】:2016-03-10 10:26:27
【问题描述】:

在 docker 容器中转发端口时遇到了很多困难。首先,我尝试为现有容器转发端口。然后我意识到这是不可能的。所以我尝试使用 docker run 命令(从 docker 映像创建一个新容器)。

 docker run -p 8080:8080 -td <image_id>

我检查了 docker ps 命令,它在“端口”标题下显示了这些端口。但我在这里使用了 -d(在后台运行容器)选项。所以我猜它起作用了。

但我真的需要一个交互式外壳,在这里我想转发一些端口。

基本上,我试图在这个容器中运行一个 Ruby On Rails 应用程序(需要转发端口 3000、3306 等),我安装了所有软件和 rails gem 等,并在这个交互式 shell 中启动了服务器。但我不知道如何转发交互式 shell 的端口。

我尝试了以下方法:

 docker run -p 3000:3000  -p 3001:3001 -p 3306:3306 -p 5432:5432 -t -i <image_id> /bin/bash

这里交互式 shell 工作,但端口没有被转发。

编辑: 我遵循的步骤:

   $ docker run -p 3000:3000  -p 3001:3001 -p 3306:3306 -p 5432:5432 -t -i 5c62899c063f /bin/bash
   root@342cf0dfb5a5:/# ls
   bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run sbin  srv  sys  tmp  usr  var
   root@342cf0dfb5a5:/# cd home/

   root@342cf0dfb5a5:/home# cd rails/
   root@342cf0dfb5a5:/home/rails# ls
   my_project
   root@342cf0dfb5a5:/home/rails# cd my_project/
   root@342cf0dfb5a5:/home/rails/my_project# ls
   Gemfile  Gemfile.lock  README.rdoc  Rakefile  app  bin  config  config.ru  db  lib  log  public  test  tmp  vendor

   root@340cf0dfb5a5:/home/rails/my_project# rails s -b 0.0.0.0

   => Booting WEBrick                                                       
   => Rails 4.2.5 application starting in development on http://0.0.0.0:3000
   => Run `rails server -h` for more startup options                        
   => Ctrl-C to shutdown server                                             
   [2016-03-15 05:57:14] INFO  WEBrick 1.3.1                                
   [2016-03-15 05:57:14] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]       
   [2016-03-15 05:57:14] INFO  WEBrick::HTTPServer#start: pid=113 port=3000

不过,当我转到 localhost:3000 时,我无法访问我的应用程序。我想知道 docker 交互式 shell 容器中的端口转发有什么问题。正如我上面提到的,列出容器时“转发的端口什么都没有显示”。所以我怀疑上面带有 -p 选项的端口转发命令不适用于交互式 shell。

解决方案: 根据 VonC 的回答,我为解决此问题所做的工作

【问题讨论】:

  • But I don't know how to forward the ports for an interactive shell 是什么意思?您编写的第二个命令是否无法按您的需要工作?如果有,为什么?
  • @Auzias 我的意思是 -i 选项。 -it 选项为我提供了一个使用容器的终端。但是,正如我上面提到的,使用此选项,端口不会转发。我不知道为什么。我的意思是在我运行 'docker run -p 3000:3000 -p 3001:3001 -p 3306:3306 -p 5432:5432 -t -i /bin/bash' 之后,端口不转发。转发的端口不显示任何内容。

标签: ruby-on-rails linux shell docker ubuntu-14.04


【解决方案1】:

转发的端口不显示任何内容

它可能在交互式 shell 中的容器内不显示任何内容,但这些端口肯定映射到 Linux host 端口。

在另一个主机 Linux shell 中,执行 docker inspect &lt;yourContainer&gt;:您将看到所有端口都映射到主机,这意味着 curl http://localhost:3000 可以工作。

注意:在 PC 上,您需要在 VirtualBox 级别转发此端口。
见“Not able to access tomcat application on Docker VM with host(windows) IP while using docker toolbox

VBoxManage controlvm "default" natpf1 "tcp-port3000,tcp,,3000,,3000"
VBoxManage controlvm "default" natpf1 "udp-port3000,udp,,3000,,3000"

【讨论】:

  • 嗨@VonC 我用我所有的步骤编辑了这个问题,这些步骤把我带到了这个问题上。请检查一下。由于这个问题,我不能使用 docker。所以考虑转向其他选择。
  • docker 检查 ,显示“Ports”:null,在“NetworkSettings”下:{..
  • }, "NetworkMode": "default", "PortBindings": { "3000/tcp": [ { "HostIp": "", "HostPort": "3000" } ] },
  • 尝试将 3000 映射到更高的端口,例如 30300
  • @Abhi 当然,您需要确保您的应用没有“退出”并保持运行。
猜你喜欢
  • 2017-06-04
  • 2016-07-14
  • 2015-02-24
  • 2018-04-13
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多