以下各节点操作系统仍然均为Ubuntu 18.04。

本文假设有两个节点,主节点IP为A,从节点IP为B,以下的方案都搭建在主节点A上,此外还会用到一台个人电脑C,可以为Linux或者Windows系统。

1.docker registry

registry主要用于对docker镜像进行收纳,作为一个docker私有仓库。如果没有自建的docker仓库的话,就需要使用公有仓库,因为在主节点打包的镜像不能在从节点上直接拉取,必须要先放到仓库中才能做到。在我搭建的实验环境是内网,所以当时镜像拉取速度很快,但是目前生产环境使用的是公网,可能效果不如放在某个公用仓库那么好了,但搭起来也不难不如顺手搭一下,这里将仓库放在从节点A上,因此以下操作都是在从节点A上进行的。

mkdir registry # 创建存放镜像的文件夹
docker run -d \
	-p 5000:5000 \
	-v /home/zekdot/registry:/var/lib/registry \
	registry

最后进行一次验证

zekdot@A:~$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}

这样说明已经安装成功

使用这种方式时,仓库的使用者可能会报SSL相关的错误,所以有两种解决方法。

第一种是申请SSL证书,然后利用Nginx做一个SSL代理进行数据转发,这样让Nginx监听5000端口并配置证书,然后让registry的端口映射改到5001去。

Nginx的配置文件:

server {
	listen 5000;
	server_name xxx.com;

    #添加头部信息
	client_max_body_size 2048m;    
    ssl on;
    ssl_certificate /home/zekdot/ssl/1_www.xxx.com_bundle.crt;
    ssl_certificate_key /home/zekdot/ssl/2_www.xxx.com.key;
	location / {
        	proxy_pass http://localhost:5001/;  #注意:使用代理地址时末尾记得加上斜杠"/"。      
    	}
}

此时的启动命令:

docker run -d \
	-p 5001:5000 \
	-v /home/zekdot/registry:/var/lib/registry \
	registry

第二种更加对于服务端更加简单一点,需要在客户端从节点B配置忽略ssl。

编辑/etc/docker/daemon.json,增加"insecure-registries",对我们的仓库地址A:5000取消SSL方式。

"insecure-registries"{
        "bip" : "192.168.200.1/24",
        "mtu" : 1400,
        "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com","http://hub-mirror.c.163.com", "https://registry.docker-cn.com"],
        "insecure-registries": [
                "A:5000"
        ]
}

到这里我们的镜像仓库就搭建完成了。

2.私有git仓库

搭建私有git的好处一方面在于可以建立任意多的私有仓库,另一方面,从私有仓库拉取代码部署的速度应该会比公有仓库更快。

这里参考了这篇博客,更多细节可以从这里了解:

Ubuntu下搭建Git服务器

2.1.安装配置与初始化git信息

sudo apt-get install git-core openssh-server openssh-client
git config --global user.name "zekdot"  
git config --global user.email "zekdot@qq.com"
git clone https://github.com/res0nat0r/gitosis.git
sudo apt-get install python-setuptools
cd gitosis/
sudo python setup.py install

2.2.在主机A上创建git仓库用户

这里假设用户名为为zgit

sudo useradd -m zgit
sudo passwd zgit
sudo vim /etc/group

然后在sudo组后面添加zgit。

2.3.在开发机(个人电脑C)上生成公钥

这里应该主要指的是windows,windows下可以用gitbash来完成公钥的生成,Linux下一般默认公钥在/home/$USER/.ssh下。

ssh-keygen -t rsa

一路回车就行

上传ssh 公钥到服务器

scp ~/.ssh/id_rsa.pub zekdot@A:/tmp

2.4.初始化GItosis

su zgit
cd ~
git config --global user.name "zgit"
git config --global user.email "zgit@nomail.com"
sudo -H -u zgit gitosis-init < /tmp/id_rsa.pub #用git管理员的公钥来对Gitosis进行初始化

执行之后,zgit的家目录下会出现一个repositories文件夹,目录下存在一个gitosis-admin.git库,通过这个库来管理整个git的访问权限,这个库下面有一个gitosis.conf文件和一个keydir目录,前者用于权限配置,后者存放客户端公钥,目前这两个文件里面应该都有个人电脑C的用户信息了。

到这里,仓库就架设完毕了。

2.5.管理项目

这里以添加一个测试项目test为例,该项目包含两个git仓库test1和test2。

首先在个人电脑C中拉取管理仓库

git clone zgit@A:gitosis-admin.git

然后当前目录下会出现gitosis-admin目录,进入该目录,编辑gitosis.conf,井号后面的是注释,不要出现在真正的文件中

[gitosis]

[group gitosis-admin]
members = zekdot@z-terminal
writable = gitosis-admin

[group test]				# 项目名称
members = zekdot@z-terminal	# 该项目的参与者的公钥账户
writable = test1 test2		# 该项目可以编辑的仓库,多个仓库用空格隔开

这里首先说明一下,一个项目可能有多个仓库,比如在微服务下,用户管理是一个仓库,充值业务是一个仓库,每个仓库可以分别用git add、push的方式去提交。

