Exposing/Publishing 个来自 docker 的端口

Exposing/Publishing ports from docker

我在 docker 容器中有一个小的 REST API 运行:

[2015-10-15 10:47:05] INFO  WEBrick 1.3.1
[2015-10-15 10:47:05] INFO  ruby 2.2.3 (2015-08-18) [x86_64-linux]
[2015-10-15 10:47:05] INFO  WEBrick::HTTPServer#start: pid=8 port=9292

我在 IP 上有 docker 个虚拟机:

192.168.99.100

我正在尝试 publish/expose 我的端口:

docker run --publish 9292:9292 788a36b503e2

Docker ps 正在显示:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9d6b34469ebf        788a36b503e2        "/bin/sh -c 'rackup -"   45 seconds ago      Up 44 seconds       0.0.0.0:9292->9292/tcp   hopeful_bhaskara

而且我正在尝试使用 REST API:

 curl 192.168.99.100:9292/auth/3/xyz

但仍然出现错误:

 curl: (7) Failed to connect to 192.168.99.100 port 9292: Connection refused

知道为什么吗?谢谢


需要更多信息 -
你能在容器内从卷曲localhost:9292吗?
如果是这样,从主机 运行 容器,你可以 curl URL (curl 192.168.99.100:9292)?
如果是这样,REST 服务器可能已关闭或配置错误。

您使用的是标准图像(d/l 来自 Docker hub)吗?如果是这样 - 请发送 link 以便重新创建。

你说的是:

I have docker VM on IP:

192.168.99.100

如果您使用 VirtualBox for VM 并且想在本地计算机上访问此 url(http://localhost:9292),则需要在 VirtualBox 上进行端口转发以访问 VM。

警告:如果您的虚拟机有防火墙(例如ufw),请禁用它。 (sudo ufw disable)

按照以下步骤进行端口转发。

  1. 在本地计算机上打开 VirtualBox GUI。

  2. 在虚拟机列表中找到您的 VM 并从顶部导航select 设置

  3. 单击顶部导航栏上的网络图标

  4. Select 端口转发

  5. 单击右上角的“添加规则”图标并填写您的主机端口 9292 和访客端口 9292

  6. 点确定再点确定转发就设置好了

现在,您可以在本地计算机上访问 http://localhost:9292

如果你是 运行

docker run --publish 9292:9292 788a36b503e2

您正在将 9292 容器的端口与主机上的同一端口绑定。所以 运行

 curl localhost:9292/auth/3/xyz

主机应该可以。

你的 Dockerfile 是什么样子的?

您必须 EXPOSE 端口才能被 docker run 命令中的 -p 标志看到。

一天结束时,我从未发现自己做错了什么。我对这个问题采取了不同的方法,并使用 Forman 和 Thin 解决了它。

我的 Dockerfile:

FROM buildpack-deps:jessie

ENV RUBY_MAJOR 2.2
ENV RUBY_VERSION 2.2.3
ENV RUBY_DOWNLOAD_SHA256 df795f2f99860745a416092a4004b016ccf77e8b82dec956b120f18bdc71edce
ENV RUBYGEMS_VERSION 2.4.8

# skip installing gem documentation
RUN echo 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc"

# some of ruby's build scripts are written in ruby
# we purge this later to make sure our final image uses what we just built
RUN apt-get update \
    && apt-get install -y bison libgdbm-dev ruby \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p /usr/src/ruby \
    && curl -fSL -o ruby.tar.gz "http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR/ruby-$RUBY_VERSION.tar.gz" \
    && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.gz" | sha256sum -c - \
    && tar -xzf ruby.tar.gz -C /usr/src/ruby --strip-components=1 \
    && rm ruby.tar.gz \
    && cd /usr/src/ruby \
    && autoconf \
    && ./configure --disable-install-doc \
    && make -j"$(nproc)" \
    && make install \
    && apt-get purge -y --auto-remove bison libgdbm-dev ruby \
    && gem update --system $RUBYGEMS_VERSION \
    && rm -r /usr/src/ruby

# install things globally, for great justice
ENV GEM_HOME /usr/local/bundle
ENV PATH $GEM_HOME/bin:$PATH

ENV BUNDLER_VERSION 1.10.6

RUN gem install bundler --version "$BUNDLER_VERSION" \
    && bundle config --global path "$GEM_HOME" \
    && bundle config --global bin "$GEM_HOME/bin"

# don't create ".bundle" in all our apps
ENV BUNDLE_APP_CONFIG $GEM_HOME

COPY app /auth_app

WORKDIR /auth_app

RUN bundle install

CMD ["foreman","start","-d","/auth_app"]

EXPOSE 4567

我的 Gemfile:

source 'https://rubygems.org'

gem 'sinatra'
gem 'foreman'
gem 'nori'
gem 'thin'
gem 'rack'
gem 'rack-test'

我的个人资料:

web: bundle exec rackup --env dev config.ru -p 4567 -s thin -o 0.0.0.0

我的docker命令运行它:

docker run -p 4567:4567 -d auth_app

我没有更改应用程序中的任何代码,仅更改了 docker 部署设置,当时它运行得非常棒。谢谢你所有的回答,他们至少帮助我专注于正确的问题并提出正确的问题来得到这个 运行.