Access sibling service from docker container's

2019-02-21 07:24发布

问题:

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 \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

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)
        })
}

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

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 is used to access mongo db running on host.

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

192.168.99.100:3009 //the docker IP and exposed port

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

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

UPDATE

#!/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

回答1:

There are few things you can do here

Let other container run on network of other container

docker run --net container:<id> MyDockerImage

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

Create network yourself and use it

docker network create myapps

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

Now inside your MyDockerImage, mongodb can be reached at mongodb_service

Use 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"

And now in app mongodb will be reachable with name mongo