docker、jenkins实践

一、docker使用背景

关于虚拟化、docker容器原理以及使用背景等,官网、各种博客技术网站有更专业的解释;

PS:个人经验,如果有实际工程实践或项目需求,能更好理解docker原理、为什么使用docker容器,学习原理对于构建镜像、运行容器有很大帮助;

二、docker安装说明

1、详细docker工具相关组件(client、engine、compose、k8s等)、版本(ce社区版、en企业版)、主流os下如何安装(包括docker版本对应宿主os版本要求):官网使用安装说明

经验、建议:

1)docker安装对操作系统有许多依赖组件,对于linux服务器,最好使用操作系统包管理安装工具,会自动关联下载依赖组件,yum、apt-get等;

2)centos环境:

《docker、jenkins实践》

3)如何验证是否安装成功:

《docker、jenkins实践》

3)遇到依赖组件版本问题,查看启动日志:

《docker、jenkins实践》

三、docker工程实践

1、Dockerfile编写、使用

1)流程:Dockerfile编写->通过Dockerfile构建image->通过image运行容器,构建时通过docker client自动send到docker engine进行处理

2)Dockerfile,构建镜像大多数情况要依赖基础层,如果本地不存在要使用的镜像,默认会从docker hub(类似GitHub)拉取镜像,此处应注意所需镜像版本tag(centos:tag),默认tag是latest,docker hub已经提供许多官方镜像,可登录查看具体镜像版本、信息等,根据需要选择;

根据需要选择设置工作目录,复制内容(文件或目录),此处COPY、ADD均可用,COPY是纯复制操作,ADD如果操作文件相当于COPY,如果是软件包,会进行COPY且解压,此时可换成COPY或者把软件包先放入一级目录下;如果操作二级目录,默认会把二级目录下的内容复制,所以如果想操作复制整个二级目录,目的路径结尾带/(/aiwandeweiss与/aiwandeweiss/此处效果不同);如果想过滤某些内容(文件或目录),可以使用.dockerignore(原理同.gitignore)进行忽略,构建时可以观察下send context内容大小

RUN尽量将相同操作的命令&&执行,这样减少镜像层次,如果是复杂镜像,关于镜像支持最大层次、层次与生成镜像大小关系是需要格外注意的

通过镜像运行的容器的expose端口可根据需要定制,正常可在运行容器时可使用-p选项进行主机端口与容器expose端口映射,这样通过访问主机端口会间接访问到容器端口

CMD启动容器时的start命令

更多Dockerfile可使用命令可详见官网或技术博客:官网Dockerfile编写说明

《docker、jenkins实践》

2、image构建

1)docker client可使用命令,终端执行docker –help,会列出支持的命令,高级用法可参见官网或技术博客,此处不做具体推荐链接

2)本人所使用的命令均为常用命令,且也在学习研究阶段,技术大牛可忽略

《docker、jenkins实践》

构建时可以用-f指定Dockerfile文件,如果已经进入本地用于构建的目录下,默认会识别当前目录下Dockerfile文件;注意后面的.(点),专业详细解释参见:构建Context

3、运行container

《docker、jenkins实践》

参数-v,允许挂载主机目录到容器内,当然在构建镜像时也可以使用VOLUME命令

4、volume卷

可以作数据持久化,动态变化内容mount等,实际工程实践用处很大,根据实际需求选择

–volume-driver可以选择Optional volume driver for the container

–volumes-from可以选择Mount volumes from the specified container(s)

5、镜像、容器空间管理

《docker、jenkins实践》

6、常用命令

《docker、jenkins实践》

四、jenkins、docker、shell

1、jenkins工程同步

job A 传递参数并触发 job B

1)首先在jenkins插件管理,安装 jenkins 参数化插件:Parameterized Trigger 

2)job A 配置中选择构建后操作Trigger parameterized build on other projects ,把要传递的参数根据需求参数化传递,job B配置中选择参数化构建,此处参数名称与job A要传递参数名称保持相同,触发job A后job B的同名参数默认会使用job A传递过来的参数,当然job B同名参数也可以设置默认值,用作job B单独构建时使用

《docker、jenkins实践》

2、shell脚本

awk用法注意:

1)所有容器列表,去掉表头,且找出特定容器名称&&属于特定镜像的容器id

docker ps -a | awk “{if (NR > 1){if (\$2 == image_n && \$NF == container_n) print \$1}}” image_n=”$SPECIAL_VER” container_n=”$CONTAINER_NAME”

此处,如果awk的command中需要取变量值,要用双引号,awk自身内置变量$符要用反斜杠(\)转义回取内置变量含义;从外部读入变量值要从command后读取,否则会出现变量未定义,值为0情况

sed用法注意:

1)如果要处理的内容本身带有斜杠(/),比如url,sed的命令中斜杠分隔符换成叹号分隔符(!)

—————————————————————————————————————-

PS:文章纯属个人实践随笔记录,用于学习交流,不用做任何商业用途;文内如果有错误或者不正确地方,欢迎指正,十分感谢~

    原文作者:爱玩的维斯
    原文地址: https://www.jianshu.com/p/73a457bc8076
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