gitlab使用docker自动化部署springcloud项目

文章正文
发布时间:2025-05-14 16:19

目前在学习docker,因为公司用的是svn跟jenkins,我想用gitlab自带的CI/CD配合docker自动化部署springcloud项目

安装docker

我这里安装的docker是用yum安装的,因为也不是很懂,这样比较方便

yum update yum install -y docker systemctl start docker ##后台启动 systemctl enable docker ##开机自启

测试一下 docker是否安装成功,运行 docker run hello-world

安装gitlab

gitlab镜像

docker pull gitlab/gitlab-ee

挂载文件: 通常会将 GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外, 便于日后升级, 因此请先准备这三个目录。mkdir -p /mnt/gitlab/etc mkdir -p /mnt/gitlab/log mkdir -p /mnt/gitlab/data

运行镜像: 准备好这三个目录之后, 就可以开始运行 Docker 镜像了。 我的建议是使用unless-stopped 作为重启策略,这样可以手工停止容器, 方便维护docker run \ -d \ -p 20003:22 \ -p 20002:443 \ -p 20001:20001 \ --name gitlab \ --restart unless-stopped \ -v /mnt/gitlab/etc:/etc/gitlab \ -v /mnt/gitlab/log:/var/log/gitlab \ -v /mnt/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ee

修改配置:vim /mnt/gitlab/etc/gitlab.rb 更改访问地址: external_url: ‘:20001’
修改工作进程数:unicorn[‘worker_processes’]=2 这里注释掉的,默认是 cpu核心数+1,我原来的机器是4核8g,占用了很多内存,其他的功能就用不了了,但是不建议太少,否则很卡,我现在的机器是2核4g,我把进程数设置为2
指定ssh端口:gitlab_rails[‘gitlab_shell_ssh_port’] = 20003
指定开启的主机 gitlab_rails[‘gitlab_ssh_host’] = ‘123.206.9.202’

开启:docker exec -it gitlab /bin/bash gitlab-ctl reconfigure gitlab-ctl restart

这就是重启后的状态,重启成功了


重启成功后,在浏览器输入123.206.9.202:20001即可访问gitlab,第一步是修改密码,输入你想要的密码,即可把root用户重置成功,然后登陆root用户,修改gitlab设置中的语言(我已经设置过了),设置为简体中文,然后重新登陆即可

在这里插入图片描述

springcloud

我登陆gitlab之后,创建群组,创建项目,因为我把容器的22端口指定到主机的20003,所以我创建项目的ssh地址是
ssh://git@123.206.9.202:20003/dev/micro-service.git

下载项目
把本机的id_rsa.pub文件公钥提交到gitlab设置里的ssh秘钥上
git alone ssh://git@123.206.9.202:20003/dev/micro-service.git

编写项目
第一步是编写父pom指定springboot和springcloud版本,然后添加个个子 module,并继承父pom
父pom如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="" xmlns:xsi="" xsi:schemaLocation=" "> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>micro-service</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>micro-service</name> <description>register center</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> </parent> <modules> <module>zuul</module> <module>eureka</module> <module>user</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

项目结构:

在这里插入图片描述

gitlab-runner

安装教程

安装runner

docker pull gitlab/gitlab-runner:latest ##拉取镜像 docker run -d --name gitlab-runner --restart always \ -v /mnt/gitlab-runner/config:/etc/gitlab-runner \ ##挂载配置 -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner ##运行容器 docker exec -it gitlab-runner /bin/bash ##进入容器 gitlab-runner register ##注册

我的配置:

concurrent = 1 check_interval = 0 [session_server] session_timeout = 1800 [[runners]] name = "4h8g上的runner" url = ":20001/" token = "" executor = "docker" [runners.docker] tls_verify = false image = "docker:latest" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/.m2:/root/.m2","/web/project/:/web/project/"] pull_policy = "if-not-present" shm_size = 0 [runners.cache] [runners.cache.s3] [runners.cache.gcs]

我这里的volumes填的第一个是因为我要在容器里使用docker命令,这涉及到docker in docker问题,原因见原文;root/.m2很好理解,因为我在runner里使用maven镜像进行打包操作(见一会的.gitlab-ci.yml文件),将各个jar包存在宿主机的/root/.m2目录下,避免一直下jar包减少job所耗时间,/web/project这个挂载的原因是因为我原来保存maven所打的jar是如下方式

