从 docker 容器的服务访问同级服务 [英] Access sibling service from docker container's service

查看:19
本文介绍了从 docker 容器的服务访问同级服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我运行基于节点映像的 docker 容器(来自 Windows 的 Docker 快速入门终端)

I run Node image based docker container (Docker quickstart terminal from Windows)

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 
 char to make the .sh file real executable
RUN sed -i -e 's/
$//' server_start.sh

CMD ./server_start.sh

EXPOSE 3000 3009

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

I start Node client (on port 3000) and Node (express based) server (on 3009 port). Client accesses REST server via AJAX call.

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 并再次得到正确的结果.

It perfectly works from host (client accesses localhost:3009 and return results). And I can call :3009 and again have correct results.

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

But when I build and run docker image it fails.

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

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

--add-host is used to access mongo db running on host.

服务器端口 3009 已暴露,所以我有一个工作技巧可以调用

Server port 3009 is exposed so I have a working trick to call

192.168.99.100:3009 //the docker IP and exposed port

而不是 localhost:3009 但最好让客户端直接访问容器内的服务器.

instead of localhost:3009 but would be nice to let client access server directly inside the container.

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

How to specify localhost properly inside the docker container to access sibling service?

更新

#!/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 上访问.但是端口需要暴露在使用网络的容器中

Now your mongodb will be accessible on localhost. But the port needs to be exposed in the container whose network is used

自己创建网络并使用它

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

Now inside your MyDockerImage, mongodb can be reached at mongodb_service

使用 docker compose

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

You can use docker-compose to run both of them as a composition

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

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

And now in app mongodb will be reachable with name mongo

这篇关于从 docker 容器的服务访问同级服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