如何创建一个子域来公开运行在Jenkins管道中docker容器中的应用程序

如何创建一个子域来公开运行在Jenkins管道中docker容器中的应用程序,docker,tomcat,jenkins,devops,traefik,Docker,Tomcat,Jenkins,Devops,Traefik,各位: 我已经在AWS的ec2实例中发布了bitnami jenkins。在同一台机器上,我启动了我的管道,在管道中我使用docker进行了几个进程,其中一个进程启动了一个数据库和一个用于a.war应用程序的tomcat。事实上,我希望能够从子域或其他域(我在docker容器中启动的应用程序能够观察到更改)访问它 为此,我使用traefik,可以看到所有容器都在同一个EC2网络中运行。我还可以将它重定向到某个url。我不知道的是如何创建一个新的子域来实现这个功能。Traefic使用以下命令启动它

各位:

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

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

sudo docker run-d-p 9090:8080-p 888:80——网络公共——名称traefik-v$PWD/traefik.toml:/etc/traefik/traefik.toml-v/var/run/docker.sock:/var/run/docker.sock traefik

在下图中,我向traefik展示了我想对外公开的ip和路径(在本例中,它是具有扩展的域,但我也尝试了子域):

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"
            }
        } 
我想知道的是如何使用Bitnami Jenkins在这个EC2实例中创建子域。因此,您不必通过http://mydomain:9999访问我的应用程序,而可以通过子域http://subdomain.mydomain.com的url或带有扩展名http://mydomain.com/extension的普通域来访问它

我不知道怎么做,因为bitnami jenkins的图像有tomcat、apache2等。我甚至不知道它使用的是哪一个。我想tomcat,因为那是他发动詹金斯战争的地方。即使每次我运行管道时都创建一个不同的子域也很好


再次感谢。

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

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

我猜您的Jenkins实例已经在使用端口80和443,对吗?另外,您的实例是在docker容器中启动的还是安装在操作系统上的?谢谢@tftd。My jenkins端口已经使用端口80和443,并且安装在操作系统(Ubuntu 16.04)上。您需要让traefik成为您的“代理转发器”,并让它使用端口80和443,以便它能够代理将请求从您的域/子域转发到您正在运行的服务。然后您需要将其配置为使用后端(在本例中为docker)。但是,我对Traefik没有太多经验,因此您必须在文档中阅读实际配置,文档中似乎有很好的解释:)如果是这样,我必须移动我的整个Jenkins安装。谢谢你的来信。我不知道我是否可以使用其他端口的Traefik。Traefik是一个http代理转发器,所以你可以使用它。然而,我今天发现有一个叫詹金斯的版本,它可能就是你想要的。