运维笔记 -- CI/CD 之 docker,jenkins,gitlab,nginx

本文介绍在CentOS 7.5环境下使用Docker进行持续集成与部署的经验,包括解决Nginx安装冲突问题、配置Jenkins与GitLab实现自动化构建流程、调整Docker权限及缓存机制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#前言
近期归整的知识有点杂,每天工作也是近两年最为紧凑的阶段。还是先说需求,一个工程的持续发布,对应的测试环境时基础的python + supervisor形式,新切一个环境出来用docker做。话说之前知道大概的流程是什么样,实际动手操作还是遇到各种问题,机器环境CentOS 7.5。

nginx

这个不必多说,多处都有安装使用文档。所遇到问题是笔者拿到机器是新申请的没有多想就安装了一个nginx,但后来发现机器申请下来会有同事先做init操作,其中就安装了我司应给定配置的nginx。所以自己安装的不能使用,直接yum 卸载,但同时会卸掉默认安装nginx时带有的一些系统设置。恢复过程:
1,CentOS启动命令systemctl 对应的启动文件路径是 /usr/lib/systemd/system 之前自己安装时覆盖了下面的 nginx.service,卸载后又删除了,那么初始化的nginx的就没启动,手动添加相关信息。
2,在nginx没法启动过程中,以为是安装nginx覆盖了初始化的nginx信息,手动删除相关遗留文件时误操作覆盖了初始化的nginx命令,导致nginx的可执行命令文件被替换成了一个空的同名文件。后续折腾半天才发现不对,解决方法是去其他机器上拷贝一个nginx命令文件。nginx命令路径:
/nginx_install_dir/sbin/ 下的nginx可执行文件。

nginx命令:

# 查看nginx信息
nginx -V
# 手动启动nginx
nginx
# 手动停止nginx
kill -QUIT `cat /var/run/nginx.pid`
# 检查nginx conf是否合法
nginx -t # 或者 nginx -t -c your_config.conf

Jenkins + Gitlab

在Jenkins中可以安装Gitlab插件用以从gitlab中触发Jenkins构建工程。
Jenkins在Job 配置中设置“构建触发器”,指定git能够触发的分支,以及gitlab触发操作时附带的Secret token。同时可以设置Jinkins的构建响应哪些分支的推送,默认构建的分支名称等等。

Gitlab在工程的settings中Integration创建webhook,将Jenkins中的gitlab触发器设置处提供的钩子地址设置在此,并且配置与其相同的Secret token。同时可以设置哪些操作将触发这个网络钩子。以此完成代码自动更新。

docker 启动工程

关于docker之前有过两篇比较详细介绍,参见docker 笔记一docker 笔记二

docker权限

提供的Jenkins中执行的ci脚本用户为指定的一个 w_user,但是机器上安装的默认是root用户才能够执行docker相关命令,此处新建分组来修改docker的执行权限,然后让w_user能够执行。修改docker.sock权限,操作如下:

# docker.sock这个套接字文件默认是root用户,root组可读写
$ ls -la /var/run/docker.sock
srw-rw----. 1 root root 0 81 14:44 /var/run/docker.sock
# 新建一个分组docker
$ groupadd docker
# 修改docker.sock所属分组为docker
$ chown root:docker /var/run/docker.sock
# 将w_user用户添加到docker分组
$ usermod -aG docker w_user
$ ll -la /var/run/docker.sock
srw-rw----. 1 root docker 0 81 14:44 /var/run/docker.sock

如果你的docker分组已经存在,那可以直接将w_user用户添加至docker分组

docker cache

docker 笔记二 中有过对docker file编写是利用cashe的描述,再详细些。
1,docker cashe的自动复用是一个层层递进的关系。假设step 4 发生变化不在使用cashe则往后的步骤 step 5,step6…都将不在使用cashe
2,ADD 命令与 COPY 命令中所添加或者拷贝的文件内容发生变化将不再复用本层的cashe,转而重新构建中间层。
3,RUN 命令存在外部依赖是不在复用中间层,如 RUN apt update
4,执行docker build 命令时可以手动指定不使用cashe,
docker build -f your_docker_file --no-cache
具体使用依据各种使用场景变化,能够利用cashe的自然大大提高了build效率,而且还节省了镜像的存储空间。

git command

常见的git command自不必赘述,在此建议平日使用git能够用命令行的尽量不要用工具。遇到很多,做了很久开发的人不懂git基本使用。
1,如何比对某一文件是否在git当前版本中做过修改?
git rev-parse HEAD 能够获得当前工程完整的版本号,
也可以 git rev-parse --short HEAD
获取文件的没有找打一个类似命令,不过 git rev-parse 提供了Options for Files没有找到具体调用方法。变相可以:
git log your_file | awk '{print 2}' 获取某个文件最近一次提交的版本号。
2,git merge 单个commit

git checkout target_branch
git cherry-pick commit_version_id

这样就把 commit_version_id 提交的修改合并到了 target_branch上。

Linux command

基础命令

1,lsof -> ss
太久没用lsof了,发现已经出了替代的命令 ss,
ss -lnp | grep 8080

2,man
查看command的详细说明,MacOS也能使用

3,adduser 和 useradd
adduser your_user 会建立为 your_user建立/home/your_user 目录,要求输入登录密码是可登录用户,useradd则不会,是三无用户。

