Я запускаю контейнер док-станции theia за контейнером прокси-сервера nginx (jwilder/nginx-proxy
).
Внутри theia я запускаю простое приложение ExpressJS на порту №. 8001.
Я могу получить доступ к контейнеру публично, используя поддомен.
Как получить доступ к приложению, работающему внутри контейнера, публично?
Код, используемый для запуска прокси-сервера nginx на докере
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" .