如何强制使用端口0.0.0.0,以便它可以从docker容器内部与本地环境进行通信?这是我的代码:
# docker-compose.yml
version: '3'
services:
backend:
build: ./ruby-backend
ports:
- "4567:4567"
# ruby-backend/Dockerfile
FROM ruby:2.4.1
COPY Gemfile /app/Gemfile
WORKDIR /app
RUN bundle install
COPY . /app
EXPOSE 4567
CMD ["bundle", "exec", "rackup", "-p", "4567", "--host", "0.0.0.0"
如果我从容器外部运行它,这个命令很有用。这是我从当地做的终端输出:
$ bundle exec rackup -s puma -p 4567 -o "0.0.0.0"
Puma starting in single mode...
* Version 3.11.0 (ruby 2.4.1-p111), codename: Love Song
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:4567
Use Ctrl-C to stop
请注意正确的主机:tcp://0.0.0.0:4567
。不幸的是,它不像容器中那样工作。这是使用docker时的终端输出:
$ dc up backend
Starting devopscourse1_backend_1 ...
Starting devopscourse1_backend_1 ... done
Attaching to devopscourse1_backend_1
backend_1 | Puma starting in single mode...
backend_1 | * Version 3.11.0 (ruby 2.4.1-p111), codename: Love Song
backend_1 | * Min threads: 0, max threads: 16
backend_1 | * Environment: development
backend_1 | * Listening on tcp://localhost:4567
backend_1 | Use Ctrl-C to stop
任何想法我做错了什么?
答案 0 :(得分:1)
我整个晚上都在调试这个问题,如果你还没有弄明白的话,我希望能找到我找到的解决方案。
如果您与容器运行交互式会话会怎样?
docker run -t -i <image> /bin/bash
这将为您提供容器内的交互式shell,然后您可以查看容器中文件系统的状态
我最终弄清楚容器使用的Dockerfile没有收到我对它所做的更改:将0.0.0.0绑定到rackup命令。这提醒我,Dockerfile在缓存进程的所有设置步骤时,本身不是容器设置的一部分。第一条指令复制到Docker守护程序中,因此更改它意味着您需要构建一个新图像。
溶液:
docker rm
容器docker rmi
图片docker build
图像再次与Dockerfile一起更改为CMD