【Docker1】指令,docker-compose,Dockerfile,jenkins

文章目录

  • 1.pull/image,run/ps(进程),exec/commit
  • 2.save/load:docker save + 镜像id,不是容器id
  • 3.docker-compose:多容器:宿主机(eth0网卡)安装docker会生成一张docker网卡,docker网卡通过nat方式为每个容器分配ip
    • 3.1 link:先docker rm -f删除nginx和alpine两个容器,在alpine中ping myng(相当于域名)的话自动解析为myng的ip
    • 3.2 docker-compose .yml:不用link,location匹配
  • 4.Dockerfile:镜像像程序,容器像进程
  • 5.GitLab与Jenkins集成:Jenkins镜像和上面nginx一样,code push到git上,git通过hook触发构建/测试/部署就是CI(持续集成)CD(持续交付)工具即jenkins(需提供一台运行jenkins的机器)
    • 5.1 Jenkins-docker配置:运行在8080端口上,机器只要安装docker就能装载image并运行容器
    • 5.2 Jenkins与GitLab配置:docker ps查看正在运行,浏览器访问http://10....:8080/
      • GitLab与Jenkins的Access Token配置:不涉及具体项目
      • 新建jenkins job和配置job:jenkins的Dashboard仪表盘界面点击New Item(要登陆),可新建job或者复制已有job,直接复制已有job,拷贝后的job不要运行build,避免回填错误数据到GitLab
      • Jenkins pipeline script配置
      • Jenkins&GitLab集成环境验证


1.pull/image,run/ps(进程),exec/commit

docker和vmware虚拟机一样由三部分构成:镜像(image)是像ubuntu镜像文件(iso,img文件),容器(ps)是一个正在运行的虚拟机,仓库是存放镜像文件场所(dockerhub)。tar文件类似于vm使用时的vmdk文件,可将一个镜像直接保存成一个tar文件,别人load重新加载成一个镜像,run起来成了一个虚拟机。Dockfile是一个很短的配置文件,通过写"如何构建"的步骤来指定一个镜像如何构建的,通过docker build指令可将Dockfile构建成一个镜像。仓库保存了一些公有镜像如ubuntu镜像,nginx镜像,mysql镜像,tomcat镜像等。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第1张图片
ubuntu安装命令:sudo apt install docker.io,网站:play with docker。
docker run -d -p 80:80 nginx上面才会出现80端口,点击80端口跳转到nginx网页首页。
docker run -d -p 81:80 nginx指定外部81端口同理点击81跳转到nginx网页首页(nginx的默认端口是80)。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第2张图片
在这里插入图片描述
如下再次点击外部80端口。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第3张图片
如下暂时用不到81,容器里内容修改后要commit成新镜像m1,和pull下来的nginx镜像并列。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第4张图片
当前目录自己新增index.html(里面写着wai bu de wen jian)和Dockerfile两文件,将原来nginx里面index.html替换了,如下vi Dockerfile。
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第5张图片
点击外部100号端口如下:上面为dockerfile build成一镜像run成为一容器。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第6张图片

2.save/load:docker save + 镜像id,不是容器id

docker rm m2将m2镜像直接删除,提示有个容器基于这镜像无法删除,那将容器(container id)也删了。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第7张图片
删了容器还要删除镜像m2,docker load使m2镜像又从tar文件重新拿过来了。文件映射-v就是将一些静态文件放外面,在外面修改文件(因为是映射的)里面文件也会跟着变化。这个文件映射还会用于其他的一些数据保存,比如mysql的data目录也可以映射到外面,防止数据丢失。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第8张图片

3.docker-compose:多容器:宿主机(eth0网卡)安装docker会生成一张docker网卡,docker网卡通过nat方式为每个容器分配ip

容器间同一网段可通过ip通信,容器(3个)和宿主机(eth0)通信是通docker0网卡转发路由过来是ip和端口进行通信。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第9张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第10张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第11张图片
如下curl…回车后打印出下面< html >…。以下就能获取nginx容器数据了,但这种方式需要登录一台机器查看ip,再登录另一台机器去配置这个ip,在实际生产中是不可行的。
在这里插入图片描述