member这个是我们刚才复制过去的公钥,可以查看~/.ssh/id_rsa.pub,可以看到其内容:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXUdsafdsafjewklqjrlwqkjewklqjrklewjrlkjy9DeGDjI/Nsqs4hedsOZK1gQdEyiu4ifZBAOa6o1OTVILkkiLSJxa7bPiWMu5I2z3IzkUzWWikqDJqO/lCkezNy9zzvbjee03xYsjfdsafdsafdsafdsahekwqhjrklewjlqkrjfelwqjfljwphyrKQXktf//R11qWB8TuCrS2d6ghcNHcv5ktFbKM8J5myUW/tbpZo1q0fLSb1 zekdot@z-terminal

最后一段则为账户名,如果要为项目增加新的参与者,只需要在keydir里加入新的公钥,并且在gitosis.conf的member项后增加账户名即可。

最后提交更改。

git commit -am "增加新的项目"
git push origin master

2.6.创建并提交仓库

在任意工作目录下创建仓库1test1

mkdir test1
cd test1
git init
git remote add origin zgit@A:test1.git
echo test1 > test1.txt
git add .
git commit -m "增加一个测试文件"
git push origin master

可以看到成功提交了项目。

可以用同样的方法来提交test2仓库

mkdir test2
cd test2
git init
git remote add origin zgit@A:test2.git
echo test2 > test2.txt
git add .
git commit -m "增加一个测试文件"
git push origin master

之后我们有新的项目的话,只需要照猫画虎的去改gitosis.conf文件并提交就行了。

3.Maven(可选)

为了让maven可用,首先需要保证JAVA环境已经安装好了。

以下操作都是在主节点A上进行的,该部分的操作参考了如下的博客。

Ubuntu18.04 安装Maven 3.5.3

我的项目主要的技术栈还是Java,而且选择使用Maven来构建项目,所以Maven是必不可少的一个环境,如果选择其他技术栈,比如go,那么maven可能不会是一种必需品了。把Maven安装放在Jenkins前面的一个很重要的原因是Jenkins启动时是需要Maven环境的(当然Jenkins也有Maven插件但是我不太习惯这种方式)。

可以去官网找自己对应的版本

Maven官网

当然,通过观察可以知道,只要修改我们下面wget命令后面的参数里面的版本号也可以达到下载对应版本的maven的目的。

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz # 下载
sudo mv apache-maven-3.5.3-bin.tar.gz /usr/local/	# 移动
cd /usr/local
sudo tar -zxvf apache-maven-3.5.3-bin.tar.gz  	# 解压
sudo rm -rf apache-maven-3.5.3-bin.tar.gz 	# 删除压缩包

然后需要配置其到环境变量中

sudo vim /etc/profile

把如下内容添加到末尾

export M2_HOME=/usr/local/apache-maven-3.6.3
export PATH=${M2_HOME}/bin:$PATH

然后使配置生效

source /etc/profile

然后通过如下命令,有版本号输出,则说明安装成功

mvn -version

这样配置之后,速度可能会较慢,而且我们也不知道依赖都会下载到哪里,所以我们需要编辑/usr/local/apache-maven-3.6.3/conf下的settings.xml文件,把如下的内容粘贴进去,注意mirrors不要和原来自带的重复了,否则会报错,即把mirror写在文件原有的mirrors层级里面。

<localRepository>/home/zekdot/repository</localRepository> 
  <mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

这样配置了镜像为阿里云,下载下来的依赖会保存在/home/zekdot/repository下。

4.Jenkins

对于jenkins我这里选择用docker去部署,那么在启动容器时最关心的问题应该是需要去映射哪些文件,首先是一些必备的环境文件,包括上一步安装的Maven以及其仓库。然后我需要把jenkins的一些配置数据保存下来,这些数据位于/var/jenkins_home,此外就是需要一个工作目录,这个工作目录开辟在物理机上,在容器中命名为/deployFactory,最后,需要把一些ssh公私钥对映射到容器的/root/.ssh路径下,便于其在无密码情况下访问其它从节点。

综上,我们用如下的命令来启动jenkins。

docker pull jenkins/jenkins
cd ~
mkdir jenkins-data
mkdir deployFactory
mkdir jenkinsSsh
docker run --name jenkins -p 8080:8080 -p 50000:50000 \
-u root \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-e M2_HOME="/usr/local/apache-maven-3.6.3" \
-v /usr/local/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
-v /var/lib/docker/tmp:/var/lib/docker/tmp \
-v /home/zekdot/repository:/home/zekdot/repository \
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose \
-v /home/$USER/jenkins-data:/var/jenkins_home \
-v /home/$USER/deployFactory:/deployFactory \
-v /home/$USER/jenkinsSsh:/root/.ssh \
-d jenkins/jenkins

然后访问http://A:8080进行配置即可,这里直接安装他推荐的插件。

进入jenkins之后,我们需要增加一个凭证来方便我们之后从我们自己搭建的git里面拉取项目。

进入系统管理-管理凭证-添加凭据

按如下的方式,输入我们刚才创建的私钥,如我们公钥是id_rsa.pub,那么私钥就为id_rsa,把里面的内容都粘贴进去,然后如果有密码的话在Passphrase对应的文本框中加入。

docker seafile 使用已存在的mysql docker swarm 存储_jenkins

到这里,需要的仓库和流水线就都搭建完成了。