Open Caaalabash opened 4 years ago
第1.4步,加用/var/run/docker.sock:/var/run/docker.sock之后还需要什么配置吗? 楼主能否详细说下。
@yimng 第1.4步,加用/var/run/docker.sock:/var/run/docker.sock之后还需要什么配置吗? 楼主能否详细说下。
1.4步骤的主要目的是为了设置镜像源;国内机器docker不设置镜像源的话,下载是龟速的,而gitlab-runner的docker executor又没地方设置源,所以把宿主机的docker.sock挂载进去,相当于使用宿主机器的docker,要问额外的配置的话,大概就是“给宿主机的docker添加镜像源了”
@Caaalabash
@yimng 第1.4步,加用/var/run/docker.sock:/var/run/docker.sock之后还需要什么配置吗? 楼主能否详细说下。
1.4步骤的主要目的是为了设置镜像源;国内机器docker不设置镜像源的话,下载是龟速的,而gitlab-runner的docker executor又没地方设置源,所以把宿主机的docker.sock挂载进去,相当于使用宿主机器的docker,要问额外的配置的话,大概就是“给宿主机的docker添加镜像源了”
image: docker:19.03.8
services:
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_DRIVER: overlay2
DOCKER_BUILDKIT: 1
在command里不知道能不能加上registry, 这个问题也困扰了我好久,我用的是自己用Nexus搭建的docker registry(1.1.1.79:8445). 还有个问题想请教,如果我有多个项目(前后端分离,包括java, vue, python),每个项目都是一个git repo, 是每个项目都建个.gitlab-ci.yml来触发ci,还是单起个项目专门用来ci呢?
@yimng
@Caaalabash
@yimng 第1.4步,加用/var/run/docker.sock:/var/run/docker.sock之后还需要什么配置吗? 楼主能否详细说下。
1.4步骤的主要目的是为了设置镜像源;国内机器docker不设置镜像源的话,下载是龟速的,而gitlab-runner的docker executor又没地方设置源,所以把宿主机的docker.sock挂载进去,相当于使用宿主机器的docker,要问额外的配置的话,大概就是“给宿主机的docker添加镜像源了”
image: docker:19.03.8
services:
- name: docker:19.03.8-dind command: ["--insecure-registry=1.1.1.79:8445"]
variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_DRIVER: overlay2
DOCKER_BUILDKIT: 1在command里不知道能不能加上registry, 这个问题也困扰了我好久,我用的是自己用Nexus搭建的docker registry(1.1.1.79:8445). 还有个问题想请教,如果我有多个项目(前后端分离,包括java, vue, python),每个项目都是一个git repo, 是每个项目都建个.gitlab-ci.yml来触发ci,还是单起个项目专门用来ci呢?
似乎可以单起一个仓库,将前端/后端/其他的repo用git submodule引入,拉代码的时候git clone --recursive
即可(没这么实践过,但是应该是可行的)
``
@yimng
@Caaalabash
@yimng 第1.4步,加用/var/run/docker.sock:/var/run/docker.sock之后还需要什么配置吗? 楼主能否详细说下。
1.4步骤的主要目的是为了设置镜像源;国内机器docker不设置镜像源的话,下载是龟速的,而gitlab-runner的docker executor又没地方设置源,所以把宿主机的docker.sock挂载进去,相当于使用宿主机器的docker,要问额外的配置的话,大概就是“给宿主机的docker添加镜像源了”
image: docker:19.03.8 services: - name: docker:19.03.8-dind command: ["--insecure-registry=1.1.1.79:8445"] variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_DRIVER: overlay2 DOCKER_BUILDKIT: 1
在command里不知道能不能加上registry, 这个问题也困扰了我好久,我用的是自己用Nexus搭建的docker registry(1.1.1.79:8445). 还有个问题想请教,如果我有多个项目(前后端分离,包括java, vue, python),每个项目都是一个git repo, 是每个项目都建个.gitlab-ci.yml来触发ci,还是单起个项目专门用来ci呢?
似乎可以单起一个仓库,将前端/后端/其他的repo用git submodule引入,拉代码的时候
git clone --recursive
即可(没这么实践过,但是应该是可行的)
好的,多谢,有时间我试一试
?
通过一周的尝试, 终于从0到1把
gitlab-ci
弄好了, 彻底抛弃travis-ci
, 最大的坑还是墙外的东西太慢了, 总是timeout整个过程分为如下几步:
如何在一个1核2G的云服务器上搭建gitlab: 十分钟搭建Gitlab
使用
gitlab-runner
, 并选择正确的executor
如何构建前端镜像
如何构建后端镜像
编写
gitlab-ci.yml
, 实现一个完整的前端后分离项目的构建部署1. 使用gitlab-runner
gitlab-runner
跟gitlab-ci
是连体婴, 主要为gitlab-ci
打工, 使用镜像的安装方式如下:其中挂载卷
/srv/gitlab-runner/config/config.toml
包含了所有runner
的配置信息.通过挂载
/var/run/docker.sock:/var/run/docker.sock
,使得容器中的进程可以通过它与Docker守护进程通信1.1 选择Docker作为runner的executor
在启动了
gitlab-runner
容器后, 执行如下命令进入容器, 注册runner
接下来需要填写的信息如下:
不出意外, 就能在
gitlab
中看到了1.2 为什么使用docker作为executor
参考官方文档 - executor
shell executor
: 最简单的executor, 所有依赖都必须手动安装Virtual Machine Executor
: 创建虚拟机用于构建, 如果你希望在不同的操作系统上构建, 可以选择它Docker Executor
: 最佳的选择QAQDocker Machine
: Docker的拓展, 工作方式与Docker类似, 不过需要额外的一些安装步骤最后只尝试了
Docker
和Docker + Machine
, 只是Docker + Machine
的runner
一直没有连接成功1.3 什么是Docker in Docker(dind)
参考官方文档 - dind
使用
dind
的背景是: 需要在容器内执行docker命令,在
1.1
中注册好了一个docker executor
之后, 只需要完成两个操作, 即可使用gitlab-ci.yml
中添加:config.toml
中该runner
中设置了privileged = true
1.4 可能遇见的问题: 拉取镜像缓慢
讲道理, 我没有在官方文档中找到: 当使用docker作为runner executor时, 如何设置registry-mirror
如果使用
docker + machine
的话, 可以在config.toml
中设置:进过测试, 此项配置显然对
docker
无效...最终使用的办法是:
1.5 构建阶段一: 打包并上传前端代码
通过在
gitlab-ci
控制台配置一些用于上传至OSS的环境变量, 就可以在这个阶段实现如下两个功能:打包前端代码, 为构建前端镜像作准备
结构webpack插件, 在打包结束后将静态资源上传至OSS
2. 如何构建前后端镜像
2.1 构建前端镜像
对于前后端分离的项目, 往往有一个特点: 需要通过nginx进行反向代理
因此, 前端镜像是以NGINX为核心的, 需要准备2~3个文件
dist
目录: 前端的静态资源xxx.conf
: nginx的部分配置, 例如: history路由的处理, 端口转发Dockerfile
如下:xxx.conf
如下:可以看到
xxx.conf
只与业务相关, 不涉及https
的处理, 这部分应该交由宿主机的nginx进行处理, 示例代码如下:宿主机nginx配置:
体现在
gitlab-ci.yml
中过程很简单, 登录私有镜像仓库, 构建镜像, 上传镜像
2.2. 构建后端镜像
对比前端就更更加简单了, 就是一个普通的构建node镜像流程~
体现在
gitlab-ci.yml
中3. 使用docker-compose在服务器上进行部署
在构建完镜像后, 就进入最后一个阶段: 部署
部署的核心是:
将相关文件拷贝到服务器, 比如一个启动脚本, 一个
docker-compose.yml
执行服务器脚本
体现在
gitlab-ci.yml
中为:构建脚本只是: 停止/删除旧容器/镜像,
docker-compose up
3.1 docker-compose.yml
简化版的配置如下:
核心在于
frontend
中的配置:通过这个配置, 和后端容器共用一个网络, 因此在nginx配置文件中, 可以直接使用
localhost
进行转发, 不过这样做需要保证, 后端容器就绪后再启动前端容器3.2 保证后端容器启动后才前端容器
总所周知,
docker-compose
没有这个能力TAT, 最使用的方案有两个分别启动容器
wait-for-it.sh
此处使用
wait-for-it.sh
的简化版操作修改前端
Dockerfile
为:添加
wait-for-it.sh
即可
END
这波折腾虽然麻烦, 不过还是完整的实现了一个前后端分离项目的Gitlab-ci配置, 达到了预期的目标, 虽然
gitlab-ci.yml
配置是非常好上手的, 除此之外体验了一波gitlab-ci + gitlab-runner连体婴
使用私有镜像仓库!
实践了wait-for-it控制启动流程的方案
没想到试错了90+次....真不适合编程
仓库地址