Нет портов, нет подключения к Docker составлять стек - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в Docker -композиции и пытаюсь запустить свой стек Tomcat + Postgres.

Я "успешно" запустил стек в том смысле, что мое Java веб-приложение успешно подключается к Postgresql и развертывается в Tomcat.

Но порт не сопоставлен, а узлы недоступны. Но хосты могут достигать самих себя.

Ниже приведена схема моего проекта (я использую Grad Палантира Docker плагин )

  • edcom3-docker /
    • edcom3-tomcat /
    • build.gradle
    • src / main /
      • docker / Dockerfile
      • ресурсы
      • webapps /edcom3.war
      • (Другие вещи, которые мне лень перечислять)
    • edcom3-postgres /
    • build.gradle
    • src / main /
      • docker / Dockerfile
    • src / main / docker /
    • docker -compose.yml
    • .env

Благодаря плагину Gradle Docker контекст встроен в $baseDir/build/docker

Ниже мой текущий docker-compose.yml. Мне нужно было расширить структуру каталогов, чтобы оправдать ссылки

version: '3'
services:
  edcom3-postgres:
    build: ../../../edcom3-postgres/build/docker
    image: edcom3-postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: postgres
#    networks:
#      - edcom3-net
    expose:
      - "5432/tcp"
    ports:
    - "${EDCOM3_SQL_PORT}:5432"
    volumes:
      - "edcom3-postgres-data:/var/lib/postgresql/data"
  edcom3-tomcat:
    depends_on:
      - edcom3-postgres
    build: ../../../edcom3-tomcat/build/docker
    image: edcom3-tomcat
    expose:
      - "8009/tcp"
      - "8080/tcp"
    ports:
    - "${EDCOM3_AJP_PORT}:8009"
    volumes:
      - "edcom3-config-location:/home/tomcat"
      - "edcom3-file-repository:/mnt/fileRepository"
      - "edcom3-logs:/mnt/phoenix-logs"
      - "edcom3-tomcat-logs:/usr/local/tomcat/logs"
    restart: always
#    networks:
#      - edcom3-net
    links:
      - edcom3-postgres

#networks:
#  edcom3-net:
#    driver: bridge
#    internal: true

volumes:
  edcom3-config-location:
  edcom3-file-repository:
  edcom3-logs:
  edcom3-tomcat-logs:
  edcom3-postgres-data:

То, что я пробовал

Сначала я запускаю gradle :edcom3-tomcat:docker and :edcom3-postgres:gradle для создания контекстов.

Затем я перехожу на src/main/docker основного проекта, в котором находится вышеуказанная docker -композиция, и запуск стека.

edcom3-tomcat_1    | 06-Feb-2020 15:51:12.943 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/edcom3.war] has finished in [66,278] ms

Стек запускается и приложение развертывается. Как видите, я дал указание docker -compose выставить порт AJP (переменные привязаны к портам 50000 и 50001), чтобы Apache мог обратный прокси-сервер в Tomcat. Apache - автономный контейнер.

Но я не могу найти привязки портов в docker ps

[docker@DOCKER01 ~]$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                      PORTS                                                      NAMES
78acb0e5ff5d        edcom3-tomcat                    "catalina.sh run"        11 minutes ago      Up 11 minutes (unhealthy)                                                              edcom3_edcom3-tomcat_1
60bbed143adf        edcom3-postgres                  "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes (unhealthy)                                                              edcom3_edcom3-postgres_1
23265ae20793        postgres:11.6-alpine             "docker-entrypoint.s…"   7 weeks ago         Up 2 days                   192.168.0.72:5432->5432/tcp                                postgres11
9c8b0eda42e9        portainer/portainer:1.23.0       "/portainer --ssl --…"   7 weeks ago         Up 2 days                   192.168.0.72:8000->8000/tcp, 192.168.0.72:9000->9000/tcp   keen_grothendieck
63985a2c656f        initech/sqlserver2017:20191204   "/opt/mssql/bin/nonr…"   2 months ago        Up 2 days (healthy)         192.168.0.72:1433->1433/tcp                                sqlserver2017
09589b076513        oracle/database:12.2.0.1-SE2     "/bin/sh -c 'exec $O…"   2 months ago        Up 2 days (healthy)         192.168.0.72:1521->1521/tcp, 192.168.0.72:5500->5500/tcp   oracle12c

Соображения: (не) комментирование сети в файле compose не имеет никакого эффекта.

Я ясно вижу, что о контейнерах сообщили, что они вредны для здоровья. Я попытался удалить проверку работоспособности из их Dockerfile с, но это не имело никакого эффекта: контейнер не определил его работоспособность, но порт по-прежнему недоступен

Затем я попытался пропинговать контейнеры в их сети (сетевой блок в docker-compose закомментировано). С моей Windows рабочей станции

> docker inspect 4ce2be94fbe8 (tomcat)

