从 docker 容器的服务访问兄弟服务 [英] Access sibling service from docker container's service
问题描述
我运行基于 Node 镜像的 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
推荐答案
您可以在这里做的事情很少
There are few things you can do here
让其他容器运行在其他容器的网络上
docker run --net container:<id> MyDockerImage
现在可以在本地主机上访问您的 mongodb.但是端口需要在使用网络的容器中暴露
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屋!