3.1 link:先docker rm -f删除nginx和alpine两个容器,在alpine中ping myng(相当于域名)的话自动解析为myng的ip

【Docker1】指令,docker-compose,Dockerfile,jenkins_第12张图片
如下curl myng直接得到nginx的首页内容,浏览器将内容解析为界面。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第13张图片
在这里插入图片描述

3.2 docker-compose .yml:不用link,location匹配

nginx需要到php中去解析,php需要到mysql中访问数据库,两个需要写link,且必须先创建mysql,再部署到其他机器重新输入整个指令麻烦。将这些指令记录到一个配置文件里统一配置,这就是docker-compose(需安装)。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第14张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第15张图片
网页会显示如下index.html文本字样。
在这里插入图片描述
创建test.php用来监测php是否运行成功。
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第16张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第17张图片
如下/root/html下存的是php文件转发到/var/www/html目录下找php文件。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第18张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第19张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第20张图片

4.Dockerfile:镜像像程序,容器像进程

FROM:指定当前镜像基于哪个镜像,必填,一行就可以构建一个镜像。
WORKDIR:指定接下来shell语句运行在哪个路径下,如下alpine镜像下肯定没有/app这个目录,自动创建。
COPY:将当前宿主机文件拷贝到镜像中去。
RUN:构建容器时运行这脚本,当前工作目录就是/app,所以如下321写入/app/1.txt
CMD:指定整个容器启动起来运行脚本,运行完后整个容器生命周期结束(tail -f 阻塞式)。

如下必须命名为Dockerfile,1.txt里面原本内容有123。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第21张图片
如下指定镜像名test,最后的点表示dockfile文件位于当前目录下。
在这里插入图片描述
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第22张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第23张图片

5.GitLab与Jenkins集成:Jenkins镜像和上面nginx一样,code push到git上,git通过hook触发构建/测试/部署就是CI(持续集成)CD(持续交付)工具即jenkins(需提供一台运行jenkins的机器)

官网https://www.jenkins.io/下载jenkins,可选择适合你自己系统的版本,也可选择不依赖于系统的docker(前提本机安装了docker)或war包(本机安装了java),如下开启服务端
在这里插入图片描述
执行如上命令出现密码,复制这串密码,浏览器打开http://localhost:8080(客户端),粘贴到管理员密码里。点击安装推荐插件,创建管理员用户y,密码123,到这里jenkins已经安装完成了(装在win上),主要用来配合git服务器。
在这里插入图片描述

5.1 Jenkins-docker配置:运行在8080端口上,机器只要安装docker就能装载image并运行容器

在指定服务器上安装docker,使用docker命令进行下载jenkins-docker版本如下:

docker pull jenkins/jenkins:2.54  (docker images查看, 不指定版本就是最新的版本)

-name指定image名字。-p内部container和外部对应关系。-v外部地址和container内部地址对应关系,在container内部修改jenkins的话,外部也会更新。/etc/localtime时间同步。

docker run --privileged=true -d --name jenkins -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /home/yt/jenkins_home:/var/jenkins_home/ -v /etc/localtime:/etc/localtime jenkins/jenkins:2.54 (或v4)

在这里插入图片描述

docker exec -u 0 -it jenkins bash   # 进入docker container内部,需安装cppcheck等命令
docker save –o jenkins_v4.tar jenkins/jenkins:v4  # 保存docker images为tar包命令
docker load -input jenkins_v4.tar  # 加载tar包为docker images命令

5.2 Jenkins与GitLab配置:docker ps查看正在运行,浏览器访问http://10…:8080/

GitLab与Jenkins的Access Token配置:不涉及具体项目

GitLab配置Access Token,用于jenkins连接GitLab获取GitLab API接口:点击右上角用户头像Edit profile,再点击左侧Access Tokens ,命名为gitlab_jenkins,Select scopes全部勾选上,点击创建产生如下字符串。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第24张图片
如下Manage Jenkins需要admin admin用户。如下Add是一个按钮。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第25张图片

新建jenkins job和配置job:jenkins的Dashboard仪表盘界面点击New Item(要登陆),可新建job或者复制已有job,直接复制已有job,拷贝后的job不要运行build,避免回填错误数据到GitLab

