【问题标题】:I am running 2 images with Docker Compose and I am having trouble hitting the localhost from my Mac. I am exposing ports 3000. Am I missing something?我正在使用 Docker Compose 运行 2 个映像,并且无法从我的 Mac 访问本地主机。我正在暴露端口 3000。我错过了什么吗?
【发布时间】:2017-05-06 12:38:59
【问题描述】:

我正在使用 Docker 构建一个 Node/Mongo 应用程序,当我运行 docker-compose up 时,我无法从运行 MacOs 的主机访问我的本地主机。使用邮递员或curl -i localhost:3000 不会返回任何内容。我也尝试过检查容器并与该 IP 连接。我究竟做错了什么?谢谢!

docker-compose.yml:

version: "2"
services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    env_file:
      - todoListDocker.env
    links:
      - mongo

mongo:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=tWwp3Fm4hZUsaLw4
    volumes:
      - mongo:/data/db
    ports:
      - "27017:27017"
    env_file:
      - todoListDocker.env

volumes:
  mongo:

Dockerfile:

FROM node:boron

MAINTAINER Clinton Medbery <clintomed@gmail.com>

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

RUN mkdir - p /app
WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app
EXPOSE 3000

CMD ["npm", "start"]

Index.js:

const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

var app = express();

var router = require('./services/router');

//Use ENV Variables
console.log("Connecting to Mongo");
mongoose.connect('mongodb://root:tWwp3Fm4hZUsaLw4@mongo:27017');
// mongoose.connect('mongodb://localhost:todoList/todoList');

console.log("Connected to Mongo");


app.use(morgan('combined'));
app.use(bodyParser.json());
app.use('/v1', router);

var PORT = process.env.PORT || 3000;
var HOST = process.env.HOST || '127.0.0.1';

app.get('/hello', function (req, res) {
    console.log("Hello World");
    res.send({hello:'Hello World!'});
});

console.log('Listening on port ', HOST, PORT);
app.listen(PORT, HOST);

【问题讨论】:

  • 您不需要访问暴露的端点之一吗?所以运行“curl -i localhost:3000/hello”可能会返回一些东西。
  • 谢谢!我试过了。答案在下面!感谢您的帮助。

标签: node.js docker docker-compose


【解决方案1】:

您的 express 服务器正在侦听 localhost 端口 3000。

var PORT = process.env.PORT || 3000;
var HOST = process.env.HOST || '127.0.0.1';

这将绑定到 容器的 localhost。这独立于 Mac 的 localhost 和任何其他容器的 localhost。您无法从容器外部到达它。

您需要绑定到容器的外部接口,这将让 Mac 或其他容器连接到端口。您可以为此使用特殊地址0.0.0.0

var PORT = process.env.PORT || 3000;
var HOST = process.env.HOST || '0.0.0.0';

现在可以从 Mac 访问 express 服务器,端口绑定 3000:3000 将起作用。默认情况下,它将绑定在 Mac 的所有网络接口上,但如果您愿意,可以将其限制为 Mac 的 localhost。

ports:
  - "127.0.0.1:3000:3000"

【讨论】:

  • 就是这样!谢谢你,先生。我将您的答案标记为正确。太糟糕了,我不能用 Stack Overflow 的神秘代表系统投票。我很感激!
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2019-09-16
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2021-05-03
相关资源
最近更新 更多