我运行基于Node image的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。
--add-host
服务器端口3009暴露在外,因此我有一个有效的技巧可以调用
192.168.99.100:3009 //the docker IP and exposed port
而不是localhost:3009允许客户端直接在容器内部访问服务器。
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名称访问