DockerDocker lnmp

Jenkins with Docker

2018-08-28  本文已影响0人  啊冬啊冬

在容器化广泛运用的时代,Docker镜像作为新的构建产物有着众多的优点。我们希望CI/CD能够直接输出Docker镜像,使我们流水线的部署更加的方便快捷。

同时,CI/CD作为基础设施,我们也希望能够快速的部署到我们的各个环境中,因此容器化的Jenkins也成为我们的选择之一。

Jenkins

Jenkins是一个持续集成的工具,并且拥有大量实用的插件(Maven、Gradle、Git),可以对不同风格的软件进行持续集成的管理。

jenkins-new

使用Jenkins发布博客镜像

要发布一个博客镜像需要进行以下步骤

使用Jenkins编译Hexo博客

$ docker run -d \
-v /Users/Shared/jenkins_home:/var/jenkins_home \
-p 8080:8080 -p 50000:50000 \
--name jenkins jenkins/jenkins
jenkins-console

打包镜像

现在我们已经有了一个前端工程的构建产物-public,我们需要直接构建出Docker镜像。

Docker Outside of Docker

Build镜像要求我们在Jenkins主机(容器)上可以使用Docker:

Docker进行通信控制的主要程序是/var/run/docker.sock,因此只要将这个sock导入到容器中即可;如果需要更多的控制,可以将/var/docker也共享到容器中。

# 启动一个新容器,将主机的docker环境挂载进去
$ docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker 
--name docker-manager -it ubuntu
# 容器内启动其他容器(兄弟容器)
root@fd83341d1e5b:/# docker run busybox echo "Hello"
Hello

安装内嵌Docker的Jenkins

$ docker run -d \
-v /Users/Shared/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
-p 8080:8080 -p 50000:50000 \
--name jenkins jenkins/jenkins

本机创建一个工作目录/Users/Shared/jenkins_home,需要提供访问权限
绑定jenkinsdocker的相关目录到镜像中

jenkins-failed

为什么会失败

容器内的root用户和主机用户是一致的(部分权限被限制)
(可以开启namespace进行分隔)
jenkins镜像使用内建的jenkins用户进行操作,而这个用户是没有操作docker的权限的

为容器用户添加权限

FROM jenkins/jenkins
USER root
# Mac上访问sock需要root(0)
RUN useradd -G root jenkins
# Linux上访问sock通常是docker(999)用户(通过脚本安装)
# RUN useradd -G docker jenkins
USER jenkins
jenkins-success

使用Vagrant搭建Linux虚拟机

因为MacOS上的Docker是运行在一个Linux虚拟机中的,会造成用户、权限、文件的混乱,因此我们使用一台Linux虚拟机作为Docker4Jenkins的宿主机。

$ vagrant init
# 修改 Vagrantfile,配置镜像、网络
$ vagrant up
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ curl -fsSL https://get.docker.com -o get-docker.sh
vagrant@vagrant-ubuntu-trusty-64:~$ sudo sh get-docker.sh
上一篇下一篇

猜你喜欢

热点阅读