node.js - 从docker容器的服务访问兄弟服务

标签 node.js reactjs docker dockerfile axios

我运行基于 Node 镜像的 docker 容器(来自 Windows 的 Docker 快速启动终端)

FROM node:7.8.0
ENV NPM_CONFIG_LOGLEVEL warn

VOLUME /tmp
#copy server source /piu contains node server and /piu/client contains react+redux client
ADD piu /piu
ADD server_start.sh /

#clean windows \r char to make the .sh file real executable
RUN sed -i -e 's/\r$//' server_start.sh

CMD ./server_start.sh

EXPOSE 3000 3009

我启动 Node 客户端(在端口 3000 上)和 Node(基于 Express 的)服务器(在 3009 端口上)。客户端通过 AJAX 调用访问 REST 服务器。

componentDidMount() {
    const that = this;
    console.log('SERVER_URL=' + SERVER_URL); //the output is localhost:3009
    axios
        .get(SERVER_URL + '/posts')
        .then(res => {
            that.setState({pageInfo: res.data});
        })
        .catch(err => {
            console.log(err)
        })
}

它在主机上完美运行(客户端访问 localhost:3009 并返回结果)。我可以调用 :3009 并再次得到正确的结果。

但是当我构建并运行 docker 镜像时它失败了。

docker run -p 3000-3009:3000-3009 --add-host="mongodb:192.168.12.151" MyDockerImage

--add-host 用于访问主机上运行的 mongo db。

服务器端口 3009 已暴露,因此我有一个可以调用的技巧

192.168.99.100:3009 //the docker IP and exposed port

而不是localhost:3009,但让客户端直接在容器内访问服务器会很好。

如何在 docker 容器内正确指定 localhost 来访问同级服务?

更新

#!/bin/bash

# Start the first process (server)
npm run start_docker --prefix piu &
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process (client)
npm run start --prefix piu/client
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

最佳答案

您可以在这里做一些事情

让其他容器在其他容器的网络上运行

docker run --net container:<id> MyDockerImage

现在您的 mongodb 将可以在本地主机上访问。但需要在使用网络的容器中暴露端口

自己创建网络并使用它

docker network create myapps

docker run --name mongodb_service --net myapps mongodb
docker run -p 3000-3009:3000-3009 --net myapps MyDockerImage

现在在您的 MyDockerImage 中,可以通过 mongodb_service 访问 mongodb

使用docker compose

您可以使用 docker-compose 将它们作为组合运行

version: '3'
services:
  mongo: 
    image: mongodb
  app:
    build:
      context: .
    ports:
      - "3000-3009:3000-3009"

现在在应用程序中可以使用名称 mongo 访问 mongodb

关于node.js - 从docker容器的服务访问兄弟服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074933/

相关文章:

javascript - React - 高阶组件应该写成一个函数吗?

javascript - react ,无法将 Prop 传递到下一个级别

c# - 使用 Docker 构建应用程序时打开控制台窗口

nginx - Dockerizing nginx 和 Flask

node.js - 使用 mongodb 和 nodejs 的类别层次聚合

node.js - 如何使用 SessionID 从 RedisStore (connect-redis) 获取 session 数据?

javascript - 如何在 Pug 中定义内联变量

javascript - 将 knexnest 调用拉出到其自己的文件中以防止重复

node.js - 如何在重新渲染时将数据保留在 react 组件中?

angular - 在bitbucket管道上运行e2e的麻烦