从Docker公开/发布端口
我有一个小的REST API在Docker容器中运行:
[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
我正在尝试发布/公开我的端口:
docker run --publish 9292:9292 788a36b503e2
泊坞窗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
任何想法为什么? 谢谢
你之前这么说:
我有IP上的docker虚拟机:
192.168.99.100
如果您正在使用VirtualBox for VM,并且想要在本地计算机上访问此URL( http:// localhost:9292 ),则需要在VirtualBox上执行端口转发以访问VM。
警告:如果您的虚拟机具有防火墙(如ufw
),请将其禁用。 ( sudo ufw disable
)
按照以下步骤进行端口转发。
-
在本地机器上打开VirtualBox GUI。
-
在虚拟机列表中find您的虚拟机,然后从顶部导航栏中select设置
-
点击顶部导航栏上的networking图标
-
select端口转发
-
点击右上angular的添加规则图标,然后填写您的主机端口9292和您的来宾端口9292
-
单击确定,然后确定,并设置前进。
现在,您可以访问本地机器上的http:// localhost:9292 。
有点更多的信息是需要的 –
你可以在容器内 curl localhost:9292吗?
如果是这样,从运行容器的主机,你可以curl的URL(curl192.168.99.100:9292)?
如果是这样,REST服务器可能closures或错误configuration。
您是否使用标准图像(来自Docker集线器的d / l)? 如果是这样 – 请发送一个链接,这样就可以重新创build。
在一天结束的时候,我从来没有发现我做错了什么。 我采取了不同的方法解决问题,并通过使用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'
我的Procfile:
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部署设置,它像一个魅力然后。 感谢你的答案,他们至less帮助我把注意力集中到正确的问题上,并提出正确的问题来解决问题。
如果你正在跑步
docker run --publish 9292:9292 788a36b503e2
您将9292容器的端口与主机上的同一端口绑定。 所以跑步
curl localhost:9292/auth/3/xyz
从主持人应该工作。
你的Dockerfile是什么样的?
您必须在EXPOSE
docker run
命令EXPOSE
的端口用-p
标志显示出来。