4,chown
修改文件所属用户,或者文件所属用户组
chown your_owner [: your_group] your_file

5,usermod
修改用户相关信息,包括用户所属组 用man查看详细用法

6,top
top自不必说,这是在top状态下可以按 1 查看cup个数,还可以按2,z,m等自行尝试,man查看详细用法。

7,w
查看机器负载,具体数值依据机器不同配置而异。

postgresql

pg是应该详细梳理下,暂且先记录类似mysql 的dump数据用法吧。

# dump 数据
pg_dump -hhost_ip -Udb_user -dyour_db > your_target.sql
# 导入数据到指定的库
psql -hhost_ip -Udb_user -dyour_db -f your_target.sql
<think>嗯,用户想将一条复杂的Docker运行命令转换成docker-compose.yml文件。首先,我需要仔细分析用户提供的命令,看看每个参数对应docker-compose中的哪些配置项。 用户给的命令是:docker run -itd -p 18080:80 -p 2222:22 -v /opt/soft/docker/gitlab/etc:/etc/gitlab -v /opt/soft/docker/gitlab/log:/var/log/gitlab -v /opt/soft/docker/gitlab/opt:/var/opt/gitlab --restart always --privileged=true --name gitlab gitlab/gitlab-ee 首先,参数分解: - -itd:对应docker-compose中的detached模式,也就是services下的配置加上stdin_open和tty,不过通常只需要在compose里设置detach模式运行,但compose默认是detached,所以可能不需要特别写,除非需要保留交互式终端,可能需要加上stdin_open: true和tty: true。 - -p 18080:80和-p 2222:22:这对应ports配置,写成数组形式,比如- "18080:80"和- "2222:22"。 - -v的三个挂载卷:需要转换成volumes数组,每个挂载点写成"host_path:container_path"。 - --restart always:对应restart: always。 - --privileged=true:设置privileged: true。 - --name gitlab:对应container_name: gitlab- 镜像名称是gitlab/gitlab-ee,所以image字段就是这个。 然后,我需要确保每个参数正确映射到docker-compose的语法。例如,volumes的写法,是否需要用绝对路径。用户提供的挂载路径都是绝对路径,所以没问题。此外,privileged和restart的位置应该在service的顶层配置下。 还要注意docker-compose的版本,不同版本支持不同的配置项。用户可能用的是较新的版本,所以使用version: '3'或者更高版本比较合适。不过现在最新的compose版本可能已经不需要指定version了,但为了兼容性,可能还是建议写上version: '3.8'之类的。 接下来,组装这些配置项到docker-compose.yml的结构中。services下定义一个服务,比如gitlab,然后包含image、container_name、ports、volumes、restart、privileged等字段。 另外,用户提到的参考引用中,引用[2]提到build时指定dockerfile和context,但在这个案例中用户使用的是现成的镜像,所以不需要build部分,直接用image即可。引用[3]提到command覆盖默认命令,但原Docker命令中没有涉及command参数,所以这里也不需要。 最后,检查是否有遗漏的参数,比如环境变量或者其他配置。原命令中没有-e参数,所以不需要environment部分。确认所有参数都转换正确后,就可以生成对应的docker-compose.yml内容了。</think>### 分步解析Docker命令转换 #### 原命令参数解析: ```bash docker run -itd \ # 后台交互模式 -p 18080:80 -p 2222:22 \ # 端口映射 -v /opt/soft/docker/gitlab/etc:/etc/gitlab \ # 数据卷挂载 -v /opt/soft/docker/gitlab/log:/var/log/gitlab \ -v /opt/soft/docker/gitlab/opt:/var/opt/gitlab \ --restart always \ # 重启策略 --privileged=true \ # 特权模式 --name gitlab \ # 容器名称 gitlab/gitlab-ee # 镜像名称 ``` #### 对应docker-compose.yml配置逻辑: 1. **版本声明**:使用通用兼容的Compose版本 2. **服务定义**: - `image`:指定镜像名称 - `container_name`:定义容器名称 - `ports`:配置端口映射 - `volumes`:声明数据卷挂载 - `restart`:设置重启策略 - `privileged`:启用特权模式 - `tty`和`stdin_open`:保持交互支持 ### 最终转换结果 ```yaml version: '3.8' # 推荐使用3.x以上版本[^2] services: gitlab: image: gitlab/gitlab-ee container_name: gitlab ports: - "18080:80" - "2222:22" volumes: - /opt/soft/docker/gitlab/etc:/etc/gitlab - /opt/soft/docker/gitlab/log:/var/log/gitlab - /opt/soft/docker/gitlab/opt:/var/opt/gitlab restart: always privileged: true tty: true stdin_open: true # 对应原命令中的-it参数[^3] ``` ### 关键配置说明 | Docker参数 | Compose配置项 | 技术要点 | |---------------------|-------------------|---------------------------------| | `-p 18080:80` | ports列表 | 保持主机端口与容器端口的对应关系 | | `-v /host:/container` | volumes列表 | 需确保宿主机目录存在且具有读写权限[^1] | | `--privileged` | privileged: true | 赋予容器访问宿主设备的权限 | | `--restart always` | restart: always | 确保容器异常退出后自动重启 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值