如何在Docker容器上设置Jenkins
Jenkins是一个开源工具,用于执行持续集成和构建自动化。
开发人员可以轻松构建和测试软件,使用延续集成在项目生命周期中的Jenkins。
它允许通过构建管道和集成大量的测试和部署技术来连续地传送软件。
在本教程中,我们将在Ubuntu 16中配置Jenkins2. 04以及Docker内的Nginx反向代理。
要在Docker中设置Jenkins,我们可以通过简单地从官方Jenkins Docker镜像中拉动图像,然后使用Docker命令来设置容器。
但是,通过这种方法,我们将无法配置数据卷,端口配置,反向代理等我们正常执行。
因此,要详细了解,我们将在逐步/模块化方法中配置它。
所以我们将首先创建Jenkins用户和家庭。
创建Jenkins用户和家庭
这在意义上是很重要的,Jenkins使用用户/组ID为1000,如果将相同的用户ID和组ID分配给另一个用户,则运行容器会出现错误。
使用以下命令查找用户ID 1000是否可用。
另一种选择是更改拥有它的用户的UID/GID,允许它离开UID/GID 1000。
当Docker撰写构建Jenkins时,它将创建jenkins的UID/GID 1000以及默认的归属位置为/var/jenkins_home
# useradd -u 1000 -g 1000 jenkins # awk -F: '/\/home/{printf "%s:%s\n",,}' /etc/passwd
如果UID/GID(1000)已分配给另一个用户,则使用USEmod/GroupMod命令将该用户的UID/GID交换。
还要确保已在主机系统中安装了Docker和Docker撰写。
使用以下命令查找其版本。
# docker -v Docker version 1.12.1, build 23cf638 # docker-compose -v docker-compose version 1.9.0, build 2585387
文件夹设置
让我们创建Jenkins的目录结构。
为Jenkins Data,Jenkins Master和Nginx创建Docker项目目录中的三个文件夹。
- 通过名称dockerjenkins(Jenkins Project目录)和一个文件Docker-Compose.yml创建一个根目录。
- 创建三个目录 - Jenkins-Data,Jenkins-Master和Nginx Inside Jenkins Project Directory Inside,它是Dockerjenkins。
- 在所有上述三个文件夹中创建dockerfile。
- 由nginx目录中的名称conf.con.d,ssl,htpass和日志创建四个目录。
- 在nginx中创建nginx默认配置文件default.conf中的jenkins.conf中的jenkins.conf .d将在日志目录中为nginx的日志文件。
- 我们将在稍后阶段为HTPass目录中的SSL目录和HTTP基本用户内部创建nginx内部的键/证书。
# cd ~ # mkdir DockerJenkins # cd DockerJenkins/ ~/DockerJenkins# mkdir jenkins-data ~/DockerJenkins# mkdir jenkins-master ~/DockerJenkins# mkdir nginx ~/DockerJenkins# touch docker-compose.yml ~/DockerJenkins# cd jenkins-data/ ~/DockerJenkins/jenkins-data# touch Dockerfile ~/DockerJenkins/jenkins-data# cd ../jenkins-master ~/DockerJenkins/jenkins-master# touch Dockerfile ~/DockerJenkins/jenkins-master# cd ../nginx/ ~/DockerJenkins/nginx# mkdir conf.d ~/DockerJenkins/nginx# mkdir ssl ~/DockerJenkins/nginx# mkdir logs ~/DockerJenkins/nginx# touch default.conf ~/DockerJenkins/nginx# cd conf.d/ ~/DockerJenkins/nginx/conf.d# touch jenkins.conf ~/DockerJenkins/nginx/conf.d# cd ../logs ~/DockerJenkins/nginx/logs# touch access.log ~/DockerJenkins/nginx/logs# touch error.log
我们Docker项目的当前目录结构(Dockerjenkins)看起来像是这样的 -
dockerjenkins /├──Docker组成。
yml├──jenkins-data│└──dockerfile├──jenkins-master│└──dockerfile└── - nginx├── D│└──詹金斯。
conf├──默认。
CONF├──DOCKERFILE├──日志│├──访问。
日志│└──错误。
log└──ssl├──demohost。
CRT└──Demohost。
钥匙
设置/构建Jenkins数据
现在已经创建了我们的Docker项目的目录结构,我们将首先创建jenkins-data的docker文件。
# cd ~/DockerJenkins/jenkins-data ~/DockerJenkins/jenkins-data# vi Dockerfile FROM ubuntu:16.04 RUN useradd -d "/var/jenkins_home" -u 1000 -m -s /bin/bash jenkins RUN mkdir -p /var/log/jenkins RUN chown -R jenkins:jenkins /var/log/jenkins VOLUME ["/var/log/jenkins", "/var/jenkins_home"] USER jenkins CMD ["echo", "Data container for Jenkins"]
上面的Docker文件为ID 1000添加了"Jenkins"用户,默认为其Home to/var/jenkins_home。
我们还声明了两个卷目录,一个是用于登录另一个是用于Jenkins数据。
图像将为Jenkins Master安装卷,以至于即使我们删除Jenkins Master,也不会丢失数据。
下面的Docker文件中的命令卷["/var/log/jenkins","/var/jenkins_home"]声明Docker主机中的挂载点。
即使我们已退出容器,也可以从主机访问此目录中的任何更改。
但是,如果我们使用新名称运行新的容器,则它安装的主机位置将更改,并且在下次启动相同图像时,数据将不可见。
解决方案很简单。
我们将在Docker-compose中添加volumes_from命令,以永久地将容器名称添加。
这通常称为容器中的持久数据存储。
jenkins-master: image: jenkins volumes_from: - jenkins-data ..................... .....................
接下来,我们搬家为Jenkins Master配置Docker文件,但之前让我们构建Jenkins数据。
~/DockerJenkins/jenkins-data# docker build .
设置/构建Jenkins Master
一旦Jenkins数据建造成功完成,我们将为Jenkins Master创建一个Docker文件,这很容易理解和自我解释。
# cd ~/DockerJenkins/jenkins-master ~/DockerJenkins/jenkins-master# vi Dockerfile FROM jenkins USER root RUN mkdir /var/log/jenkins RUN mkdir /var/cache/jenkins RUN chown -R jenkins:jenkins /var/log/jenkins RUN chown -R jenkins:jenkins /var/cache/jenkins USER jenkins ENV JAVA_OPTS="-Xmx8192m" ENV JENKINS_OPTS="--handlerCountStartup=100 --handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war"
上面的Docker文件拉动Jenkins图像,并且作为root用户创建日志和缓存目录,并将所有权更改为Jenkins以设置环境。
建立Jenkins Master
~/DockerJenkins/jenkins-master# docker build .
设置/构建nginx
首先,为nginx创建dockerfile
# cd ~/DockerJenkins/nginx ~/DockerJenkins/nginx# vi Dockerfile FROM nginx RUN rm /etc/nginx/conf.d/default.conf EXPOSE 80 EXPOSE 443
Jenkins在Port 8080中运行,以便在代理后面访问它,我们将安装Nginx并将其配置为通过SSL访问Jenkins服务。
让我们安装apache2-utils包,其中包含htpasswd实用程序。
# sudo apt-get -y install apache2-utils # cd ~/DockerJenkins/nginx/ ~/DockerJenkins/nginx# mkdir htpass ~/DockerJenkins/nginx# cd htpass/ ~/DockerJenkins/nginx/htpass# htpasswd -c jenkins.password theitroad New password: Re-type new password: Adding password for user theitroad
接下来,我们将为Jenkins站点创建SSL密钥和证书。
# cd ~/DockerJenkins/nginx/ssl root@demohost:~/DockerJenkins/nginx/ssl# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout demohost.key -out demohost.crt Generating a 2048 bit RSA private key ..........................+++ ..............+++ writing new private key to 'demohost.key' ----
编辑默认值。
对于我们在文件夹设置期间创建的nginx表示。
# cd ~/DockerJenkins/nginx/ ~/DockerJenkins/nginx# vi default.conf daemon off; user www-data; pid /var/run/nginx.pid; worker_processes 1; events { worker_connections 1024; } http { # Basic Settings sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 33; types_hash_max_size 2048; server_tokens off; server_names_hash_bucket_size 64; include /etc/nginx/mime.types; default_type application/octet-stream; # Logging Settings access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # Gzip Settings gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 3; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/xml text/css application/x-javascript application/json; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # Virtual Host Configs include /etc/nginx/sites-enabled/*; # Error Page Config #error_page 403 404 500 502 /srv/Splash; }
编辑Jenkins。
在纽约中来。
D目录
~/Dockerjenkins/nginx# vi conf.d/jenkins.conf server { listen 80; listen 443 ssl http2; server_name "demohost.com"; ssl_certificate /etc/nginx/ssl/demohost.crt; ssl_certificate_key /etc/nginx/ssl/demohost.key; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256 GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA AES128-SHAECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256 SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3 SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256 GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; access_log on; location/{ auth_basic "Restricted"; auth_basic_user_file /etc/nginx/htpass/jenkins.password; proxy_pass http://jenkins-master:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; proxy_max_temp_file_size 0; proxy_connect_timeout 150; proxy_send_timeout 100; proxy_read_timeout 100; proxy_buffer_size 8k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
构建nginx容器
# cd ~/DockerJenkins/nginx/ ~/DockerJenkins/nginx# docker build .
创建/运行Docker-Compose
现在我们几乎完成了Jenkins Data,Jenkins和Nginx的设置/构建,让我们编辑Docker撰写。
yml内部docker项目目录,它是dockerjenkins,以便他们可以在孤立的环境中运行。
~/DockerJenkins# vi docker-compose.yml
现在要创建容器,请使用docker-compose。
~/DockerJenkins# docker-compose up -d
-D标志指示Docker撰写以作为守护程序运行。
要检查,列出容器。
# docker ps -a
最后一块拼图是我们如何访问Jenkins的方式,我们是Demohost的情况。
com,它在nginx conf目录(jenkins。
conf)。
为此,我们需要查找nginx容器的IP地址。
使用Docker Inspect命令查找。
root@demohost:~/DockerJenkins# docker inspect <Container_Name_Or_ID_Of_NGINX> | grep IPAddress
编辑主机系统的/etc/hosts文件并添加demohost的条目。
COM并重新启动网络
# vi /etc/hosts ....................................... 172.17.0.2 demohost.com ....................................... # service networking restart
打开我们喜欢的浏览器并将其指向http://<server_name_of_jenkins_or_ip_address>,在我们的情况下它是http://demohost.COM。
你会被要求解锁Jenkins。
输入密码,然后根据要求自定义Jenkins。