在这里插入图片描述


后来发现上传3个jar包一直卡死(很久才反馈失败),最后找原因是因为这种方式是将打包的jar包上传到gitlab,gitlab的限制上传是100m,可以改但是很麻烦(我那汉化版的没成功,好像是改gitlab的nginx配置),我现在这种方式是不上传的做法,将maven打包的jar存储在宿主机的/web/project目录下
pull_policy = “if-not-present”#这是避免runner重新拉取镜像,直接从本地拉

成功:

在这里插入图片描述

配置.gitlab-ci.yml和Dockerfile

.gitlab-ci.yml

variables: #变量 USER_CONTAINER: "user" USER_IMAGE: "user_server" USER_PORT: 10003 EUREKA_CONTAINER: "eureka" EUREKA_IMAGE: "eureka_server" EUREKA_PORT: 10005 ZUUL_CONTAINER: "zuul" ZUUL_IMAGE: "zuul_server" ZUUL_PORT: 10006 MAVEN_OPTS: "-Dmaven.repo.local=/root/.m2/repository" #指定maven的存储目录 stages: - build - deploy build:jdk8: stage: build script: - echo "=============== 开始编译打包任务 ===============" - mvn clean package -Dmaven.test.skip=true - mkdir -p /web/project/microservice/eureka - mkdir -p /web/project/microservice/zuul - mkdir -p /web/project/microservice/user - cp -r eureka/target/eureka.jar Dockerfile /web/project/microservice/eureka/ - cp -r zuul/target/zuul.jar Dockerfile /web/project/microservice/zuul/ - cp -r user/target/user.jar Dockerfile /web/project/microservice/user/ artifacts: paths: - build/ only: - master #当有代码合到主干时触发这个job tags: - 4h8g-runner image: maven:3.3.9-jdk-8 deploy:jdk8: stage: deploy image: docker:latest #目的是为了在docker环境下的runner能执行docker命令 script: - docker ps -a|grep $EUREKA_CONTAINER && docker stop $EUREKA_CONTAINER && docker rm $EUREKA_CONTAINER || echo "not exist" - docker ps -a|grep $ZUUL_CONTAINER && docker stop $ZUUL_CONTAINER && docker rm $ZUUL_CONTAINER || echo "not exist" - docker ps -a|grep $USER_CONTAINER && docker stop $USER_CONTAINER && docker rm $USER_CONTAINER || echo "not exist" - docker images |grep $EUREKA_IMAGE && docker rmi -f $EUREKA_IMAGE || echo "not exist" - docker images |grep $ZUUL_IMAGE && docker rmi -f $ZUUL_IMAGE || echo "not exist" - docker images |grep $USER_IMAGE && docker rmi -f $USER_IMAGE || echo "not exist" - docker build --build-arg JAR_FILE=eureka.jar -t $EUREKA_IMAGE /web/project/microservice/eureka - docker build --build-arg JAR_FILE=zuul.jar -t $ZUUL_IMAGE /web/project/microservice/zuul - docker build --build-arg JAR_FILE=user.jar -t $USER_IMAGE /web/project/microservice/user - docker run -it -d --name $EUREKA_CONTAINER -p $EUREKA_PORT:$EUREKA_PORT $EUREKA_IMAGE - docker run -it -d --name $ZUUL_CONTAINER -p $ZUUL_PORT:$ZUUL_PORT $ZUUL_IMAGE - docker run -it -d --name $USER_CONTAINER -p $USER_PORT:$USER_PORT $USER_IMAGE only: - master tags: - 4h8g-runner

Dockerfile

FROM primetoninc/jdk:1.8 ARG JAR_FILE MAINTAINER example@qq.com COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

结果:
最后的结果是我在docker上运行了五个容器,gitlab和gitlab-runner是常驻的,每当项目更新到主干的时候,会将docker里的 web容器stop跟rm,然后重新制作镜像并运行

在这里插入图片描述


访问123.206.9.202:10005的结果是

在这里插入图片描述

首页
评论
分享
Top