当前位置: 首页 > 面试题库 >

从Docker容器的服务访问同级服务

谢正初
2023-03-14
问题内容

我运行基于节点映像的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

我启动节点客户端(在端口3000上)和节点(基于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 image时失败了。

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将可以在localhost上访问。但是端口需要
暴露在使用网络的容器中

自己创建网络并使用它

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"

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



 类似资料:
  • 问题内容: 我正在boot2docker 1.3.1下运行。 我有一个Docker容器通过运行Web服务器。 如果我连接到该容器,则可以使用浏览该网站,以便知道服务器正在运行。 我用以下容器运行容器: 它具有以下详细信息: 我以为可以访问,从托管人访问该网站。 这是行不通的。我只是在Chrome中看到“正在连接…”,却一无所获。 我究竟做错了什么? 问题答案: 好吧,愚蠢的我,我在boot2doc

  • 问题内容: 我已经开始使用docker进行开发,并进行以下设置: 主机-ubuntu服务器。 Docker容器-带有tomcat服务器的webapp(使用https)。 就主机-容器访问而言-一切正常。 但是 ,我无法从远程计算机(尽管仍然在同一网络中)访问容器的webapp。 跑步时 输出符合预期,因此docker的端口绑定看起来不错。 有任何想法吗? 谢谢! 问题答案: 我发现了我错过的内容,

  • 问题内容: 我刚刚使用自制软件在Mac上使用Docker- Toolbox安装了Docker:使用自制软件安装了Docker 在使用Rails创建并配置了容器之后,Postgres并启动了docker-compose,一切看起来都很好,但是我无法从主机访问Web服务器。 输出 当我输入谷歌浏览器的网址http://0.0.0.0:8000/我得到 所以我尝试了 具有以下输出: 当我尝试使用Chro

  • 问题内容: 目前,我在需要连接到camunda的docker容器内运行一个node.js应用程序,该容器在另一个容器中运行。 我使用以下命令启动容器 这两个应用程序现在都在运行,我可以通过在端口8000上导航到主机的IP来访问camunda,运行wget 还会返回camunda页面。使用和键入我的应用程序容器时,我无法访问camunda。相反,我得到以下错误: 当我使用将我的应用程序容器链接到ca

  • 我无法通过集装箱中的港口连接到django。我使用的地址是:0.0.0.0.:8000,请参阅:http://joxi.ru/Dr8MeGLhkBWnLm.我正在用一个命令创建一个图像和一个容器:“docker compose up-d”。 docker-compose.yaml Dockerfile 如何解决此问题?

  • 端口映射可以访问, 但我还是习惯通过ip标识服务, 而不是端口标识服务. 主机(win11)通过容器ip直接连不通docker容器, 使用起来不是太方便. 尝试了网上一些方法, 不知为啥都么有成功... 比如: docker for windows 容器内网通过独立IP直接访问的方法 - brock0624 - 博客园 ipconfig 输出↓,不知道应该用哪个网卡来转发流量呢,就是说路由该怎么配