【Docker1】指令,docker-compose,Dockerfile,jenkins_第26张图片
http://10.75.135.34:8084/job/example/,点击Advanced。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第27张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第28张图片
如下gitlab查看成员,只有Maintainer才有Settings。
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第29张图片
【Docker1】指令,docker-compose,Dockerfile,jenkins_第30张图片

Jenkins pipeline script配置

1)	环境模块导入, groovy语言
import hudson.*

2)	清空工作空间
node(""){
    stage("clear workspace"){
        cleanWs()
    }
}

3)	下载源码
node(""){
    stage("download code"){
        echo "download code"
        if (env.gitlabSourceBranch == null){   //当gitlab过来触发的job的话,环境变量上就会有gitlabSourceBranch字串
            git branch: "sw61", credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: 'https://gitlab-dbd...com/bsp_diag/prj_bsp.git'   // null说明不是gitlab触发
        }else{  //gitlab做了push或merge操作时触发,credentialsId就是Access Tokens
            git branch: env.gitlabSourceBranch, credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: env.gitlabSourceRepoHttpUrl
        }
    }
}

4)	源码cppcheck扫描
try{
    node(""){
        stage("cppcheck"){
            echo "cppcheck starting"
            pwd()
            sh "/home/cppcheck-1.75/cppcheck 4 --enable=all --inconclusive  --xml --xml-version=2 "+env.WORKSPACE+" 2> cppcheck.xml"
            publishCppcheck ignoreBlankFiles: true, pattern: 'cppcheck.xml'
            def cppcheck_file_obj = new File(env.WORKSPACE+"/cppcheck.xml")
            if (cppcheck_file_obj.isFile()){
                echo "cppcheck.xml file exist"
                result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml"
                if (result == ""){
                    echo "analyse cppcheck.xml failure,cppcheck.xml is empty"
                    currentBuild.result="FAILURE"
                }else{
                    echo "analyse cppcheck.xml"
                    cppcheck_result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml | grep 'cppcheck version'"
                    if(cppcheck_result == ""){
                        echo "analyse cppcheck.xml failure,cppcheck.xml format error"
                        currentBuild.result="FAILURE"
                    }else{
                        final_result = sh returnStdout: true ,script: '''cat '''+env.WORKSPACE+'''/cppcheck.xml | grep severity=\\"error\\"'''
                        if(final_result == ""){
                            echo "analyse cppcheck.xml pass"
                        }else{
                            echo "analyse cppcheck.xml failure,cppcheck.xml has error"
                            currentBuild.result="FAILURE"
                        }
                    }
                    
                }
            }else{
                echo "cppcheck.xml file not exist"
                currentBuild.result="FAILURE"
            }
        }
    }
}catch(e) {
    echo "cppcheck failure"
    currentBuild.result="FAILURE"
}

5)	源码编译
try{
    node(""){
        stage("compile code"){
            echo "compile code"
            sh "make"   //在docker里编译
        }
    }
}catch(e) {
    echo "compile code failure"
    currentBuild.result="FAILURE"
}

6)	验证扫描与编译结果,成功后归档相关文件
node(""){
    stage("archive"){
        echo "archive"
        if(currentBuild.result == 'FAILURE') {
            echo "Something unexpected happened. Please inspect Jenkins logs. Skip archive."
        }else{
            sh '''
            mkdir build
            cp cppcheck.xml build/
            cp *.ko build/
            tar -zcf archive.tar.gz build/
            '''
            archiveArtifacts artifacts: '*.tar.gz', followSymlinks: false
        }
    }
}

7)	根据扫描和编译结果,回填数据到GitLab
stage("commit gitlab"){
    echo "commit gitlab"
    if(currentBuild.result == 'FAILURE') {
        updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'failed')
    }else{
        updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'success')
    }
}

Jenkins&GitLab集成环境验证

GitLab推送修改至仓库新分支,验证push event可触发jenkins job,jenkins回填数据至GitLab。
【Docker1】指令,docker-compose,Dockerfile,jenkins_第31张图片
在这里插入图片描述
【Docker1】指令,docker-compose,Dockerfile,jenkins_第32张图片

你可能感兴趣的:(Docker,docker)