docker - 如何创建子域以公开运行到 Jenkins 管道中的 docker 容器中的应用程序

标签 docker tomcat jenkins devops traefik

大家:

我在 AWS 的 ec2 实例中发布了 bitnami jenkins。在同一台机器上,我正在启动我的管道,其中我将 docker 用于多个进程,其中一个进程为 a.war 应用程序启动一个数据库和一个 tomcat。事实上,我希望能够从子域或另一个域访问它(我在该 docker 容器中启动的应用程序,以便能够观察到更改)。

为此,我正在使用 traefik,我可以看到在同一个 EC2 网络中运行的所有容器。我也可以将它重定向到某个 url。我不知道的是如何创建一个新的子域来完成这项工作。 Traefic 使用以下命令启动它(因此您可以看到我如何映射端口):

sudo docker run -d -p 9090:8080 -p 8888:80 --network public --name traefik -v $PWD/traefik.toml:/etc/traefik/traefik.toml -v/var/run/docker.sock:/var/run/docker.sock traefik

在下图中,我向 traefik 展示了我想暴露给外部的 ip 和路径(在本例中,它是带有扩展名的域,但我也尝试了子域):

enter image description here

traefic配置文件在pastebin中如下:link to configuration file in pastebin

据我所知,bitnami 应用程序使用 tomcat,如果不是请纠正我。我在 freenom 中有域,因为这是我正在进行的测试。

创建子域和扩展名是值得的:http:/midominio.ga/test

非常感谢,欢迎任何帮助。


编辑 1:我知道我可以通过将容器端口映射到运行 jenkins 的免费 EC2 端口来公开它,但我更喜欢在子域中创建它,或者理想情况下在原始域的扩展中动态创建它。

编辑 2:

我会尝试更好地解释我的情况。我有一个运行 bitnami jenkins 的 EC2 实例。在我的管道中,我有以下内容:

 stage ('Postgres: despliegue inicial de la base de datos') {
            def dbImage = docker.build("catalogador/catalogador-tfg-db:${BRANCH_NAME}","--label jenkins ./database")
            dbHostname = "${BRANCH_NAME}-${BUILD_NUMBER}-db"
            db = dbImage.run("-p 5432:5432 --network public --name ${dbHostname}")
            timeout(time: 3, unit: 'MINUTES') {
                sh "until [ \$(docker logs ${dbHostname} --tail 50 2>&1 | grep 'init process complete' | wc -l) -gt 0 ]; do sleep 10; done"
            }

        }

        stage ('Tomcat: despliegue de la aplicación') {
            def webImage = docker.build("asd/asd-tfg-app:${BRANCH_NAME}","--label jenkins ./appserver")
            def webJavaOpts = "-Dspring.datasource.url=jdbc:postgresql://${dbHostname}:5432/${dbName} " +
                    "-Dspring.datasource.username=${dbUser} " +
                    "-Dspring.datasource.password=${dbPassword} "
            webHostname = "${BRANCH_NAME}-${BUILD_NUMBER}-app"
            def proxyOpts = "-l 'traefik.frontend.rule=Host:${testingDomainName};PathPrefixStrip:/${webProxyPrefixPath}' " +
                    "-l 'traefik.port=9090'"
            web = webImage.run("-p 9999:8080 -p 9898:80 --network public --link ${dbHostname} --name ${webHostname} -e JAVA_OPTS='${webJavaOpts}' ${proxyOpts}")
            timeout(time: 3, unit: 'MINUTES') {
                sh "until [ \$(docker logs ${webHostname} --tail 50 2>&1 | grep 'Server startup' | wc -l) -gt 0 ]; do sleep 10; done"
            }
        } 

我想知道的是如何使用 Bitnami Jenkins 在此 EC2 实例中创建子域。因此,不是通过 http://mydomain:9999 访问我的应用程序,而是可以通过子域的 url http://subdomain.mydomain.com 或扩展名为 http://mydomain.com/extension 的普通域来访问它.

我不知道怎么弄,因为bitnami jenkins的image有tomcat,apache2等,我都不知道用的是哪一个。我认为是 tomcat,因为那是他进行 Jenkins war 的地方。甚至在我每次运行我的管道时创建一个不同的子域也可能很棒。

再次感谢。

最佳答案

我遇到了一个非常相似的问题,我将子域的 CNAME 配置为指向运行我的 docker 容器的同一台机器,启动了一个 Nginx 反向代理,它监听所有 docker 容器,然后转发所有流量从端口 80 到所需的容器。在生产中也很有魅力。这样一来,一台机器就可以为多个具有不同子域的 docker 容器提供服务:) 如果不清楚,请告诉我,我可以提供示例和链接来解决问题。

这是我正在使用的 nginx docker 镜像,它监听机器上的所有容器,并根据容器已启动的环境变量将 http 请求转发到特定容器,设置子域变量,如中所述下面链接的自述文件。 enter link description here

关于docker - 如何创建子域以公开运行到 Jenkins 管道中的 docker 容器中的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50202416/

相关文章:

tomcat - 错误页面(500.html、404.html 等)未在 rails/jruby 环境中呈现

java - 如何在 Tomcat 上制作服务器范围的过滤器?

docker - 使用最新的 Jenkins 创建docker镜像

jenkins - 如果新构建正在等待管道中,如何强制 Jenkins 跳过下游作业?

amazon-web-services - aws key 和 Secret 在 aws cli 上工作但在 jenkins 上不起作用

docker - “env”参数不适用于容器

postgresql - pgAdmin 的 "Servers"选项卡为空(Docker Compose)

java.io.IOException : Unable to establish loopback connection when starting Tomcat v9. 0.2.0 使用 JVM v1.8.0_162

windows-7 - 将docker机器存储在D:驱动器中,而不是C:\Users\…Windows 7中

spring - 我如何从 Docker 'run' 命令设置 Spring Boot 属性