Я новичок в 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 /
- 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