03-CentOS7下docker安装Jenkins准备工作

1 安装jdk和maven,并配置环境变量 vi /etc/profile

M2_HOME=/usr/local/maven3
JAVA_HOME=/usr/local/jdk1.8
JRE_HOME=/usr/local/jdk1.8/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/usr/local/git/bin:$M2_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH M2_HOME PATH

2 安装git

2.1 git本地安装

# 下载git2.17.0到本地文件
#安装依赖
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
#删除yum安装git
yum remove git
#入解压后的文件夹,命令 cd git-2.17.0 ,然后执行编译,命令为 
make prefix=/usr/local/git all
#安装Git至/usr/local/git路径
make prefix=/usr/local/git install
#打开环境变量配置文件,命令 vim /etc/profile ,在底部加上Git相关配置信息
PATH=/usr/local/git/bin:$PATH
#查看安装的git版本
git --version
  • git常用命令
git config --global user.name "admin"
git config --global user.email "[email protected]"

2.2 在线安装

# 先将原本的git卸载了
[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch
linux-firmware-20200421-80.git78c0348.el7_9.noarch
[root@node1 ~]# yum remove -y crontabs-1.11-6.20121102git.el7.noarch linux-firmware-20200421-80.git78c0348.el7_9.noarch

[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64

# 安装git
[root@node1 ~]# yum -y install git

[root@node1 ~]# rpm -qa|grep git
net-tools-2.0-0.25.20131004git.el7.x86_64
git-1.8.3.1-23.el7_8.x86_64

# 创建Jenkins的映射目录
[root@node1 ~]# mkdir -p /usr/local/jenkins/workspace

# 创建Jenkins容器并运行
docker run -uroot -d --restart=always -p 9001:8080 \
-v /usr/local/jenkins/:/var/jenkins_home/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/git:/usr/bin/git \
-v /usr/local/jdk1.8/:/usr/local/jdk1.8/ \
-v /usr/local/maven3/:/usr/local/maven3/ --name jenkins jenkins/jenkins:2.356
bf5659973f89a77dd6b3cefa6c250679437cc3f153a60d3042cf62ded0f7e2c5
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS                       PORTS                                                                                                                   NAMES
bf5659973f89   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   About a minute ago   Up About a minute            50000/tcp, 0.0.0.0:9001->8080/tcp, :::9001->8080/tcp                                                                    jenkins
a8eac9ac773b   gitlab/gitlab-ce      "/assets/wrapper"        About an hour ago    Up About an hour (healthy)   0.0.0.0:7003->22/tcp, :::7003->22/tcp, 0.0.0.0:7002->80/tcp, :::7002->80/tcp, 0.0.0.0:7001->443/tcp, :::7001->443/tcp   gitlab

# 配置libpcre.so.3的软连接并生成Jenkins的秘钥和公钥
[root@node1 ~]# docker exec -it -uroot jenkins /bin/bash
root@bf5659973f89:/# git
git: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
root@bf5659973f89:/# ldd $(which /usr/bin/git)
        linux-vdso.so.1 (0x00007ffd5c0b1000)
        libpcre.so.1 => not found
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f62ce68b000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f62ce669000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f62ce4a4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f62ce6ad000)
root@bf5659973f89:/# cd /lib/x86_64-linux-gnu/
root@bf5659973f89:/lib/x86_64-linux-gnu# ln -s libpcre.so.3 libpcre.so.1
root@bf5659973f89:/lib/x86_64-linux-gnu# ssh-keygen -t rsa -C "root"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:sNKM/ch97SBbKP8L/eCK3ip07qPQIVQWZ21Y737knAk root
The key's randomart image is:
+---[RSA 3072]----+
|    +.o+.        |
|   o o. o.       |
|  .   ..  .      |
| .   = o .       |
|  . + = S E .    |
|   o.+.+ + * o   |
|  ...o+ * B B    |
|   .. o= B *     |
|    .==o=o+.o    |
+----[SHA256]-----+
root@bf5659973f89:/lib/x86_64-linux-gnu# cd
root@bf5659973f89:~# cd /root/.ssh/
root@bf5659973f89:~/.ssh# ls
id_rsa  id_rsa.pub  known_hosts
root@bf5659973f89:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCOXBcIb6piqYG5o41eQkPwhsxr6Zu7/uZhopfKfleAL4/h9FdXNumLeVGzPUf6Zpub+Ei7AcMjX6jZvGuaWNwlHzFRIEOYk3HvDWkYxcsjA/j/NMANveEKPcK6j9W8PR5idJTN8AC1U6nDy2YYoioLsCMmJT/qydNdLe9nB+5k0i59J2l/eCXTVv3j2qpP1L9AvEFamlpHYEYhOtqeBlnANPl4sgcSmaBLpOh9XJcolZ64BVSAo6w36gvRMc48/dFUcbO3rY5K+aCbDhB6m2BkukmpHBkIpf5u/xKyuqrN6EryxHqVUpL3WBvvGfCnCRphfpm4LXwXzgAJuAIoTSi5SRU22y/oJ8rcbpXiYhqlUHIPdSV/xDei0q9+1fRABLNEadPVCetC2+UxRsQnFAXGxkcomj4BVht7jI6MNM+02h/nx1FkqxKYVVT7w8avMXky+A020FVNjhKMu9JQthZz21uguDIP4btHj0dr8arV6cHh07ItEh0EEnK23FMpE= root

3 docker安装nexus

Nexus([ˈneksəs]) 是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用 Nexus 你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个 Artifact

  • 创建映射目录
mkdir -p -m 777 /home/nexus
  • docker安装
docker run -d --name nexus --restart always  --net=host --privileged -v /home/nexus:/nexus-data sonatype/nexus3

默认端口为8081

  • admin账号,初始化密码文件
cat /home/nexus/admin.password
  • 增加aliyun代理仓库,创建一个仓库
    阿里云代理,从maven-public拉取依赖就可以走阿里云先拉提高速度


    1664519493024.jpg

    点击“create repsitory”按钮,弹出窗口


    image.png
  • 创建aliyun仓库信息


    image.png
  • 修改maven-public的一个顺序位置


    image.png

    image.png

    image.png
  • maven-release默认是不可以多次deploy的,为了方便,这里也可以修改配置为Allow redeploy


    image.png

    image.png
  • 修改maven的配置文件settings.xml

    
      
      alimaven
      admin
      12345678
    
  
  
  
    
      alimaven
      aliyun maven
      http://maven.aliyun.com/nexus/content/groups/public/
      central
    
  
  • 修改springcloud项目的pom.xml文件
# 添加拉取仓库地址、插件地址和上传仓库地址

    
        
            alimaven
            http://192.168.101.138:8081/repository/maven-public/
            
                true
                always
            
            
                always
                true
            
        
    
    
    
        
            alimaven
            http://192.168.101.138:8081/repository/maven-public/
            
                always
                true
            
            
                always
                true
            
        
    
    
    
        
            alimaven
            http://192.168.101.138:8081/repository/maven-releases/
        
        
            alimaven
            http://192.168.101.138:8081/repository/maven-snapshots/
        
    

4 创建方式maven jar仓库

创建一个maven-repo仓库,类型为Mixed,Allow redeploy


image.png

image.png

5 docker镜像私服仓库

5.1 新建docker-central仓库阿里云代理
image.png

image.png

image.png
5.2 新建docker-repo仓库,用于上传镜像
image.png

image.png

image.png

这样就可以使用192.168.101.138:8082来进行镜像的上传或者拉取

5.3 新建docker-public组,用于拉取镜像
image.png

image.png

image.png

image.png

image.png
5.4 设置docker的deamon.json文件
  • 打开docker配置文件
vi /etc/docker/daemon.json
  • 添加内容
"insecure-registries":["192.168.101.138:8082","192.168.101.138:8083"]
  • 重启docker
systemctl restart docker
  • 测试8082和8083端口是否能够连通


    image.png

    docker登录之后,就可以进行相应的私服的拉取和上传操作了

6 docker安装sonarqube8.9

6.1 docker安装postgis12

sonarqube:8.9.8-community版本postgreSQL数据的版本为:9–12。最高支持13版本。

docker pull postgres:12.4-alpine
# 安装postgresql数据库
docker run --name postgresql -e POSTGRES_USER=root --restart always -e POSTGRES_PASSWORD=12345678 -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -d postgres:12.4-alpine
# 在root用户下创建sonar库
5.5 Nexus手动添加jar
  • 选中maven-releases


    image.png
  • 点击“upload component”按钮准备上传本地jar


    image.png
  • 填写必填项,完成上传


    image.png
6.2 docker安装sonarqube8.9.8
  • 拉取sonarqube8.9.8镜像
docker pull sonarqube:8.9.8-community 
  • 创建sonarqube容器
docker run -d --name sonarqube \
    --restart always \
    -p 9000:9000 \
    -v /data/sonarqube/data:/opt/sonarqube/data \
    -v /data/sonarqube/extensions:/opt/sonarqube/extensions \
    -v /data/sonarqube/bundled-plugins:/opt/sonarqube/lib/bundled-plugins \
    -e SONARQUBE_JDBC_URL=jdbc:postgresql://192.168.232.129:5432/sonar \
    -e SONARQUBE_JDBC_USERNAME=root \
    -e SONARQUBE_JDBC_PASSWORD=12345678 \
sonarqube:8.9.8-community
  • 浏览器访问sonarqube
访问地址:http://localhost:9000/
默认账号:admin:admin

7 docker安装registry

registry能有效保护内部代码, 防止放到公网泄漏出去;

  • 拉取 registry 镜像
docker pull registry:2
  • 创建registry容器
docker run -d \
--restart=always -p 5000:5000 \
--name registry -v /usr/local/docker/data/registry:/var/lib/registry registry:2
  • 修改 daemon.json 文件
# 编辑文件 /etc/docker/daemon.json
# insecure-registries 表示私服的路径
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries":["192.168.1.235:5000"]
}
  • 重新加载 daemon 文件&重启 docker
