Как получить доступ к приложению, запущенному в контейнере 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

В идеале это должно работать.

Другие вопросы по тегам