目前在学习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
安装gitlabgitlab镜像
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
我登陆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>
项目结构:
安装教程
安装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是如下方式
成功:
.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-runnerDockerfile
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,然后重新制作镜像并运行