Skip to content

博客

使用Jenkins进行Docker构建环境配置

使用Jenkins对go程序进行编译,并构建docker镜像。这里讲述了在Centos7系统上,从零开始配置Jenkins(设置jenkins home目录、配置角色、配置用户),新建项目,配置docker。

系统环境:Centos7

Jenkins:2.165

Go:1.10.2

Docker: 18.03.1-ce

  1. 安装

添加Jenkins repository 到yum repos, 再安装Jenkins.

Terminal window
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins

或者直接下载, 并将war包添加到环境变量中。

  1. 运行

    在终端中执行:

    Terminal window
    java -jar jenkins --httpPort=8080

    在浏览器打开 http://localhost:8080

    指定Jenkins HOME目录可以:

    Terminal window
    JENKINS_HOME=/home/xw/jenkins_home java -jar /usr/lib/jenkins/jenkins.war --httpPort=8080 &

使用第三方插件:Locale plugin

具体参见:[Jenkins强制设置语言为中文](https://www.cnblogs.com/hanxiaohui/p/8136621.html)

三、配置Jenkins的授权和访问控制

Section titled “三、配置Jenkins的授权和访问控制”

由于jenkins默认的权限管理体系不支持用户组或角色的配置,所以使用第三方插件Role Strategy Plugin实现。

配置过程,见:[Jenkins学习七:Jenkins的授权和访问控制](https://www.cnblogs.com/yangxia-test/p/4368778.html)

配置过程中,配置不当导致admin无法登陆时,可以通过修改配置文件方式解决, 具体可以参见以下方式解决:

有两种方式, 一种是配置仓库的用户名和密码,另外一种是配置SSH私钥, 配置方式具体可以参见:

构建可以通过设置参数,来达到可以在指定的分支、指定的Tag或者特定参数(如指定版本号)的情况下,进行特定化构建。

Jenkins默认不知可选择的参数,可以通过第三方插件来支持: Extensible Choice Parameter plugin

具体操作配置,可以参见:

配置过程中的指定的参数,会在[Build->Execute shell]中以环境变量的形式存在。

##六、配置Docker

这里准备使用新建[Freestyle project]项目,并通过【Execute shell】的最基本的方式来构建Docker镜像

由于Excel shell中是使用系统jenkins用户来执行docker命令,所以需要在jenkins用户下进行登录Docker私有仓库。

Terminal window
sudo su -s /bin/bash jenkins
bash-4.2$ docker login --username=xxx registry.cn-beijing.aliyuncs.com

在新建的自由风格项目中,指定好代码仓库后, 编辑Build部分如:

Docker运行cron

有时只需要运行最简单的单命令cron任务。alpine Docker镜像提供了一个很好的选择,这个镜像通过busybox提供了一个简单灵活的cron包。

复杂的定时任务,可以通过挂载卷的方式。

Terminal window
docker run -it --rm -v $PWD/tasks.cron:/tasks.cron alpine:3.5 sh -c "crontab /tasks.cron && crond -f -L /dev/stdout"

tasks.cron

* * * * * echo hello

构建自己的Docker镜像,通过使用ENTRYPOINT可以更简洁的运行cron任务

FROM alpine:3.8
LABEL maintainer="xwxwgo.com"
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]

entrypoint.sh

#!/bin/sh
set -e
echo "$1" | crontab - && crond -f -L /dev/stdout

构建、执行

Terminal window
# 构建镜像
$ docker build -t xw-cron ./
# 执行
$ docker run -it --rm xw-cron "* * * * * echo hello"

Docker常用命令

Terminal window
docker run --detach --name web nginx:latest

—detach 缩写是 -d, 使用该选项,程序将在后台启动,不会附着到终端。运行守护式容器适合后台静默运行程序,也即是守护程序。

—name, 每个容器分配一个唯一的标识符, 一个16进制编码的1024位数字。大多数Docker界面上,Docker ID会截断前12个字符,使生成的ID更人性化,—name标识可以给容器分配一个固定的名称。

Terminal window
docker run --ineractive --tty --name test busybox:latest /bin/sh

—interactive(或-i) 选项会让Docker保持标准输入流(stdin, 标准输入)对容器开发, 即使容器没有终端连接。

—tty(或-t)选项会让Docker为容器分配一个虚拟终端,这使得可以给发送信号给容器

docker ps 命令可以查看当前正在运行中的容器。

Terminal window
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21f9caa76a05 busybox:latest "/bin/sh -c 'sleep 3…" 21 minutes ago Up 21 minutes nsa

该命令显示每个运行中容器的以下信息:

  • CONTAINER ID 容器ID
  • IMAGE 使用的镜像
  • COMMAND 执行的命令
  • CREATED 容器运行的时长
  • PORT 容器暴露的网路端口
  • NAMES 容器名
Terminal window
docker restart test

docker restart 通过容器的ID或者容器名称,可以重启已经停止的容器

Terminal window
docker logs test

通过docker logs命令选项—fllow(或-f),可用来显示容器日志,并继续监视和更新容器的日志显示,不放过日志中的任何变化。

Terminal window
docker run -d --read-only wordpress:4

使用—read-only标志,可以创建一个只读的文件系统,容器不能更改它所包含的任何文件,因而即使容器中有攻击者,也无法破坏任何文件

Terminal window
docker run --env MY_ENV="hello world" busybox:latest

使用—env或者缩写-e,可以用于注入任何环境变量

Docker 提供重启策略,来控制容器退出时的自动重启行为。要为容器配置重启策略,需要在docker run 命令使用—restart标志, —restart标志值可以使用以下值:

描述
no不自动重启容器(默认值)
on-failure容器由于错误退出也即非0退出时,自动重启容器
always不管退出状态码是什么始终重启容器,docker daemon将无限次数地重启容器。容器也会在daemon启动时尝试重启,不管容器当时的状态如何。
unless-stopped同always相似,不管退出状态码是什么始终重启容器,不过当daemon启动时,如果容器之前已经为停止状态,不会尝试启动它。
Terminal window
docker run -d --restart unless-stopped redis

Minikube访问私有仓库

上一篇Kubernetes搭建本地实验环境 安装好可以本地运行的单节点Kubernetes,这里继续相关的配置, 主要涉及到:

  1. 配置私有Docker镜像仓库
  2. 通过kubectl命令访问Kubernetes

Minikube插件registry-creds, 将Google容器注册表(GCR),亚马逊EC2容器注册表(ECR)和私有Docker仓库注册表

凭证映射到Minikube。需要运行:minikube addons configure registry-credsminikube addons enable registry-creds 命令, 如:

Terminal window
$ minikube addons configure registry-creds
Do you want to enable AWS Elastic Container Registry? [y/n]: n
Do you want to enable Google Container Registry? [y/n]: y
-- Enter path to credentials (e.g. /home/user/.config/gcloud/application_default_credentials.json):/home/user/.config/gcloud/application_default_credentials.json
Do you want to enable Docker Registry? [y/n]: n
registry-creds was successfully configured
$ minikube addons enable registry-creds

k8s中配置私有容器registry更好的处理方式是使用ImagePullSecrets

在Minikube通过虚拟机的方式运行Kubernetes,可以使用kubectl访问集群信息,如:

Terminal window
$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

3、局域网中的其他机器通过kubectl命令访问集群

Section titled “3、局域网中的其他机器通过kubectl命令访问集群”

由于Minikube启动时是通过虚拟机的方式,此时只能本机访问,局域网中的其他机器无法访问。此时,可以通过kubectl proxy方式进访问。

Terminal window
$ kubectl proxy --address='0.0.0.0' --disable-filter=true &

默认将Kubernetes api代理到本地8001端口

复制本机/etc/kubernetes/kubelet.conf, 到目标机器 ~/.kube, 并重命名为config, 并将将https://192.168.1.128:8443, 修改为修改为本机ip, 如:http://192.168.1.111:80001 并保存。

此时,就可以在目标机器上使用kubectl命令访问集群。

  1. insecure_registry
  2. Pull an Image from a Private Registry

Kubernetes搭建本地实验环境

为了方便大家本地开发和体验Kubernetes,社区提供了可以在本机部署的Minikube, 此外, Docker社区版也已经提供了对Kubernetes的支持。

<>

这里将使用Minikube进行本地部署。由于网络问题,这里具体用阿里修改的版本(Minikube v0.31.0), 从阿里云的镜像地址来获取所需Docker镜像和配置。

如需更新minikube,需要更新 minikube 安装包

  • minikube delete删除现有虚机,删除~/.minikube` 目录缓存的文件
  • 重新创建 minikube 环境
  • 安装 kubectl

  • 安装 Minikube

    Mac OSX

    Terminal window
    curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.31.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

    Linux

    Terminal window
    curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.31.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

缺省Minikube使用VirtualBox驱动来创建Kubernetes本地环境

Terminal window
$ minikube start --registry-mirror=https://registry.docker-cn.com

缺省启动时,虚拟机默认使用2核2048M内存, 可以在启动时指定参数,来修改默认行为

Terminal window
# 虚拟机使用4096M内存, 3核CPU
$ minikube start --registry-mirror=https://registry.docker-cn.com --memory=4096 --cpus=3

启动过程容易出错,方便定位问题,可以通过—alsologtostderr指定启动过程中,在标准输出中也输出日志信息

Terminal window
$ minikube start --registry-mirror=https://registry.docker-cn.com --memory=4096 --cpus=3 --alsologtostderr
W0102 15:18:57.642061 25984 root.go:146] Error reading config file at /root/.minikube/config/config.json: open /root/.minikube/config/config.json: no such file or directory
I0102 15:18:57.646767 25984 notify.go:121] Checking for updates...
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
I0102 15:18:57.877452 25984 cluster.go:69] Machine does not exist... provisioning new machine
I0102 15:18:57.877480 25984 cluster.go:70] Provisioning machine with config: {MinikubeISO:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v0.31.0.iso Memory:4096 CPUs:3 DiskSize:20000 VMDriver:virtualbox ContainerRuntime: HyperkitVpnKitSock: HyperkitVSockPorts:[] XhyveDiskDriver:ahci-hd DockerEnv:[] InsecureRegistry:[] RegistryMirror:[https://registry.docker-cn.com] HostOnlyCIDR:192.168.99.1/24 HypervVirtualSwitch: KvmNetwork:default Downloader:{} DockerOpt:[] DisableDriverMounts:false NFSShare:[] NFSSharesRoot:/nfsshares UUID: GPU:false}
Downloading Minikube ISO

打开Kubernetes控制台

Terminal window
$ minikube dashboard

此时,通过在在本机查看到Kubernetes dashboard

但只能在本机浏览访问,如果需要在局域网中的其他机器上访问dashboard,可以:

Terminal window
$ kubectl proxy --address='0.0.0.0' --disable-filter=true &

将Kubernetes API代理到本地,默认端口是8001(—proxy参数可以自定义),访问地址指定为“0.0.0.0”。假定本机IP为:192.168.1.2, 那么dashboard访问地址:http://192.168.1.2:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/