Contents
6. 利用Docker搭建Jenkines-Master-Slave分布式环境¶
6.1. Docker的基础安装¶
Docker容器最早受到RHEL完善的支持是从最近的CentOS 7.0开始的,官方说明是只能运行于64位架构平台,需要注意的是CentOS 6.x与7.0的安装过程是不同的,CentOS 6.x上Docker的安装包叫作docker-io,并且来源于Fedora epel库,这个库维护了大量的没有包含在发行版中的软件,所以要先安装epel,而CentOS 7的Docker直接包含在官方镜像源的Extras仓库。
下面以CentOS 7.4 x86_64物理机器来举例说明。
6.1.1. 1.准备工作¶
1)禁用SELinux,命令如下所示:
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config # 永久关闭selinux服务
setenforce 0 # 临时关闭setenforc ,命令行设置立即生效
2)/etc/yum.repos.d/CentOS-Base.repo下的[extras]节enable=1启用,默认是启用状态,但要注意检查一下,如果此项是0,应调整成1。
3)检查内核版本等:
Docker的存储驱动是Device Mapper,看一下我们的驱动是否符合,命令如下所示:
grep device-mapper /proc/devices
6.1.2. 2.正式安装环节¶
正式安装步骤
yum install docker
查看docker版本
docker version
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://25bxwt20.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
更改Docker Host默认监听
1.修改配置文件
执行命令: vim /lib/systemd/system/docker.service
# 注释掉这行
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2.将管理地址写入 /etc/profile
执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
执行命令:source /etc/profile
3.重启服务
执行命令: systemctl daemon-reload && systemctl restart docker
到目前为止,Docker的安装过程基本上就结束了。有一点需要注意,Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版Docker CE和企业版Docker EE。Docker CE是免费提供给个人开发者和小型团体使用的,Docker EE会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。Docker CE是免费的Docker产品的新名称,Docker CE包含了完整的Docker平台,非常适合开发人员和运维团队构建容器APP。
6.2. Dockerfile打包Docker镜像¶
Dockerfile 常用命令如下。
FROM 用于指定构建当前镜像的基础镜像名,使用方法如下。
FROM centos
MAINTAINER 用于填写作者声明的描述信息,使用方法如下。
MAINTAINER Nginx Dockerfile Write by John.Wang
ADD 命令会向 Image 中添加文件,支持文件、目录、URL 的源,使用方法如下。
ADD /tmp/init_nginx.sh /usr/local/nginx/sbin/
COPY 用于向镜像内复制文件夹,使用方法如下。
COPY . /tmp
ENV 设置 Container 启动后的环境变量,使用方法如下。
ENV PATH $PATH:/usr/local/nginx/sbin
EXPOSE 设置 Container 启动后对外开放的端口,它只相当于一个防火墙开放端口的概念,与实际运行的服务无关,使用方法如下。
EXPOSE 8080
RUN 用于在制作 Image 时执行指定的脚本或 shell 命令,使用方法如下。
RUM yum -y install net-tools
USER 设置运行 Image 或 Container 的系统用户,使用方法如下。
USER nginx:nginx
VOLUME 定义 Image 挂载点,该挂载点可被其他 Container 使用,且目录中的内容是共享的,将会同步更新,使用方法如下。
VOLUME ["/data1","/data2"]
WORKDIR 设置 CMD 参数指定命令的运行目录,使用方法如下。
WORKDIR ~/
CMD 命令是设定于 Container 启动后执行的命令,可被外部
docker run命令参数覆盖,使用方法如下。
CMD "Hello Nginx"
ENTRYPOINT 命令是设定于 Container 启动后执行的命令,不可被外部
docker run命令参数覆盖。
ENTRYPOINT /usr/local/nginx/sbin/init_nginx.sh
现在,可以按照 Dockerfile 的命令格式编写 Dockerfile 了,基础镜像选用 CentOS 7,Nginx 选用 Nginx 的扩展版本 OpenResty 1.15.8.2。
以Nginx为例作为参考模板
FROM centos:centos7
MAINTAINER Nginx Dockerfile Write by John.Wang
RUN yum -y install epel-release && yum -y install wget gcc make pcre-devel \
zlib-devel openssl-devel libxml2-devel libxslt-devel luajit GeoIP-devel \
gd-devel libatomic_ops-devel luajit-devel perl-devel perl-ExtUtils-Embed
RUN cd /tmp && wget https://openresty.org/download/openresty-1.15.8.2.tar.gz && \
tar zxmf openresty-1.15.8.2.tar.gz && \
cd openresty-1.15.8.2 && \
./configure \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-libatomic \
--with-pcre-jit \
--with-stream_ssl_preread_module && \
gmake && gmake install
ENV PATH $PATH:/usr/local/nginx/sbin
RUN ln -s /usr/local/openresty/nginx /usr/local/nginx
RUN ln -sf /dev/stdout /usr/local/nginx/logs/access.log &&\
ln -sf /dev/stderr /usr/local/nginx/logs/error.log
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Jenkins/ssh-slave的Dockerfile文件,内容如下:
FROM openjdk:8-jdk
LABEL MAINTAINER="Nicolas De Loof <nicolas.deloof@gmail.com>"
ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000
ARG JENKINS_AGENT_HOME=/home/${user}
ENV JENKINS_AGENT_HOME ${JENKINS_AGENT_HOME}
RUN groupadd -g ${gid} ${group} \
&& useradd -d "${JENKINS_AGENT_HOME}" -u "${uid}" -g "${gid}" -m -s /bin/bash "${user}"
# setup SSH server
RUN apt-get update \
&& apt-get install --no-install-recommends -y openssh-server \
&& rm -rf /var/lib/apt/lists/*
RUN sed -i /etc/ssh/sshd_config \
-e 's/#PermitRootLogin.*/PermitRootLogin no/' \
-e 's/#RSAAuthentication.*/RSAAuthentication yes/' \
-e 's/#PasswordAuthentication.*/PasswordAuthentication no/' \
-e 's/#SyslogFacility.*/SyslogFacility AUTH/' \
-e 's/#LogLevel.*/LogLevel INFO/' && \
mkdir /var/run/sshd
VOLUME "${JENKINS_AGENT_HOME}" "/tmp" "/run" "/var/run"
WORKDIR "${JENKINS_AGENT_HOME}"
COPY setup-sshd /usr/local/bin/setup-sshd
EXPOSE 22
ENTRYPOINT ["setup-sshd"]
6.3. 利用docker-compose编排多容器¶
version: '2'
services:
jenkins-master:
image: jenkins
container_name: jenkins-master
ports:
- "8080:8080"
environment:
- TZ=Asia/Shanghai
volumes:
- /work/jenkins_master:/var/jenkins_home
extra_hosts:
- "gitlab.bmkp.cn:10.186.6.170"
jenkins-slave-jmeter1:
image: yuhongchun/jenkins-slave-docker-jmeter:v1.0
container_name: jenkins-slave-jmeter1
ports:
- "2226:22"
environment:
- TZ=Asia/Shanghai
volumes:
- /var/run/docker.sock:/var/run/docker.sock
extra_hosts:
- "gitlab.bmkp.cn:10.186.6.170"
command:
- "ssh-rsa B3NzaC1yc2EAAAADAQABAAABAQDQZb1vjKLkWAUOJaua/8CSFSID6L+8MbgutffdBqIeyoUvLUPpH2NkFAxKf8hW3Dj0lGkQ36hutsM23Jcs8b7rjhScmx2obyp7J1s7wic1GE3xaQY1Y0qwaxL3LIkmkrqkTdYyiVnD0Qv4PCx5GBTLQT2Xhf7wjE6oQcTOaIVu/RkooBv7sfEbcGMLwZmzFqqGtY0zEv/tbsvusVg7GPMFTvMw1r9l1C1G5Rxgcz76Vy+4MNskxdBsOZDWoX4gGulkbCBNP5Hf4WsvfH1HzPaoc3PTPUwht7/U2OtLNzO2C1rphRA6A4Eksyc3KI8OCSbku0KnGyM836QKtOv6UyR3 jenkins@1314520d"
jenkins-slave-mvn1:
image: yuhongchun/jenkins-slave-docker-maven:v1.0
container_name: jenkins-slave-mvn1
ports:
- "2222:22"
environment:
- TZ=Asia/Shanghai
volumes:
- /var/run/docker.sock:/var/run/docker.sock
extra_hosts:
- "gitlab.bmkp.cn:10.186.6.170"
command:
- "ssh-rsa B3NzaC1yc2EAAAADAQABAAABAQDQZb1vjKLkWAUOJaua/8CSFSID6L+8MbgutffdBqIeyoUvLUPpH2NkFAxKf8hW3Dj0lGkQ36hutsM23Jcs8b7rjhScmx2obyp7J1s7wic1GE3xaQY1Y0qwaxL3LIkmkrqkTdYyiVnD0Qv4PCx5GBTLQT2Xhf7wjE6oQcTOaIVu/RkooBv7sfEbcGMLwZmzFqqGtY0zEv/tbsvusVg7GPMFTvMw1r9l1C1G5Rxgcz76Vy+4MNskxdBsOZDWoX4gGulkbCBNP5Hf4WsvfH1HzPaoc3PTPUwht7/U2OtLNzO2C1rphRA6A4Eksyc3KI8OCSbku0KnGyM836QKtOv6UyR3 jenkins@1314520d"
jenkins-slave-sbt1:
image: yuhongchun/jenkins-slave-sbt:1.0
container_name: jenkins-slave-sbt1
ports:
- "2224:22"
environment:
- TZ=Asia/Shanghai
volumes:
- /var/run/docker.sock:/var/run/docker.sock
extra_hosts:
- "gitlab.bmkp.cn:10.186.6.170"
networks:
- default
command:
- "ssh-rsa B3NzaC1yc2EAAAADAQABAAABAQDQZb1vjKLkWAUOJaua/8CSFSID6L+8MbgutffdBqIeyoUvLUPpH2NkFAxKf8hW3Dj0lGkQ36hutsM23Jcs8b7rjhScmx2obyp7J1s7wic1GE3xaQY1Y0qwaxL3LIkmkrqkTdYyiVnD0Qv4PCx5GBTLQT2Xhf7wjE6oQcTOaIVu/RkooBv7sfEbcGMLwZmzFqqGtY0zEv/tbsvusVg7GPMFTvMw1r9l1C1G5Rxgcz76Vy+4MNskxdBsOZDWoX4gGulkbCBNP5Hf4WsvfH1HzPaoc3PTPUwht7/U2OtLNzO2C1rphRA6A4Eksyc3KI8OCSbku0KnGyM836QKtOv6UyR3 jenkins@1314520d"
在master上部署使用jenkins-master部分yml内容,若在Slave机器上部署则去掉jenkins-master部分内容。
配置成功后,我们在相关物理机上执行如下命令,来启动这些容器。
docker-compose up -d