使用Docker构建简单的CICD工具链

在前一篇帖子中创建的环境中,使用Docker容器构建工具链。尝试一下后,我深刻地认为Docker是非常强大的。

image

GitLab – 码库

在CentOS上执行命令。
# docker pull gitlab/gitlab-ce:latest
# docker run –detach –publish 442:442 –publish 80:80 –name gitlab gitlab/gitlab-ce:latest
在宿主机浏览器中访问CentOS的80端口,并设置root密码。

Jenkins

我决定启动一个包含kubectl和ansible的Jenkins容器,尽管目前还不确定是否会用到它们。我会在CentOS上操作。哦,如果需要的话,我会安装maven。

创建工作目录

# 创建文件夹并进入
# 使用curl命令下载https://codeload.github.com/jenkinsci/docker/zip/master的内容,保存为docker-master.zip
# 使用unzip命令解压docker-master.zip

创建Dockerfile

编辑Dockerfile为:

来自jenkins
用户根
运行apt-get更新&& \
安装-y ansible && \
rm -rf /var/lib/apt/lists/*
curl-Lo /usr/local/bin/kubectl http://storage.googleapis.com/kubernetes-release/release/v1.3.0/bin/linux/amd64/kubectl && \
chmod +x /usr/local/bin/kubectl
用户$ {user}

构建Docker镜像

使用以下的原生中文翻译,只需要一种选择:
# 在此目录下构建 Docker 镜像并命名为。

容器运行

为了使Jenkins能够使用CentOS上的Docker环境,同时挂载相关文件并运行容器。

docker run -d –name Jenkins -p 8080:8080 -p 50000:50000 ¥
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker ¥
–privileged -u root

启用Jenkins

image

接下来需要进行插件安装和创建用户。

kubectl的配置

为了通过Jenkins的kubectl操作CentOS上的minikube,我们从CentOS中重用以下配置文件。

~/.kube/config :点/家/用户名/.kube/配置文件
~/.minikube/ca.crt :点/家/用户名/.minikube/ca.crt
~/.minikube/apiserver.crt :点/家/用户名/.minikube/apiserver.crt
~/.minikube/apiserver.key :点/家/用户名/.minikube/apiserver.key

任何方法都可以,可以修改config的内容并改变目录结构。以下是从CentOS直接推送文件的示例。
$ docker exec mkdir /root/.kube
$ docker cp .kube/config :/root/.kube
$ docker exec mkdir /root/.minikube
$ docker cp .minikube/ca.crt :/root/.minikube
$ docker cp .minikube/apiserver.crt :/root/.minikube
$ docker cp .minikube/apiserver.key :/root/.minikube

做法可以是任何样子的,可以修改config的内容并改变目录结构。以下是从CentOS直接推送文件的示例。
$ docker exec mkdir /root/.kube
$ docker cp .kube/config :/root/.kube
$ docker exec mkdir /root/.minikube
$ docker cp .minikube/ca.crt :/root/.minikube
$ docker cp .minikube/apiserver.crt :/root/.minikube
$ docker cp .minikube/apiserver.key :/root/.minikube

使用kubectl进行操作确认
$ kubectl版本
$ kubectl获取pod

JFrog- 皇家青蛙

用CentOS进行操作。
$ docker pull docker.bintray.io/jfrog/artifactory-oss:latest
在CentOS上创建JFrog的仓库。
$ mkdir
$ cd
$ mkdir data logs etc
运行JFrog容器。
$ docker run -d -p 8081:8081 \
-v /data:/var/opt/jfrog/artifactory/data \
-v /logs:/var/opt/jfrog/artifactory/logs \
-v /etc:/var/opt/jfrog/artifactory/etc \
docker.bintray.io/jfrog/artifactory-oss:latest
在宿主机的浏览器中访问CentOS的8081端口,并设置管理员密码。

Docker注册表

DockerRegistry的启动非常简单!

Docker Registry的运行

运行 Docker,将端口5000映射到5000,并命名为registry,并使用最新的registry版本。

然而,由于证书设置本身非常复杂,因此选择在Docker Registry上进行不安全的注册表设置。以CentOS为操作系统进行操作。
我参考了以下网站:
从CentOS Repository的docker迁移到Docker社Repository的docker-engine。
https://docs.docker.com/engine/admin/systemd/

指定Dockerd读取环境配置文件。

# 创建一个名为/etc/systemd/system/docker.service.d的文件夹
# 使用vi命令打开docker.conf文件

[服务]
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=
ExecStart=/usr/bin/dockerd $OPTIONS

以下是该文本的中文释义:

[服务]
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=
ExecStart=/usr/bin/dockerd $OPTIONS

创建环境配置文件

在 CentOS 上打开 /etc/sysconfig/docker 文件,并将 insecure-registry 设置为 CentOS_IP:5000。

选项=”–insecure-registry CentOS_IP:5000″

重新启动Dockerd

重载系统守护进程: systemctl daemon-reload
重启 Docker: systemctl restart docker

当minikube的docker机器从Registry拉取镜像时,出现了类似”minikube:docker pull caused “oversized record received” error”的错误。
参考了”Docker Private registry: server gave HTTP response to HTTPS client”的解决方案,成功解决了无法进行Docker Private registry的推送和拉取的问题。

在CentOS上的minikube的KVM里设置不安全的注册表。
$ minikube ssh
$ sudo cat >> /etc/docker/daemon.json
{ “insecure-registries”:[“:5000”] }
重新启动docker。
$ sudo systemctl restart docker
退出minikube的shell。
$ exit

路由表

这样,CI工具的设置就完成了。为了实现CI工具之间的协同,最好给它们分配一个固定的IP地址,但我觉得这很麻烦,所以我决定通过脚本指定容器的启动顺序来绕过这个问题。

然而,当前状态下无法直接从主机访问minikube的KVM。由于需要访问minikube的KVM才能访问运行在minikube上的容器,所以现在才注意到这是画蛇添足的行为。

为了KVM,CentOS设置了两个桥接器:virbr0和virbr1。检查iptables时,发现virbr0允许(看起来是)自己的段内进行转发。

转发链 (策略接受 0 数据包, 0 字节)
包 字节 目标 协议 进口 出口 源 目的地
<<省略>>
8 642 接受 所有 – * virbr0 0.0.0.0/0 virbr0/24 连接状态相关,已建立
740 804K 接受 所有 – virbr0 * virbr0/24 0.0.0.0/0
0 0 接受 所有 – virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
37 2916 拒绝 所有 – * virbr0 0.0.0.0/0 0.0.0.0/0 拒绝-使用不可达端口 ICMP
0 0 拒绝 所有 – virbr0 * 0.0.0.0/0 0.0.0.0/0 拒绝-使用不可达端口 ICMP
<<省略>>

首先,在MacOS上添加路由表。
$ sudo route -n add <virbr0的网段>/24

只有这样是无法通过主机到达KVM的,需要通过virbr0进行访问。
在CentOS的iptables中添加了允许所有规则后,成功通过。这是暂时的解决方案。在CentOS进行操作。
$iptables -I FORWARD -o virbr0 -j ACCEPT

2017/03/09 追记:
为了解决上述规则中ctstate的问题,我们添加了NEW。
$ iptables -R FORWARD NN -o virbr0 -d virbr0/24 -j ACCEPT -m conntrack –ctstate NEW, RELATED, ESTABLISHED

以上的源代码仓库、CI工具、构件库、Docker私有注册表和Kubernetes执行环境的搭建应该已经完成了。
先对CentOS虚拟机进行快照以确保基本稳定,接下来即将开始着手进行DevOps CI/CD的高峰攀登了吗?(或许还稍微有点犹豫)

广告
将在 10 秒后关闭
bannerAds