我想在带有docker的ec2上设置一个安全的Jenkins主服务器。 我在这里使用标准的jenkins docker文件:https://registry.hub.docker.com/_/jenkins/
默认情况下,它会打开一个不安全的8080 http端口。但是我希望它使用带https的标准443端口(起初我想使用自签名证书)。
我在这个主题上进行了一些研究,发现了几种可能的解决方案。我对docker并不是很熟悉,所以我仍然无法找到一个我可以使用或实现的简单版本。以下是我发现的一些选项:
有人可以体验请向我推荐最佳解决方案吗?
P.S。我不确定ec2会给我带来多少麻烦,但我认为它只是在安全组中打开443。
答案 0 :(得分:17)
在Docker上传递了一些教程之后,我发现最简单的选项是2号.Jenkins docker image以一种你可以轻松地将参数传递给jenkins的方式声明入口点。
假设您在ubuntu ec2实例的主文件夹中将您的密钥库(例如,在此示例中为自签名)作为jenkins_keystore.jks。以下是如何生成一个的示例:
keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 2048
现在,您可以轻松地将jenkins配置为仅在https上运行,而无需创建自己的docker镜像:
docker run -v /home/ubuntu:/var/jenkins_home -p 443:8443 jenkins --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword
-v /home/ubuntu:/var/jenkins_home
将主机主文件夹公开给jenkins docker容器-p 443:8443
将容器中的8443 jenkins端口映射到主机的443端口--httpPort=-1 --httpsPort=8443
阻止jenkins http并在容器内的端口8443上使用https公开它--httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=mypassword
提供已从主机主文件夹映射到容器/var/jenkins_home/
文件夹的密钥库。答案 1 :(得分:2)
像otognan一样,我也建议做#2,但看来他的答案已经过时了。
首先,使用jenkins/jenkins:lts
图片,因为jenkins
图片已弃用(请参见https://hub.docker.com/_/jenkins/)
现在,让我们进行设置。您需要停止当前的jenkins容器以释放端口。
首先,您需要一个证书密钥库。如果您没有密码,则可以使用
创建一个自签名密码。keytool -genkey -keyalg RSA -alias selfsigned -keystore jenkins_keystore.jks -storepass mypassword -keysize 4096
接下来,我们将SSL参数传递到jenkins容器中。这是我用来执行此操作的脚本:
read -s -p "Keystore Password:" password
echo
sudo cp jenkins_keystore.jks /var/lib/docker/volumes/jenkins_home/_data
docker run -d -v jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 443:8443 -p 50000:50000 jenkins/jenkins:lts --httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password
-v jenkins_home:/var/jenkins_home
创建一个名为jenkins_home
的命名卷,根据约定该卷恰好存在于/var/lib/docker/volumes/jenkins_home/_data
处。
/var/lib/docker/volumes/jenkins_home/_data
上的目录尚不存在,则需要在复制密钥库之前使用docker volume
创建命名卷。-p 443:8443
将容器中的8443 jenkins端口映射到主机的443端口--httpPort=-1 --httpsPort=8443
阻止http并在容器内部的端口8443(容器外部的端口443)上显示https。 --httpsKeyStore=/var/jenkins_home/jenkins_keystore.jks --httpsKeyStorePassword=$password
提供了密钥库,该密钥库位于容器内部的/var/jenkins_home/jenkins_keystore.jks
(容器外部的/var/lib/docker/volumes/jenkins_home/_data/jenkins_keystore.jks
)。-v /var/run/docker.sock:/var/run/docker.sock
是可选的,但是允许您的jenkins实例启动其他Docker容器的推荐方法。 -v $(which docker):/usr/bin/docker
也是可选的,但允许您的jenkins容器能够运行docker二进制文件。
-v $(which docker):/usr/bin/docker
并将docker安装在jenkins容器中。您需要确保内部容器docker和外部主机docker是同一版本,以便支持通过/var/run/docker.sock
进行的通信。-v $(which docker):/usr/bin/docker
,但在主机上安装静态链接的docker二进制文件。您现在应该可以在没有端口说明符的情况下通过https访问jenkins Webportal(因为https默认为端口443)
感谢otognan让我参与其中。
答案 2 :(得分:0)
我会在同一容器中使用nginx和jenkins,并使用supervisord来管理这两个进程。使用内置工具保护不同的服务是一件痛苦的事。 nginx对所有服务的工作方式相同,并且易于配置。在某些方面,使用docker-compose(无花果)来创建两个不同的容器并将它们与docker提供的相当内部网络连接起来是可能的,并且更好。问题是,像马拉松这样的集群管理器仍然不能很好地支持一起运行工作对。告诉大多数服务运行单个容器,而不是运行两个容器,但要确保它们位于同一主机上要容易得多。
答案 3 :(得分:0)
我知道这是一个非常古老的话题,但我想分享一篇详细介绍反向代理选项的博客文章:https://itnext.io/setting-up-https-for-jenkins-with-nginx-everything-in-docker-4a118dc29127
Jenkins 建议在文档中设置反向代理。乍一看,这似乎是一项额外的工作,但它也是与 CI/CD 环境相关的其他服务(即 SonarQube)的通用解决方案。