我是Docker compose的新手,我正在努力运行我的Tomcat+Postgres堆栈。
我已经“成功地”启动了这个堆栈,这意味着我的javaweb应用程序成功地连接到Postgresql并部署到Tomcat中。
以下是我的项目布局(我使用
Palantir's Gradle Docker plugin
)
-
-
edcom3 tomcat公司/
-
生成.gradle
-
src/主/
-
docker/Dockerfile文件
-
-
网络应用程序/edcom3.war
-
(其他我懒得罗列的东西)
-
edcom3博士后/
-
生成.gradle
-
src/主/
-
src/主/码头工/
-
-
.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
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
注意事项:(取消)在合成文件中注释网络没有效果。
Dockerfile
但它没有任何影响:集装箱还没有确定其健康状况,但仍然没有可用的港口
docker-compose
注释掉了)。从我的Windows工作站
> docker inspect 4ce2be94fbe8 (tomcat)
....
"NetworkID": "8196b4a9dab76b899494f427286c0a9250ba4b74f8e4c6dbb8cd4459243509ac",
"EndpointID": "17d969ad49fe127870f73e63211e309f23d37a23d2918edb191381ffd7b2aaff",
"Gateway": "172.25.0.1",
"IPAddress": "172.25.0.3",
....
> telnet 172.25.0.1 8009
(connection failed)
> tracert 172.25.0.1
(a number of nodes)
看到tracert结果很有趣(我省略了)。基本上,Windows 10试图通过主网关访问172.25.x.x,这是一个非常明显的16类专用IP地址,但是被我们的外部ISP忽略了(跟踪中出现了4个外部主机)
好的,Windows没有配置路由表。
$ 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)从web容器映射到主机吗?如果我能做到这一点,web应用程序将通过AJP协议提供给Apache负载平衡器