systemctl daemon-reload
systemctl restart docker
  • 浏览器验证是否成功
http://192.168.101.145:5000/v2/
http://192.168.101.145:5000/v2/_catalog

8 docker安装gitlab

  • 获取 gitlab 镜像包
docker pull gitlab/gitlab-ce
  • 准备 gitlab 工作目录
# 创建 config 目录
mkdir -p /usr/local/gitlab/config 
# 创建 logs 目录
mkdir -p /usr/local/gitlab/logs 
# 创建 data 目录
mkdir -p /usr/local/gitlab/data 
  • 启动 GitLab
docker run --detach \
--privileged=true \
--hostname 192.168.101.145 \
--publish 7001:443 --publish 7002:80 --publish 7003:22 \
--name gitlab --restart always \
--volume /usr/local/gitlab/config:/etc/gitlab \
--volume /usr/local/gitlab/logs:/var/log/gitlab \
--volume /usr/local/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
参数名称 参数说明
detach 指定容器运行于前台还是后台
hostname 指定主机地址, 如果有域名可以指向域名
publish 指定容器暴露的端口,左边的端口代表宿主机的端口, 右边的是代表容器的端口
name 给容器起一个名字,
restart always 重启, 只要 docker 自动重启, 容器就会自动重启.减少人工重启工作。
volume 数据卷, 在 docker 中是最重要的一个知识点.
--privileged=true 解 决 Docker 挂 载主 机目 录 Docker 访 问出 现 cannot open directory .:Permission denied
  • 修改 gitlab.rb 配置文件

