Я запускаю контейнер Docker на основе образа Node (терминал быстрого запуска Docker из 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
Я запускаю клиент Node (на порту 3000) и сервер Node (на основе Express) (на порту 3009). Клиент обращается к серверу REST через вызов AJAX.
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 run -p 3000-3009:3000-3009 --add-host="mongodb:192.168.12.151" MyDockerImage
--add-host
используется для доступа к базе данных mongo, работающей на хосте.
Порт сервера 3009 открыт, поэтому у меня есть рабочий трюк для вызова
192.168.99.100:3009 //the docker IP and exposed port
вместо localhost:3009
, но было бы неплохо разрешить клиенту доступ к серверу непосредственно внутри контейнера.
Как правильно указать 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