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

Hug*_*L.M 5 tomcat jenkins docker devops traefik

大家:

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

为此我使用traefik,我可以看到在同一个EC2网络中运行的所有容器.我也可以将它重定向到某个网址.我不知道的是如何创建一个新的子域来使其工作.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

在下面的图像中,我展示了我希望暴露给外部的ip traefik和路径(在这种情况下,它是具有扩展名的域,但我也尝试过子域):

在此输入图像描述

badbin中的traefic配置文件如下:链接到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"
            }
        } 
Run Code Online (Sandbox Code Playgroud)

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

我不知道怎么做,因为bitnami jenkins的形象有tomcat,apache2等.我甚至不知道它正在使用哪一个.我认为tomcat,因为那是他得到jenkins战争的地方.即使每次运行我的管道时创建一个不同的子域也可能很棒.

再次感谢你.

Mic*_*vel 1

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

这是我正在使用的 nginx docker 镜像,它监听机器上的所有容器,并根据容器已启动的环境变量将 http 请求转发到特定容器,按照 README 中的说明设置子域变量下面的链接。 在此输入链接描述