external_url 和 gitlab_rails 这两个 ip 参数, 建议固定操作系统的静态不变的 IP 或说是域名进行配置, 假设 IP 变得的话在 GitLab 新建项目的时候, 生成的 IP 还是原来的 IP, 此时就无法推送代码在 Gitlab里面。

宿主机路径: /usr/local/gitlab/config/gitlab.rb

external_url 'http://192.168.101.145'
gitlab_rails['gitlab_ssh_host'] = '192.168.101.145'
gitlab_rails['gitlab_shell_ssh_port'] = 7003
  • 去 gitlab 容器重启服务

由于运行是使用数据卷参数进行运行的, 宿主机的 gitlab.rb 文件修改了, gitlab 容器里面的文件会跟着改, 但是容器的文件不会跟着生效, 必须要进去容器里面进行命令执行

# 进去 gitlab 容器的命令
docker exec -it gitlab /bin/bash 
# 重置 gitlab 客户端的命令,执行命令后,按ctrl+p,ctrl+q退出
gitlab-ctl reconfigure 
  • 在容器中修改gitlab密码
# 出现这个界面说明安装成功,接下来需要进到容器里重置密码
[root@node1 ~]# docker exec -it gitlab /bin/bash
root@192:/# gitlab-rails console -e production
--------------------------------------------------------------------------------
 Ruby:         ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
 GitLab:       14.4.1 (1a23d731c9f) FOSS
 GitLab Shell: 13.21.1
 PostgreSQL:   12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.1)
irb(main):001:0> user = User.where(id: 1).first
=> #
irb(main):002:0> user.password = '12345678'
=> "12345678"
irb(main):003:0> user.password_confirmation = '12345678'
=> "12345678"
irb(main):004:0> user.save!
Enqueued ActionMailer::MailDeliveryJob (Job ID: 5f22b4b1-1534-482a-88c1-40b8a947cf2d) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", {:args=>[#>]}
=> true
# 重置密码成功,密码为:12345678,接下来重新访问网址,用户:root;密码:12345678
  • 重启 gitlab 容器命令
docker restart gitlab
  • 浏览器输入地址
http://192.168.101.145:7002
  • 修改初始化密码
# 用户名 root
cat /usr/local/gitlab/config/initial_root_password

