我是Docker的新手,并试图制作一个演示Rails应用程序。我创建了一个看起来像这样的dockerfile:
FROM ruby:2.2
# Install apt based dependencies required to run Rails as
# well as RubyGems. As the Ruby image itself is based on a
# Debian image, we use apt-get to install those.
RUN apt-get update && apt-get install -y \
build-essential \
nodejs
# Configure the main working directory. This is the base
# directory used in any further RUN, COPY, and ENTRYPOINT
# commands.
RUN mkdir -p /app
WORKDIR /app
# Copy the Gemfile as well as the Gemfile.lock and install
# the RubyGems. This is a separate step so the dependencies
# will be cached unless changes to one of those two files
# are made.
COPY Gemfile Gemfile.lock ./
RUN gem install bundler && bundle install --jobs 20 --retry 5
# Copy the main application.
COPY . ./
# Expose port 3000 to the Docker host, so we can access it
# from the outside.
EXPOSE 3000
# The main command to run when the container starts. Also
# tell the Rails dev server to bind to all interfaces by
# default.
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
然后我构建它(没有错误):
docker build -t demo .
然后运行它(也没有错误):
docker run -itP demo
=> Booting Puma
=> Rails 5.1.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.2.7-p470), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:9292
Use Ctrl-C to stop
当我在一个单独的终端中运行docker ps
命令以确定端口时,我得到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55e8224f7c15 demo "bundle exec rails..." About an hour ago Up About an hour 0.0.0.0:32772->3000/tcp ecstatic_bohr
但是,当我尝试使用Chrome或curl命令在http://localhost:32772
或http://192.168.99.100:32772
连接到它时,我收到“拒绝连接”。
当我通过bundle exec rails server
命令在本地计算机上的docker之外运行应用程序时,它运行正常。请注意,我在Win7机器上使用Docker Toolbox
我可能做错了什么?
答案 0 :(得分:1)
我也花了几个小时,这个thread真的很有帮助。我现在正在做的是通过vm的ip地址访问这些服务。
您可以运行您的虚拟机地址:
docker-machine ls
然后尝试使用主机映射端口37772访问您的服务,如下所示:
http://<VM IP ADDRESS>:32772
希望这有帮助。
答案 1 :(得分:0)
上述技巧的结合起作用了 -
我不得不使用http://<VM IP ADDRESS>:32772
(localhost:32772不起作用),而且我必须修复暴露的端口以匹配9292的TCP侦听端口。
我仍然不明白为什么TCP监听端口默认为9292而不是3000,但我会分别研究它。
感谢您的帮助!