docker(18):使用 dind 镜像,用docker jenkins 构建docker 镜像。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/79756488

1,关于jenkisn build docker


Jenkins 是一个代码编译构建工具,可以直接从 git 上面下载代码,然后进行编译。
构建。希望最后能打成一个docker镜像。

本来以为是个容易的事情,直接找了一个Jenkins 的镜像地址:
https://hub.docker.com/r/jenkinsci/jenkins/
但是发现,这个在h8s 的环境根本跑不了。
后来才知道,这个是因为docker 的文件系统上面不能再虚拟一个文件系统造成的。
我还研究半天,在jenkins docker 上面安装 安装docker ,是可以通过映射
-v /var/run/docker.sock:/var/run/docker.sock 和宿主公用一个docker的方式启动。
但是但是,在k8s 上面不行,就只能使用 dind 了,(docker in docker )

2,构建dind镜像


依赖官方的docker dind 镜像,整个构建过程:
Dockerfile:

FROM docker.io/docker:dind

#使用 ali 仓库地址
RUN echo -e "http://mirrors.aliyun.com/alpine/latest-stable/main\n\
http://mirrors.aliyun.com/alpine/latest-stable/community" > /etc/apk/repositories

#增加不安全链接地址,本地注册中心地址。
RUN mkdir -p /etc/docker && echo -e '{"insecure-registries": ["hub.local.ip:port"]}' > /etc/docker/daemon.json

RUN apk update && apk add tzdata vim openjdk8 libstdc++ curl ca-certificates bash && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    rm -rf /root/.cache

#设置环境变量
ENV JAVA_HOME /usr/lib/jvm/default-jvm
ENV PATH $PATH:$JAVA_HOME/jre/bin:$JAVA_HOME/bin
#安装字体 Jenkins 需要,git,ssh,修改root主目录
RUN apk update && apk add ttf-dejavu git openssh && \
    sed -i -e 's/root:\/root/root:\/var\/jenkins_home/g' /etc/passwd

#设置jenkins 主目录
ENV JENKINS_HOME /var/jenkins_home
#设置maven目录
ENV MAVEN_HOME /var/jenkins_home/tools/maven3
ENV PATH $PATH:$MAVEN_HOME/bin
WORKDIR /var/jenkins_home

#添加启动脚本和 war 文件从Jenkins 下载。
ADD jenkins_run.sh /jenkins_run.sh
ADD jenkins.war /usr/share/jenkins/jenkins.war

EXPOSE 8080

ENTRYPOINT ["/jenkins_run.sh"]

其中jenkins_run.sh 脚本:

#!/bin/sh

nohup java -Duser.home=/var/jenkins_home -jar /usr/share/jenkins/jenkins.war --httpPort=8080 >> /var/log/jenkins.log &
sh /usr/local/bin/dind dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375

使用 nohup 把jenkins 启动,这个不需要 tomcat也可以跑起来的 war 文件。里面自带jetty了。
然后是dind 启动。
构建好镜像之后就可以启动了。

docker build . -t myhub/jenkins:latest

3,启动


docker run –privileged -v /jenkins-data:/var/jenkins_home -d -p 8080:8080myhub/jenkins:latest
加上一个 privileged 特殊参数,使用docker的 以特殊模式运行。
然后进去之后就可以使用docker ps 查看了。
其中 kubernetes 里面也要进行配置,是支持 dind 模式的。
这样整个流程就好了。
需要映射 /var/jenkins_home目录,所有的配置,安装的插件都在这个目录。
这个目录需要持久化。

其中密码在:
cat /var/jenkins_home/secrets/initialAdminPassword
忘记了上去看看。

dind 的镜像里面的配置文件:
/etc/docker/daemon.json
主要增加本地非http的注册中心的。

4,总结


这个地方有两个地方偷懒了。第一没有使用Jenkins 用户构建。
安全上会有点问题。
第二,这个没有使用 slave 的方式去跑一个job。对于有几个项目的工程来说,其实问题不大,构建也费不了多少时间。
要是编译java 还需要安装 maven,通过界面点击下就好了。
jenkins 非常的好用。剩下的事情就熟悉多了。
公司内部使用足够了。
这样 git 使用 gogs ,构建使用 jenkins dind ,运行使用 k8s。
完美的企业内部解决方案。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/79756488

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/79756488
今日推荐