Как получить доступ к приложению, запущенному в контейнере theia docker за nginx-proxy? - PullRequest
0 голосов
/ 09 апреля 2019

Я запускаю контейнер док-станции 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" .

1 Ответ

0 голосов
/ 09 апреля 2019

Вы должны использовать опцию -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

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

...