Linux团队的统一Docker镜像

来源:互联网 发布:php培训机构哪个好 编辑:程序博客网 时间:2024/06/11 09:39

背景

2016年建设了统一开发服务器和CI服务器,出现了如下一些问题:
1. 武汉的出口带宽小,使用深圳的统一开发服务器体验不佳;
2. CI服务器和统一开发服务器,采用两套Docker,不仅维护麻烦,而且开发人员的环境和CI运行经常出现不一致
3. Docker镜像没有基于Dockerfile,已经不知道这个Docker是怎样形成的,也不利于拓展等
4. 历史docker镜像layer层数多,影响效率

基于以上一些问题,2017年的统一开发环境做了一些改进。
(武汉新增一台用于云开发的服务器)

新的改进

目标

做出一个基于Dockerfile的统一开发镜像,开发人员和CI共同使用一个镜像。
第一步:将Dockerfile纳入代码管理
这个核心Dockerfile以及Docker build所需要的材料,都存放在:
http://gitlab.zte.com.cn/jenkins/docker_power

第二步:建立CI任务,自动同步各地服务器的docker镜像
自动同步CI任务地址如下:
http://10.9.88.18:8080/view/Docker%20Update/job/docker_update/

原理

CI监视Dockerfile的github空间,当收到git push事件时,CI执行pipeline任务。
CI的pipeline所需要的Jenkinsfile文件,也存储在上述的github空间中。

CI主要操作

在深圳统一开发服务器、武汉开发服务器、CI服务器上,执行docker build的操作,根据最新的Dockerfile内容构建docker镜像。同时,将最新的docker image push到docker.zte.com.cn的power命名空间进行备份。
能源院的docker仓库地址:
http://docker.zte.com.cn/namespaces/354

部分知识要点

gitlab主动向Push Event

gitlab的xx项目,setting->web hooks中,将CI的job地址填入URL中,例如http://10.9.88.18:8080/project/docker_update
确认push events勾选
点击ADD WEB HOOK 即可

开发人员须知

新的统一镜像为 ubuntu:develop
各地服务器和云端,均为相同名字。
过渡期间,原有的旧镜像 ubuntu:latest 以及 centos:latest 仍然保留,但不再维护和支持(这两个镜像都没有Dockerfile)

缺少常用软件怎么办?
当ubuntu:develop 缺少同性软件时,请联系 严勇文 添加。
(严勇文修改Dockerfile.develop并push到gitlab后,CI自动更新各地的docker image)

我需要属于自己的个性化docker镜像,怎么弄?
当需要个性化的docker镜像时,推荐基于共用的Dockerfile.develop并使用docker build构建属于自己的镜像,例如,修改tag来识别自己,ubuntu:wangyong
推荐大家在
http://gitlab.zte.com.cn/jenkins/docker_power
建立自己的分支。
这样,master分支更新时,可以很容易的将新内容合入自己的分支中。

CI负责人须知

建立统一镜像后,推荐CI负责人将CI任务的docker镜像切换为新的ubuntu:develop ,这样,CI运行的镜像和开发人员镜像一致,环境一致方便调试。

云CI须知

由于统一镜像也会在云端备份,因此,云CI pull/run镜像的地址为:
docker.zte.com.cn:5000/power/ubuntu:develop
另外,由于镜像为一个大统一镜像,因此,建议云CI采用pipeline方式构建,最为高效。

进入docker的推荐方式

function docker_open_normal(){        docker run --rm --name=$2 -it --net=host --privileged -v $HOME:$HOME -w $HOME  $1 sh -c "useradd $2 -u $(id -u $2) -m -s /bin/bash 2>/dev/null && echo $2:${PASSWORD} | chpasswd && chmod +x /etc/sudoers && echo '$2    ALL=(ALL:ALL) ALL' >> /etc/sudoers && chmod -x /etc/sudoers &&  hostname docker && su $2 && bash"}alias docker_open_fast="docker rm -f yanyongwen;docker_open_normal ubuntu:develop yanyongwen"

使用
在普通账号的~/.bashrc里加入上面这个函数
. ~/.bashrc 使之生效
docker_open_normal image:tag your_account
举例:

docker_open_normal ubuntu:develop yanyongwen

可以直接用alias方便使用

为什么要使用这个指令?

  1. 原来进入docker,是root用户,创建和修改过的文件,都会变成root权限,退出docker后,是无法动这些文件的
  2. 服务器普通账号会有很多配置,例如git、pip等等,进入docker后自动复用

这两点很好的解决了现在的docker使用的不便

命令讲解

–rm 退出docker自动删除,防止下次登陆冲突
–name 使用你的账号,方便别人attach进入你的docker进行调试,也方便杀死等
-it 人机交互必备
–net=host 开发需要网络,否则怎么提交代码等
–privileged 打开,才能使用gdb调试
-v HOME:HOME docker路径和普通环境一样,方便操作
-w HOMEHOME
sh -c 可以使用多条shell语句
id -u your_account 获取你的账号的uid
useradd your_account -u your_uid -m -s /bin/bash docker内创建一个同名账号,且该账号和普通环境的uid一致,这样docker创建和修改的文件,普通环境可以直接操作,-m是创建home目录,-s指定用啥交互界面
echo your_account:PASSWORD|chpasswd使echo2 ALL=(ALL:ALL) ALL’ >> /etc/sudoers 是为了让你的账号具有sudo的功能
hostname 是换一个主机名,否则同一个主机名,你在区分普通环境还是docker内部会晕掉
su your_account 直接从root切换到你的账号
bash 没有这个,你无法进入一个交互界面

环境变量

Dockerfile虽然给root设置了环境变量,但是su到你的账号后,环境变量无法继承。
最简单的解决方法就是,直接在~/.bashrc中加入你的语句。
如:

export PATH=$PATH:/opt/arm-2011.03/bin:/opt/HP_Fortify/HP_Fortify_SCA_and_Apps_4.30/bin

一次设置,永久有效。