....

                    "NetworkID": "8196b4a9dab76b899494f427286c0a9250ba4b74f8e4c6dbb8cd4459243509ac",
                    "EndpointID": "17d969ad49fe127870f73e63211e309f23d37a23d2918edb191381ffd7b2aaff",
                    "Gateway": "172.25.0.1",
                    "IPAddress": "172.25.0.3",

....

(О, круто, сервер слушает порт 8080 на этом)

> telnet 172.25.0.1 8009
(connection failed)

> tracert 172.25.0.1
(a number of nodes)

Интересно посмотреть результат tracert (который у меня есть опущен). В основном Windows 10 пытается достигнуть 172.25.xx, который является особенно частным IP-адресом класса 16, через главный шлюз, который игнорируется нашим внешним провайдером (в трассировке появляются 4 внешних хоста)

Хорошо, Windows не настроил таблицы маршрутизации.

Давайте попробуем на нашем docker сервере с CentOS

$ docker inspect 60bbed143adf

.....

                    "NetworkID": "10a52bc3f822f756f5b76c300787be5af255afd061453add0c70664f69ee06c8",
                    "EndpointID": "f054747f6a5d0370916caa74b8c01c3e7b30d255e06ebb9d0c450bf1db38efb1",
                    "Gateway": "172.19.0.1",
                    "IPAddress": "172.19.0.2",
                    "IPPrefixLen": 16,
.....

[docker@DOCKER01 ssl]$ telnet 172.19.0.3 8009
Trying 172.19.0.3...
Connected to 172.19.0.3.
Escape character is '^]'.

Интересно, что я наконец могу получить доступ к сети

Заключение: вопрос

Может кто-нибудь помочь мне понять, почему я не могу сопоставить порт 8009 (AJP) из веб-контейнера с хост-машиной? Если я смогу добиться этого, веб-приложение будет доступно для Apache балансировщика нагрузки по протоколу AJP

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Я обнаружил, что главным виновником был edcom3- net.

Моя проблема была вызвана рядом неудачных совпадений, поэтому позвольте мне навести порядок на этом.

Порты, не открытые для сети

Проще говоря, я обнаружил, что если вы подключите контейнер Docker к внутренней сети, он не будет публиковать порты sh на хосте. , Он должен быть подключен к сети хоста для публикации портов sh. Если вы прокомментируете сетевую часть файла docker -compose, порты будут успешно опубликованы

Хост, но недоступен при использовании внутренней сети

I обнаружил, что это еще один аспект, который требует от меня дополнительного исследования и, скорее, отдельных вопросов и ответов.

Я обнаружил, что когда вы присоединяете контейнер к внутренней сети, он получает свой собственный частный IP-адрес, а не выставить порты. Тем не менее, контейнер имеет IP-адрес и доступные порты. Здесь есть две заметные вещи

1. Если вы запустите балансировщик нагрузки в другом контейнере Docker (на этот раз в сети хоста)

Вам будет сложно добраться до целевого контейнера. Необходимо настроить таблицы маршрутизации для связи нескольких сетей.

2. Если балансировщик нагрузки работает на хосте Docker, вместо

Должно быть проще установить обратный прокси-сервер. Тем не менее, у меня было неудачное совпадение, чтобы запустить этот сценарий на хосте Windows. И Docker Desktop, в моем случае, не устанавливал таблицы маршрутизации. Даже после нескольких попыток docker network inspect в сети edcom3-net адрес Tomcat 172.16.x.x был направлен через основной шлюз

0 голосов
/ 06 февраля 2020

В файле compose порт контейнера 8009 открыт на порт хоста ${EDCOM3_AJP_PORT}.
Так что вы должны иметь возможность доступа к AJP tomcat с помощью <IP-OF-DOCKER-SERVER>:${EDCOM3_AJP_PORT}.

Публикация портов выполняется с помощью раздела ports, expose только «выставляет порты без публикации их на хост-компьютере - они будут доступны только для связанных services "

Но мы можем видеть в docker ps, что раздел PORTS пуст для контейнера edcom3-tomcat, поэтому я предполагаю, что EDCOM3_AJP_PORT не очень хорошо определено (но затем должно произойти сбой ...)

При использовании 172.25.0.1:8009: IP-адрес контейнера является частным для хоста docker (машина CentOS), поэтому нет проблем с доступом к нему (при любом прослушивании порт контейнера) с этой машины, но это невозможно с любой другой машины.

См. Контейнерные сети - Опубликованные порты :

По умолчанию, когда Вы создаете контейнер, он не публикует sh ни одного из своих портов во внешнем мире.
Чтобы создать порт, доступный для служб за пределами Docker или Docker контейнеров, которые не подключены к сети контейнера, использует флаг --publi sh или -p.
Это создает правило брандмауэра, которое отображает контейнер порт к порту на хосте Docker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...