9 docker安装Jenkins

  • 拉取jenkins镜像
docker pull jenkins/jenkins:2.356
  • 创建jenkins容器
  1. docker 脚本安装, 指定 Jenkins 默认路径/root/.jenkins/workspace 拉取代码的路径同步到
    宿主机路径/usr/local/jenkins/workspace.
  2. 由于 jdk 和 maven,git 都在宿主机, 所以要 v(数据卷参数) 指定 jenkins 容器的路径把
    宿主机的软件同步到容器
docker run -uroot -d --restart=always -p 9001:8080 \
-v /usr/local/jenkins/:/var/jenkins_home/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/git:/usr/bin/git \
-v /usr/local/jdk1.8/:/usr/local/jdk1.8/ \
-v /usr/local/maven3/:/usr/local/maven3/ --name jenkins jenkins/jenkins:2.356
命令 描述
-d 后台运行容器,并返回容器ID
-p 9001:8080 将容器内8080端口映射至宿主机9095端口,这个是访问jenkins的端口
--name jenkins 设置容器名称为jenkins
  • 浏览器输入网址 http://192.168.101.145:9001
  • 设置密码
# 进入 Jenkins 容器
docker exec -it jenkins /bin/bash
# 查看密码
cat  /usr/local/jenkins/secrets/initialAdminPassword
  • 设置国内源
升级站点网址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
# 修改配置文件,/var/jenkins_home/updates目录
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  • 重启jenkins服务
浏览器中输入: http://192.168.101.145:9001/restart
  • docker启动出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?错误
# 检查/etc/docker/daemon.json 配置文件内容是否正确
# 视图重启服务
systemctl daemon-reload
# 重启docker服务
systemctl restart docker.service
  • 安装如下插件
SSH 用于 SSH 连接服务器
Publish Over SSH 用于 SSH 发布
Maven Integration 用于maven集成
git
pipeline

10 开发环境与gitlab实现免密登录

  • 在开发环境的git bash中输入命令
# 使用ssh-keygen -t rsa -C "root" 生成Windows本机秘钥和公钥
  • 复制C:\Users\Administrator.ssh路径下公钥文件
id_rsa.pub
  • 打开gitlab添加ssh


    image.png
  • 配置libpcre.so.3的软连接并生成Jenkins的秘钥和公钥
docker exec -it -uroot jenkins /bin/bash
# 容器内生成ssh key
ssh-keygen -t rsa -C "root"
cd /root/.ssh/
# 目录下文件如下
id_rsa  id_rsa.pub
  • 到这里就将这个SSH公钥添加到gitlab上,之后做项目拉取


    image.png

11 配置jenkins全局凭证

使用pipeline结合gitlab拉取代码时,需要在jenkins上配置gitlab的用户名密码,为全局ID,以便使用

  • 选择“Manage Credentials”项


    image.png
  • 在“全局”按钮处,点击并选中“添加凭证”按钮


    image.png
  • 输入用户名和密码


    image.png
  • 在“系统配置”中设置SSH远程主机


    image.png
  • 配置SSH远程主机信息


    image.png
  • 配置GitLab所在主机信息


    image.png

12 全局工具配置

  • 配置maven


    image.png
  • 配置jdk


    image.png
  • 配置git


    image.png
  • 本地maven配置


    image.png

13 添加dockerfile文件

  • 当前项目下创建docker目录,在docker目录下创建Dockerfile文件


    image.png
  • 项目打包


    image.png
  • 编写Dockerfile文件
FROM java
WORKDIR /home
ADD /apptest1.jar //
ENTRYPOINT ["java","-jar","/apptest1.jar"]
CMD ["java","-version"]
  • 提交项目到gitlab
    出现错误:Push main to origin/main was rejected by remote
    默认 master 分支是处于被保护状态下的,develop 角色是没有权限提交到 master 分支的。这是全局配置的分支保护


    image.png

14 项目在Jenkins自动化部署

  • 新建项目


    image.png
  • 创建maven构建项目


    image.png
  • 配置git源码管理


    image.png
  • post steps


    image.png

    image.png
#/bin/bash
echo "进入项目..."
cd /usr/local/jenkins/workspace/hellospringboot
echo "停止已有容器..."
docker stop apptest1
echo "删除已有容器..."
docker rm apptest1
echo "删除已有镜像..."
docker rmi ping/apptest1
echo "制作镜像..."
docker build -f Dockerfile -t ping/apptest1 .
echo "启动容器..."
docker run -p 8001:8001 --name apptest1 -d ping/apptest1
echo "自动部署完成..."

你可能感兴趣的:(03-CentOS7下docker安装Jenkins准备工作)