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.正式安装环节

  1. 正式安装步骤

yum install docker
  1. 查看docker版本

docker version
  1. 配置镜像加速器

    针对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
    
  2. 更改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 常用命令如下。

  1. FROM 用于指定构建当前镜像的基础镜像名,使用方法如下。

FROM centos
  1. MAINTAINER 用于填写作者声明的描述信息,使用方法如下。

MAINTAINER Nginx Dockerfile Write by John.Wang
  1. ADD 命令会向 Image 中添加文件,支持文件、目录、URL 的源,使用方法如下。

ADD /tmp/init_nginx.sh /usr/local/nginx/sbin/
  1. COPY 用于向镜像内复制文件夹,使用方法如下。

COPY . /tmp
  1. ENV 设置 Container 启动后的环境变量,使用方法如下。

ENV PATH $PATH:/usr/local/nginx/sbin
  1. EXPOSE 设置 Container 启动后对外开放的端口,它只相当于一个防火墙开放端口的概念,与实际运行的服务无关,使用方法如下。

EXPOSE 8080
  1. RUN 用于在制作 Image 时执行指定的脚本或 shell 命令,使用方法如下。

RUM yum -y install net-tools
  1. USER 设置运行 Image 或 Container 的系统用户,使用方法如下。

USER nginx:nginx
  1. VOLUME 定义 Image 挂载点,该挂载点可被其他 Container 使用,且目录中的内容是共享的,将会同步更新,使用方法如下。

VOLUME ["/data1","/data2"]
  1. WORKDIR 设置 CMD 参数指定命令的运行目录,使用方法如下。

WORKDIR ~/
  1. CMD 命令是设定于 Container 启动后执行的命令,可被外部docker run命令参数覆盖,使用方法如下。

CMD "Hello Nginx"
  1. 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