无法向 sinatra 应用程序 运行 docker 和 docker-compose 发送请求
Can't send requests to a sinatra app running with docker and docker-compose
你能告诉我我的 Dockerfile 或 docker-compose 有什么问题吗?
# Dockerfile
FROM ruby:2.5.0
RUN apt-get update -qq && apt-get install -y build-essential
ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install
ADD . $APP_HOME
# docker-compose.yml
version: '3'
services:
db:
image: mongo
volumes:
- $HOME/data/mongodb:/data/db
ports:
- "27017:27017"
web:
build: .
command: rackup config.ru --port 4567
volumes:
- .:/app
ports:
- "4567:4567"
depends_on:
- db
如果我直接使用 'rackup' 命令 运行 应用程序,它运行良好。当我通过 'docker-compose up' 命令 运行 容器时,问题就开始了,它停止通过 'localhost:4567' 接受请求。
我无法发现问题,这就是我寻求帮助的原因。
这是来自 'docker-compose up' 的日志,以防万一。
Starting tracker_db_1 ... done
Recreating tracker_api_1 ... done
Attaching to tracker_db_1, tracker_api_1
db_1 | 2018-07-30T09:43:17.580+0000 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=fe12227a1143
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] db version v4.0.0
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] allocator: tcmalloc
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] modules: none
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] build environment:
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] distmod: ubuntu1604
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] distarch: x86_64
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] target_arch: x86_64
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] options: { net: { bindIpAll: true } }
db_1 | 2018-07-30T09:43:17.686+0000 I STORAGE [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
db_1 | 2018-07-30T09:43:17.700+0000 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=487M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
web_1 | [2018-07-30 09:43:19] INFO WEBrick 1.4.2
web_1 | [2018-07-30 09:43:19] INFO ruby 2.5.0 (2017-12-25) [x86_64-linux]
web_1 | [2018-07-30 09:43:19] INFO WEBrick::HTTPServer#start: pid=1 port=4567
db_1 | 2018-07-30T09:43:29.033+0000 I STORAGE [initandlisten] WiredTiger message [1532943809:33683][1:0x7f429bbb8a00], txn-recover: Main recovery loop: starting at 7/8576
db_1 | 2018-07-30T09:43:29.787+0000 I STORAGE [initandlisten] WiredTiger message [1532943809:787811][1:0x7f429bbb8a00], txn-recover: Recovering log 7 through 8
db_1 | 2018-07-30T09:43:30.362+0000 I STORAGE [initandlisten] WiredTiger message [1532943810:362900][1:0x7f429bbb8a00], txn-recover: Recovering log 8 through 8
db_1 | 2018-07-30T09:43:30.433+0000 I STORAGE [initandlisten] WiredTiger message [1532943810:433423][1:0x7f429bbb8a00], txn-recover: Set global recovery timestamp: 0
db_1 | 2018-07-30T09:43:30.463+0000 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
db_1 | 2018-07-30T09:43:30.487+0000 I CONTROL [initandlisten]
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten]
db_1 | 2018-07-30T09:43:30.635+0000 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
db_1 | 2018-07-30T09:43:30.642+0000 I NETWORK [initandlisten] waiting for connections on port 27017
您的应用程序在 localhost 之外不可用,它的 localhost 是 docker 容器,而不是您的系统(您甚至可以尝试从容器内部 curl localhost,我敢打赌它会工作得很好)。我不能给你更多的细节,我不擅长这个话题。但是你需要做的只是将 rack 绑定到 0.0.0.0.
例如,我 运行 我的 rails 应用是这样的:
bundle exec rails s -p 3000 -b 0.0.0.0
在你的情况下它将是:
rackup --host 0.0.0.0 --port ...
现在它甚至可以从您的网络中使用(至少应该是)
我 运行 在尝试使用内置 WEBrick 服务器在 Docker 中设置一个简单的 Sinatra 应用程序时遇到了这个问题。换句话说,我没有 config.ru
文件。万一其他人遇到同样的问题,我想我会 post 我的解决方案。
我的应用程序是一个 "Hello World" 应用程序,我只是用来在 Docker 容器中获取 Sinatra 运行。
这是我更改前的 app.rb
。
require 'sinatra'
get '/' do
'Hello world!'
end
当我 运行 Docker 容器时,我可以看到 WEBrick 运行 并准备好接受请求。但是当我试图从我的笔记本电脑访问它时,请求从未到达容器。
为了解决这个问题,我将 set :bind, '0.0.0.0'
添加到 app.rb
,就像这样。
require 'sinatra'
set :bind, '0.0.0.0'
get '/' do
'Hello world!'
end
对于任何需要更复杂配置设置的东西,最好将绑定设置添加到配置文件中。
你能告诉我我的 Dockerfile 或 docker-compose 有什么问题吗?
# Dockerfile
FROM ruby:2.5.0
RUN apt-get update -qq && apt-get install -y build-essential
ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install
ADD . $APP_HOME
# docker-compose.yml
version: '3'
services:
db:
image: mongo
volumes:
- $HOME/data/mongodb:/data/db
ports:
- "27017:27017"
web:
build: .
command: rackup config.ru --port 4567
volumes:
- .:/app
ports:
- "4567:4567"
depends_on:
- db
如果我直接使用 'rackup' 命令 运行 应用程序,它运行良好。当我通过 'docker-compose up' 命令 运行 容器时,问题就开始了,它停止通过 'localhost:4567' 接受请求。 我无法发现问题,这就是我寻求帮助的原因。
这是来自 'docker-compose up' 的日志,以防万一。
Starting tracker_db_1 ... done
Recreating tracker_api_1 ... done
Attaching to tracker_db_1, tracker_api_1
db_1 | 2018-07-30T09:43:17.580+0000 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=fe12227a1143
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] db version v4.0.0
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] allocator: tcmalloc
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] modules: none
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] build environment:
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] distmod: ubuntu1604
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] distarch: x86_64
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] target_arch: x86_64
db_1 | 2018-07-30T09:43:17.669+0000 I CONTROL [initandlisten] options: { net: { bindIpAll: true } }
db_1 | 2018-07-30T09:43:17.686+0000 I STORAGE [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
db_1 | 2018-07-30T09:43:17.700+0000 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=487M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
web_1 | [2018-07-30 09:43:19] INFO WEBrick 1.4.2
web_1 | [2018-07-30 09:43:19] INFO ruby 2.5.0 (2017-12-25) [x86_64-linux]
web_1 | [2018-07-30 09:43:19] INFO WEBrick::HTTPServer#start: pid=1 port=4567
db_1 | 2018-07-30T09:43:29.033+0000 I STORAGE [initandlisten] WiredTiger message [1532943809:33683][1:0x7f429bbb8a00], txn-recover: Main recovery loop: starting at 7/8576
db_1 | 2018-07-30T09:43:29.787+0000 I STORAGE [initandlisten] WiredTiger message [1532943809:787811][1:0x7f429bbb8a00], txn-recover: Recovering log 7 through 8
db_1 | 2018-07-30T09:43:30.362+0000 I STORAGE [initandlisten] WiredTiger message [1532943810:362900][1:0x7f429bbb8a00], txn-recover: Recovering log 8 through 8
db_1 | 2018-07-30T09:43:30.433+0000 I STORAGE [initandlisten] WiredTiger message [1532943810:433423][1:0x7f429bbb8a00], txn-recover: Set global recovery timestamp: 0
db_1 | 2018-07-30T09:43:30.463+0000 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
db_1 | 2018-07-30T09:43:30.487+0000 I CONTROL [initandlisten]
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
db_1 | 2018-07-30T09:43:30.488+0000 I CONTROL [initandlisten]
db_1 | 2018-07-30T09:43:30.635+0000 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
db_1 | 2018-07-30T09:43:30.642+0000 I NETWORK [initandlisten] waiting for connections on port 27017
您的应用程序在 localhost 之外不可用,它的 localhost 是 docker 容器,而不是您的系统(您甚至可以尝试从容器内部 curl localhost,我敢打赌它会工作得很好)。我不能给你更多的细节,我不擅长这个话题。但是你需要做的只是将 rack 绑定到 0.0.0.0.
例如,我 运行 我的 rails 应用是这样的:
bundle exec rails s -p 3000 -b 0.0.0.0
在你的情况下它将是:
rackup --host 0.0.0.0 --port ...
现在它甚至可以从您的网络中使用(至少应该是)
我 运行 在尝试使用内置 WEBrick 服务器在 Docker 中设置一个简单的 Sinatra 应用程序时遇到了这个问题。换句话说,我没有 config.ru
文件。万一其他人遇到同样的问题,我想我会 post 我的解决方案。
我的应用程序是一个 "Hello World" 应用程序,我只是用来在 Docker 容器中获取 Sinatra 运行。
这是我更改前的 app.rb
。
require 'sinatra'
get '/' do
'Hello world!'
end
当我 运行 Docker 容器时,我可以看到 WEBrick 运行 并准备好接受请求。但是当我试图从我的笔记本电脑访问它时,请求从未到达容器。
为了解决这个问题,我将 set :bind, '0.0.0.0'
添加到 app.rb
,就像这样。
require 'sinatra'
set :bind, '0.0.0.0'
get '/' do
'Hello world!'
end
对于任何需要更复杂配置设置的东西,最好将绑定设置添加到配置文件中。