Как получить доступ к приложению, запущенному в контейнере theia docker за nginx-proxy?
Я запускаю контейнер докера theia за контейнером прокси-сервера nginx (jwilder/nginx-proxy
).
Внутри theia я запускаю простое приложение ExpressJS на порту №. 8001.
Я могу получить доступ к контейнеру публично, используя поддомен.
Как я могу получить доступ к приложению, работающему внутри контейнера, публично?
Код, используемый для запуска nginx-proxy в докере
docker run -d -p 80:80 --name nginx-proxy --net nginx-proxy -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy
Код, используемый для запуска theia в докере
docker run -d --name theia --expose 3000 --net nginx-proxy -e VIRTUAL_HOST=theia.example.com theia:theia1
Контейнер theia доступен публично, используя http://theia.example.com/.
Это, очевидно, не работает: http://theia.example.com:8001/
Я попытался реализовать https://github.com/jwilder/nginx-proxy/pull/259 используя изображение mashupmill/nginx-proxy
так же как ncadou/nginx-proxy
После замены контейнера работает jwilder/nginx-proxy
с mashupmill/nginx-proxy
Я побежал:
docker run -d --name theia --expose 3000 --net nginx-proxy -e VIRTUAL_HOST="theia.example.com=>http:80,app.example.com=>http:8001" -e VIRTUAL_PROTO=http theia:theia1
Я не уверен, что я неправильно понял, что mashupmill/nginx-proxy
делает или если я делаю что-то не так. В идеале вышесказанное должно было открыть theia на http://theia.example.com/ и приложение Express на http://app.example.com/.
Доступ к приложению, запущенному внутри контейнера theia, не является проблемой при локальном запуске docker. Я могу получить локальный IP-адрес контейнера theia и открыть theia с помощью http://172.16.0.2:3000/ а приложение - с помощью http://172.16.0.2:8001/.
Проблема возникает, когда я пытаюсь разместить докер в другом месте, а затем пытаюсь получить доступ к приложению, используя общедоступный IP-адрес сервера. Используя nginx-proxy, я могу маршрутизировать в контейнер theia, но не знаю, как маршрутизировать приложение, работающее внутри контейнера theia.
Я также попытался выставить другой порт, используя:
docker run -d --name theia --expose 3000 --expose 8001 --net nginx-proxy -e VIRTUAL_HOST=theia.example.com theia:theia1
и сопоставление внешнего порта с внутренним портом:
docker run -d --name theia --expose 3000 -p 8001:8001 --net nginx-proxy -e VIRTUAL_HOST=theia.example.com theia:theia1
Оба вышеперечисленных сообщения приводят к ошибке 502 Bad Gateway для URL http://theia.example.com/.
Ниже приведены другие коды и команды, которые я использовал:
Экспресс код (app.js)
const express = require('express')
const app = express()
const port = 8001
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
После установки Express с помощью npm install express
и запуск приложения node app.js
следующий вывод на консоль:
theia@3a9d843bf70e:/home/project$ node app.js
Example app listening on port 8001!
Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get -y install curl xz-utils wget gpg
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash
RUN apt-get install --yes nodejs
#check for more node installation
RUN apt-get update && apt-get install -y python build-essential
RUN npm install -g yarn
RUN apt-get -y install git sudo
RUN adduser --disabled-password --gecos '' theia && \
adduser theia sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers;
RUN chmod g+rw /home && \
mkdir -p /home/project && \
chown -R theia:theia /home/project;
USER theia
WORKDIR /home/theia
ADD next.package.json ./package.json
RUN yarn --cache-folder ./ycache && rm -rf ./ycache
RUN yarn theia build
EXPOSE 3000
ENV SHELL /bin/bash
ENTRYPOINT [ "yarn", "theia", "start", "/home/project", "--hostname=0.0.0.0" ]
next.package.json
{
"private": true,
"dependencies": {
"typescript": "latest",
"@theia/typescript": "next",
"@theia/navigator": "next",
"@theia/terminal": "next",
"@theia/outline-view": "next",
"@theia/preferences": "next",
"@theia/messages": "next",
"@theia/git": "next",
"@theia/file-search": "next",
"@theia/markers": "next",
"@theia/preview": "next",
"@theia/callhierarchy": "next",
"@theia/merge-conflicts": "next",
"@theia/search-in-workspace": "next",
"@theia/json": "next",
"@theia/textmate-grammars": "next",
"@theia/mini-browser": "next"
},
"devDependencies": {
"@theia/cli": "next"
}
}
Создание образа
docker build --tag "theia:theia1" .
1 ответ
Вы должны использовать опцию -p для привязки порта. Итак, вот в чем дело, порт контейнера 8001 уже должен работать. Вы должны сообщить своей машине запросить контейнеры 8001 порта.
Чтобы проверить ваши nodejs
docker exec -it theiaContainerName sh
а потом беги curl localhost:8001
чтобы убедиться, что контейнер слушает в этом порту.
Затем привяжите порт контейнеров 8001 к порту вашей машины с помощью -p:8001 во время запуска Docker.
docker run -d --name theia -p 800:8001 --expose 3000 --net nginx-proxy -e VIRTUAL_HOST=theia.example.com theia:theia1
В идеале это должно работать.