zoukankan      html  css  js  c++  java
  • 第四章:安装Docker,安装配置gitlab私有仓库以及jenkins自动化部署(图文)


    一、docker安装

    说明:以下为国内云服务器(阿里云,腾讯云)以及自行安装的CentOS7为环境

    #准备工作,查看内核信息:

    uname -r
    

    #移除yum.pid文件

    rm -f /var/run/yum.pid
    

    #更新yum源

    yum update
    

    #出现[Errno -1] 软件包与预期下载的不符。 建议:运行 yum --enablerepo=updates clean metadata正在尝试其它镜像。使用以下命令

    yum --enablerepo=updates clean metadata
    

    #编辑文件改成Centos7

    cd /etc/yum.repos.d
    vi CentOS-Base.repo
    

    #将文件中$releasever全部改成7

    :%s/$releasever/7/g 
    

    #清除和缓存

    yum clean all && yum makecache 
    

    #卸载旧版本

    sudo yum remove docker \
    				docker-client \
    				docker-client-latest \
    				docker-common \
    				docker-latest \
    				docker-latest-logrotate \
    				docker-logrotate \
    				docker-engine \
    				docker-selinux \
    				docker-ce
    

    #卸载后将保留/var/lib/docker的内容(镜像、容器、存储卷和网络等)。

    rm -rf /var/lib/docker
    

    #下载之前查看网络环境在出口是否封了相应端口

    ping baidu.com
    

    #安装前可查看device-mapper-persistent-data和lvm2是否已经安装,如果安装了可以跳过这个步骤

    rpm -qa|grep device-mapper-persistent-data
    rpm -qa|grep lvm2
    

    #安装依赖软件包

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    

    #安装yum工具包

    sudo yum -y install yum-utils
    

    #设置yum源
    如果服务器在国外可以使用官方的

    sudo yum-config-manager \
    		--add-repo \
    		https://download.docker.com/linux/centos/docker-ce.repo
    

    #如果服务器在国内则使用阿里云的

    sudo yum-config-manager \
    		--add-repo \
    		http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    #更新yum软件包索引

    sudo yum makecache fast
    

    #安装Docker
    安装最新版本docker-ce

    sudo yum install -y docker-ce
    

    #安装指定版本docker-ce可使用以下命令查看

    sudo yum list docker-ce.x86_64  --showduplicates | sort -r
    

    #安装特定版本

    sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
    

    #安装完成之后可以使用命令查看

    docker version
    

    结果:出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    #重启docker

    systemctl start docker
    

    #查看状态

    systemctl status docker
    

    #再次查看版本

    docker version
    

    结果:

    Client: Docker Engine - Community
    Version: 20.10.9
    API version: 1.41
    Go version: go1.16.8
    Git commit: c2ea9bc
    Built: Mon Oct 4 16:08:25 2021
    OS/Arch: linux/amd64
    Context: default
    Experimental: true
    Server: Docker Engine - Community
    Engine:
    Version: 20.10.9
    API version: 1.41 (minimum version 1.12)
    Go version: go1.16.8
    Git commit: 79ea9d3
    Built: Mon Oct 4 16:06:48 2021
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: 1.4.11
    GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8
    runc:
    Version: 1.0.2
    GitCommit: v1.0.2-0-g52b36a2
    docker-init:
    Version: 0.19.0
    GitCommit: de40ad0

    #通知systemd重载此配置文件

    systemctl daemon-reload
    

    #docker开机自启设置

    systemctl enable docker.service   
    

    #出现Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.指定root用户添加到用户组,然后重试开机自启动设置

    usermod -aG docker root
    

    #重载配置,重启docker服务

    systemctl daemon-reload
    systemctl restart docker
    

    说明:以下为AWS服务器的环境,AWS服务器则执行以下命令进行docker安装

    #更新yum源

    sudo yum update -y
    

    #安装docker

    sudo amazon-linux-extras install docker
    

    #启动docker

    sudo service docker start
    

    二、配置docker对外端口

    #安装好docker之后还需要对外暴露接口

     vim /usr/lib/systemd/system/docker.service
    

    找到 ExecStart=/usr/bin/dockerd在后面添加tcp://0.0.0.0:端口

    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:9004 -H fd://
    

    重载配置,重启docker

     systemctl daemon-reload
     systemctl restart docker
    

    #centos开放端口宿主机访问

    firewall-cmd --add-port=9004/tcp --permanent
    firewall-cmd --reload
    

    #查询端口是否开启命令

    firewall-cmd --query-port=9004/tcp
    

    #除此之外还可以开机自启动,将firewalld起起来即可,并且允许其自启动

    systemctl start firewalld 
    systemctl enable firewalld
    

    #如果出现Failed to start firewalld.service: Unit is masked.错误则执行以下命令

    systemctl unmask firewalld
    

    #浏览器访问,查看docker版本信息

     http://xx.xx.xx.xx:9004/version
    

    #如果无法访问,重启服务器查看端口

    telnet localhost 9004
    

    #如果不小心删除了/var/lib/docker导致后面拉取镜像时报错open /var/lib/docker/tmp/GetImageBlob974299692: no such file or directory,不用改什么操作,重启docker即可

    systemctl daemon-reload
    systemctl restart docker
    

    三、安装配置gitlab

    #gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本

    docker pull gitlab/gitlab-ce
    

    #创建gitlab日志,数据,配置的存放路径,通常会在构建容器的时间,会把配置 (etc) 、 日志 (log) 、数据 (data) 放到容器外面,方便后期数据迁移或者修改配置

    sudo mkdir -p /docker/gitlab/config   /docker/gitlab/logs   /docker/gitlab/data
    

    #构建容器

    sudo docker run --detach \
    --hostname  gitlab \
    --publish 8011:443  \
    --publish  8012:8012  \
    --publish  8013:22 \
    --privileged=true  \
    --name gitlab \
    --restart always \
    --volume /docker/gitlab/config:/etc/gitlab \
    --volume /docker/gitlab/logs:/var/log/gitlab \
    --volume /docker/gitlab/data:/var/opt/gitlab \
    --volume  /docker/gitlab/logs/reconfigure:/var/log/gitlab/reconfigure \
    gitlab/gitlab-ce:latest
    

    #添加配置

    sudo vi /docker/gitlab/config/gitlab.rb
    

    #添加下面3行

    #配置http协议所使用的访问地址,不加端口号默认为80
    external_url 'http://xx.xx.xxx.xxx:8012'
    #配置ssh协议所使用的访问地址和端口
    gitlab_rails['gitlab_ssh_host'] = 'xx.xx.xxx.xxx'
    #此端口是run时22端口映射的8013端口
    gitlab_rails['gitlab_shell_ssh_port'] = 8013
    #保存推出
    :wq
    

    #看个人需要,一般而已都会限制内存,也可以在docker启动的时候配置,命令为-m 4G

    docker update --memory 4096m --memory-swap -1 gitlab
    

    #重启gitlab

    docker restart gitlab
    

    #更新授权

    sudo docker exec -it gitlab update-permissions
    

    #进入gitlab容器

    docker exec -it gitlab bash 
    

    #重新载入配置文件,并开启

    gitlab-ctl reconfigure
    gitlab-ctl start
    

    #查看密码

    gitlab-rails console production
    

    #进入gitlab控制台

    gitlab-rails console -e production
    

    #获得用户数据,修改用户密码

    user = User.where(id: 1).first
    user.password='2YkDixw6xJiD/68kCsAZBu9W9ZhGdRlT0YykDYiOvOAE=1'
    user.password_confirmation='2YkDixw6xJiD/68kCsAZBu9W9ZhGdRlT0YykDYiOvOAE=1'
    user.save!
    quit
    

    #重启gitlab需要等待一段时间才能访问,否则会出现502,如果出现502,还有可能是内存不够的原因,建议查看docker容器的gitlab日志

    docker restart gitlab
    

    四、安装配置jekins

    一、准备工作


    #上传jdk到自定义目录,这里提供jdk1.8的linux版本,从官网拉下来的

    链接:https://pan.baidu.com/s/1nAVgmke9RbF8MnXo33S72Q
    提取码:mvsq

    #查看版本

    java -version
    

    #上传maven到自定义目录,这里提供maven3.8.3的linux版本,从官网拉下来的
    链接:https://pan.baidu.com/s/1rC4NsMX5i0669_ONJV3MJA
    提取码:ek1p

    #查看版本

    mvn -v
    

    #关于git其实可以使用默认的git,进入到容器中通过以下命令进行查看git版本

    git --version
    

    #当前也可以自行安装git,在docker容器启动的时候配置映射路径,并且在/etc/profile的path路径中添加git安装路径即可,可通过以下命令查看git安装路径

    which git
    

    #需要注意的是docker容器每次重新启动,会将容器内部生成的ssh key移除掉,所以我们可以通过映射路径或者复制宿主机的ssh key到容器内部,也可以重新生成然后去到gitlab的ssh key配置。下面的邮箱为你github、gitee或者gitlab登录的邮箱,执行命令之后,连续三次回车即可生成,生成git的ssh key命令:

    ssh-keygen -t rsa -C "java_wxid@aliyun.com"
    

    查询生成的ssh key的路径:

    cd ~/.ssh
    

    #外部配置的jdk和maven需要映射到jenkins容器,所以相关的配置也需要映射进去,所以需要提前在宿主机配置

    vim /etc/profile
    

    #在最后一行添加java环境变量和maven环境变量

    #java环境配置
    export JAVA_HOME=/opt/java/jdk
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=./:JAVA_HOME/lib:$JRE_HOME/lib
    #maven环境配置
    export M2_HOME=/opt/java/maven
    #git环境配置
    export GIT_HOME=/opt/java/git
    #path
    export PATH=/bin:/usr/bin:/sbin:/usr/sbin:$JAVA_HOME/bin:$M2_HOME/bin:$GIT_HOME/bin:$PATH
    

    #立即重载配置

    source /etc/profile
    

    #查看版本信息

    mvn -v
    

    二、下载安装配置Jenkins

    #下载Jenkins的Docker镜像

    docker pull jenkins/jenkins:lts
    

    #创建jenkins工作目录的存放路径

    sudo mkdir -p /docker/jenkins/data
    

    #在Docker容器中运行Jenkins

    docker run -p 8014:8080 -p 8015:5000 --name jenkins -m 2G \
    -u root \
    --restart always \
    -v /docker/jenkins/data:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime  \
    -v /usr/local/src/apache-maven-3.8.3:/opt/java/maven \
    -v /usr/local/src/jdk1.8.0_301:/opt/java/jdk \
    -v /etc/profile:/etc/profile \
    -v /root/.ssh/id_rsa:/root/.ssh/id_rsa \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /bin/docker:/usr/bin/docker \
    -d jenkins/jenkins:lts
    

    #暂停jenkins

    docker stop jenkins
    

    #看个人需要,一般而已都会限制内存,可以在docker启动命令中配置,配置命令为-m 2G

    docker update --memory 2048m --memory-swap -1 jenkins
    

    #开启jenkins

    docker start jenkins
    

    #进入jenkins容器

    docker exec -u 0 -it jenkins /bin/bash
    

    #立即重载配置

    source /etc/profile
    

    #查看root密码

    cat /var/jenkins_home/secrets/initialAdminPassword
    

    #如果提示cat: /var/jenkins_home/secrets/initialAdminPassword: No such file or directory通过查找文件的方式查看密码

    find / -name config.xml
    

    一般会出现:
    /var/jenkins_home/users/root_9685925808796613467/config.xml
    /var/jenkins_home/config.xml
    选择用户名相关的文件:

    cat /var/jenkins_home/users/root_9685925808796613467/config.xml
    

    找到passwordHash标签:
    #jbcrypt:$2a 10 10 10yB8omAzzWpk1oNToWQPIWewpqBKbhJGUU5UDd470yJCN3HVXqCDc6
    密码就在#jbcrypt:后面,即

    $2a$10$yB8omAzzWpk1oNToWQPIWewpqBKbhJGUU5UDd470yJCN3HVXqCDc6
    

    我们可以改成:

    $2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS
    

    即密码:111111
    或者

    #jbcrypt:$2a$10$MiIVR0rr/UhQBqT.bBq0QehTiQVqgNpUGyWW2nJObaVAM/2xSQdSq
    

    即密码:123456
    使用root用户登录即可

    上面那串如何生成的呢?

    Jenkins采用Java加密工具jBCrypt,所以我们在生成密码的时候需要添加相关的jar包。

    <dependency>
        <groupId>org.mindrot</groupId>
        <artifactId>jbcrypt</artifactId>
        <version>0.4</version>
    </dependency>
    
        // 加密
        String admin = BCrypt.hashpw("admin", BCrypt.gensalt());
        System.out.println("加密:"+admin);
    
        // 解密
        if(BCrypt.checkpw("admin",admin)){
            System.out.println("is match");
        } else {
            System.out.println("is not match");
        }
    

    #如果启动容器的时候未设置开机自启动,也可以通过以下命令配置docker的容器开机自启动:docker update --restart=always 镜像ID

    docker update --restart=always e39a959d7bff
    

    #重启jenkins

    docker restart jenkins
    

    #如果出现jenkins实例已离线的情况,访问以下链接

    http://ip:port/pluginManager/advanced
    

    在Update Site下面替换以下链接

    http://updates.jenkins.io/current/update-center.json
    

    五、jenkins主要的一些配置

    在这里插入图片描述#系统配置中配置jdk,maven路径
    在这里插入图片描述#全局工具配置,配置jdk,maven,git路径和上面的路径要保持一致
    在这里插入图片描述在这里插入图片描述在这里插入图片描述#凭据配置,有些页面无法出来页面,可以通过http://ip:port/credentials/进行访问
    在这里插入图片描述在这里插入图片描述在这里插入图片描述#插件看个人需要
    在这里插入图片描述#配置时间,脚本命令行中执行
    在这里插入图片描述
    点击进入脚本命令行将以下命令运行即可。

    system.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
    

    六、项目配置

    #创建项目
    在这里插入图片描述

    在这里插入图片描述#配置项目
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    #编写shell脚本

    #!/bin/bash
    
    # 制定打包模块
    arr=(community-starters/community-xxx-starter:8081)
    #加前缀
    suffix="-"${BUILD_ENV}
    #自定义网络
    ip_param=''
    
    echo "当前环境"${BUILD_ENV}
    #如果执行dev环境,走以下流程
    if [ ${BUILD_ENV} == "dev" ];then
    # 如果是在本机上安装就使用内网ip,这样速度会快很多,内网ip查询:ifconfig -a
        echo 'export DOCKER_HOST="tcp://xxx.17.0.1:8010"'
        export DOCKER_HOST="tcp://xxx.17.0.1:8010"
        #通过命令docker network create --driver bridge --subnet=xxx.30.0.0/16 common-network创建自定义网段,docker network inspect common-network进行查看,配置的时候,不要以0结尾,如以下配置即可:
        ip_param='--ip xxx.30.0.2'
    fi
    
    # for 遍历
    for mp in ${arr[*]}
    do
    	#截取字符串获得module名称和端口
    	path=${mp%:*}
    	module=${path#*/}
    	#arr中配置了端口:8081    
    	port=${mp#*:}
    	#arr中配置了,container_name=community-starters/community-xxx-starter-dev
    	container_name=$module$suffix
    	#arr中配置了,image_name=community-starters/community-xxx-starter-dev
    	image_name=$module$suffix
        
        echo "开始构建: "$container_name":"$port
        CID=$(docker ps -a | grep "$container_name")
        if [ "$CID" != "" ];then
                echo "删除现有容器"
                docker stop $container_name
                docker rm $container_name
        fi
        
        echo "移除镜像" : $image_name
        docker rmi $image_name
        cd $module
        echo "当前路径" :$(pwd)   
        echo "构建容器": $container_name
        docker build -t $container_name .
        echo "启动容器" : $container_name
        docker run --name $container_name --restart=always -d -p 8081:8081 -p 8082:8082-p 8083:8083 -e TZ=Asia/Bangkok -v /root/fragant/logs:/root/logs:z -v /etc/localtime:/etc/localtime:z -e SPRING_PROFILES_ACTIVE=qa -m 2G $image_name
        echo "连接容器网络" : $ip_param $container_name
        docker network connect $ip_param common-network $container_name
        echo "执行完成"
        
    done
    

    内网ip查询
    在这里插入图片描述#项目结构
    在这里插入图片描述#编写Dockerfile

    FROM openjdk:8-alpine
    MAINTAINER community-xx-starter
    
    ADD target/community-xx-starter.jar /community-xx-starter.jar
    
    EXPOSE 8081
    
    ENTRYPOINT ["sh","-c","java -jar -Dspring.profiles.active=qa /community-xx-starter.jar"]
    

    进到服务器检出项目的目录,这个时候项目检出并没有打包成jar包,需要手动打包,命令如下:

    mvn clean install
    

    如果不成功的话可以尝试使用绝对路径进行调整,例如:

    /opt/java/maven/bin/mvn clean install
    

    打包jar包成功之后可以进行自动化部署了
    在这里插入图片描述
    说明:在弄CI流程的时候可能会出现各种问题,比如脚本执行卡住,这个时候可以将脚本中的命令一条条拿到服务器上面执行,排除命令的错误性。比如误删了某个文件,可以进行手动恢复,可参考:Linux系统:第十三章:centos误删文件如何恢复文件数据。比如项目部署成功无法访问,排查项目是否成功运行,对日志进行排查排除项目启动错误导致的无法访问,对网络进行排查排查安全出口和入口等问题。如果觉得jenkins配置太过麻烦,可参考gitlab的CI:Linux系统:第十五章:gitlab集成CI

    博主的心理话:这里还是要吐槽一下,这几天一直在弄二套CI流程(gitlab的ci和jenkins),踩坑无数,目前网络上面太多相同的文章了,搜索出来一页至少超过一半的文章,文章内容一模一样,剩下的就是排版乱的很,看都看不下去的那种,导致找到的解决方法的时间大大延长,希望未来这种环境能够有所改善。

    七、jekins迁移到另一台服务器上

    #首先本服务器上面的jenkins运行正常,另一台服务器的jenkins也运行正常,需要知道二台服务器上面的安装目录

    #找到jenkins_home目录

    find / -name jenkins_home
    

    #解压

    sudo tar czvf jenkins.tar.gz *
    

    #复制压缩包到新服务器上面去,-i "qt_dev_cert.pem"表示访问目标服务器需要携带私钥,qt_dev_cert.pem表示当前目录下的私钥文件,root@xx.xx.xx.xx 表示root用户,xx.xx.xx.xx表示目标服务器的ip,/var/jenkins_home表示复制到那个目录下面。如果是密码登录则换成-p 密码即可。

    scp -p "password" jenkins.tar.gz  root@xx.xx.xx.xx:/var/jenkins_home
    ------------------------------------------------------------------------------------
    scp -i "qt_dev_cert.pem" jenkins.tar.gz  root@xx.xx.xx.xx:/var/jenkins_home
    

    #去另一台新服务器解压

    tar zxf jenkins.tar.gz
    

    #将解压的文件复制到新服务器的jenkins_home目录里面即可

    cp /var/jenkins_home /home/jenkins_home
    

    总结

    以上就是今天要讲的内容,本文介绍了安装Docker,下载安装配置gitlab以及jenkins,图文讲解CI流程。

  • 相关阅读:
    JAVA写入文本文件
    oracle误删数据闪回
    Myeclipese :Creation of element failed解决方法
    Hibernate的四种状态
    java中list、set和map 的区别<转>
    C#操作mysql中临时表不自动删除
    WPF 实现地图的移动和滚动放大
    c# 将十六进制字符串写入注册表
    ASP.NET 视图状态概述:初步了解
    vs好用插件
  • 原文地址:https://www.cnblogs.com/javawxid/p/15644371.html
Copyright © 2011-2022 走看看