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

目的

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

安装docker

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

  1.  yum update
     yum install -y docker
     systemctl start docker     ##后台启动
     systemctl enable docker ##开机自启
    
  2. 测试一下 docker是否安装成功,运行 docker run hello-world

安装gitlab

  1. gitlab镜像
  2.  docker pull gitlab/gitlab-ee
    
  3. 挂载文件: 通常会将 GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外, 便于日后升级, 因此请先准备这三个目录。
    mkdir -p /mnt/gitlab/etc
    mkdir -p /mnt/gitlab/log
    mkdir -p /mnt/gitlab/data
    
  4. 运行镜像: 准备好这三个目录之后, 就可以开始运行 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 
    
  5. 修改配置
    vim /mnt/gitlab/etc/gitlab.rb
    
    更改访问地址: external_url: ‘http://123.206.9.202: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’
  6. 开启
    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

  1. 下载项目
    把本机的id_rsa.pub文件公钥提交到gitlab设置里的ssh秘钥上
    git alone ssh://git@123.206.9.202:20003/dev/micro-service.git
  2. 编写项目
    第一步是编写父pom指定springboot和springcloud版本,然后添加个个子 module,并继承父pom
    父pom如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <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>
    
  1. 项目结构:
    在这里插入图片描述

gitlab-runner

  1. 安装教程

  2. 安装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   ##注册
    
  3. 我的配置:

    concurrent = 1
    check_interval = 0
    
    [session_server]
    session_timeout = 1800
    
    [[runners]]
    name = "4h8g上的runner"
    url = "http://123.206.9.202: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重新拉取镜像,直接从本地拉

  4. 成功:
    在这里插入图片描述

配置.gitlab-ci.yml和Dockerfile

  1. .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

  1. 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"]
  1. 结果:
    最后的结果是我在docker上运行了五个容器,gitlab和gitlab-runner是常驻的,每当项目更新到主干的时候,会将docker里的 web容器stop跟rm,然后重新制作镜像并运行
    在这里插入图片描述
    访问123.206.9.202:10005的结果是
    在这里插入图片描述
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值