当前位置:   article > 正文

超详细实战Docker+Jenkins部署生产环境前后分离项目_jenkins和docker

jenkins和docker

环境: 本文的所有服务都部署在阿里云ECS服务器(2H4G)上面, 前后端分离项目使用gitee上面的开源项目若依(ruoyi-vue)为例, 从零开始教学

1、先停止服务器, 再重装系统, 用最干净的系统从头教学, 保证大家环境一样

2、系统选择Centos最新版本, 然后开始安装, 等待安装完成
3、安装完成后用远程工具连接到阿里云服务器, 开始安装docker
  cat /etc/centos-release
  yum update
  yum install -y -q yum-utils
  # 添加源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  # 安装
  yum install -y  docker-ce

 4、验证docker安装完成
  docker version

 5、启动docker, 设置开机启动
  systemctl start docker
  systemctl enable docker

    Docker开启远程访问 

需修改Docker的配置,开启远程访问权限:
打开文件:vim /lib/systemd/system/docker.service
注释:# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
新增:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
更新配置: systemctl daemon-reload
重新启动:systemctl restart docker
可操作远程docker与构建上传docker镜像(代替原来maven docker插件) tcp连接需要开放服务器2375端口 ssh需要使用上方的SSH连接配置 建议使用SSH连接

6、安装docker-compose, 添加可执行权限, 验证
  

sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
https://docs.docker.com/compose/install/standalone/

  sudo chmod +x /usr/local/bin/docker-compose
  docker-compose --version

7、编写docker-compose.yml, 安装若依项目的基础环境
  在根目录下创建 docker-compose.yml

  1. version: '3'
  2. services:
  3. mysql:
  4. image: mysql:8.0.29
  5. container_name: mysql
  6. restart: always
  7. ports:
  8. - 3306:3306
  9. privileged: true
  10. environment:
  11. TZ: Asia/Shanghai
  12. MYSQL_ROOT_PASSWORD: 123456
  13. command:
  14. --default-authentication-plugin=mysql_native_password
  15. --character-set-server=utf8mb4
  16. --collation-server=utf8mb4_general_ci
  17. --explicit_defaults_for_timestamp=true
  18. --lower_case_table_names=1
  19. volumes:
  20. - /mydata/mysql/data/db:/var/lib/mysql #数据文件挂载
  21. - /mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载
  22. - /mydata/mysql/log:/var/log/mysql #日志文件挂载
  23. redis:
  24. image: redis:7
  25. container_name: redis
  26. restart: always
  27. command: redis-server --requirepass 123456 --appendonly yes
  28. volumes:
  29. - /mydata/redis/data:/data #数据文件挂载
  30. - /etc/localtime:/etc/localtime
  31. ports:
  32. - 6379:6379
  33. jenkins:
  34. image: jenkinsci/blueocean
  35. container_name: jenkins
  36. restart: always
  37. user: root
  38. ports:
  39. - 8080:8080
  40. - 50000:50000
  41. volumes:
  42. - /mydata/jenkins_home:/var/jenkins_home
  43. - /etc/localtime:/etc/localtime:ro
  44. - /var/run/docker.sock:/var/run/docker.sock

8、因为若依项目编译需要用到maven, 所以导一份maven的seeting文件到jenkins_home目录
  mkdir -p /mydata/jenkins_home/appconfig/maven
  将settings.xml文件放到上面的目录中

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <pluginGroups>
  6. </pluginGroups>
  7. <proxies>
  8. </proxies>
  9. <servers>
  10. </servers>
  11. <mirrors>
  12. <mirror>
  13. <id>nexus-aliyun</id>
  14. <mirrorOf>central</mirrorOf>
  15. <name>Nexus aliyun</name>
  16. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  17. </mirror>
  18. </mirrors>
  19. <localRepository>/root/.m2</localRepository>
  20. <profiles>
  21. <profile>
  22. <id>jdk-1.8</id>
  23. <activation>
  24. <jdk>1.8</jdk>
  25. </activation>
  26. <properties>
  27. <maven.compiler.source>1.8</maven.compiler.source>
  28. <maven.compiler.target>1.8</maven.compiler.target>
  29. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  30. </properties>
  31. </profile>
  32. </profiles>
  33. </settings>

9、启动docker-compose

10、查看容器启动状态
11、环境准备完毕, 现在开始配置jenkins
  在阿里云服务器的安全组中添加3306 6379 8080端口, 8888后端项目, 8889前端项目

  在浏览器访问jenkins
12、查看管理员密码
    docker logs jenkins

13、安装推荐的插件

  失败一个无所谓, 继续

 14、创建管理员用户
 15、使用我们创建的账号登录

   安装插件Docker Pipeline, 后面构建流水线需要

16、现在开始准备前后端分离的项目, 以RuoYi-Vue为例进行部署, 下载zip包

17、解压, 然后将ruoyi-ui剪切出来放在外面, 形成前后端分离的两个项目
 18、在RuoYi-Vue-master项目中编写Dockerfile和Jenkinsfile两个文件, Dockerfile是将jar包生成镜像, Jenkinsfile是执行流水线的脚本

  1. # FROM java:8
  2. FROM anapsix/alpine-java:8_server-jre_unlimited
  3. # 将当前目录下的jar包复制到docker容器的/目录下
  4. COPY *.jar /app.jar
  5. # 运行过程中创建一个xx.jar文件
  6. RUN touch /app.jar
  7. ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
  8. ENV PARAMS="--spring.profiles.active=prod"
  9. # 声明服务运行在8080端口
  10. EXPOSE 8080
  11. # 指定docker容器启动时运行jar包
  12. ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar $PARAMS" ]
  1. pipeline{
  2. agent any
  3. environment {
  4. IMAGE_NAME = "ruoyi-admin"
  5. WS = "${WORKSPACE}"
  6. }
  7. //定义流水线的加工流程
  8. stages {
  9. //流水线的所有阶段
  10. stage('1.环境检查'){
  11. steps {
  12. sh 'pwd && ls -alh'
  13. sh 'printenv'
  14. sh 'docker version'
  15. sh 'java -version'
  16. sh 'git --version'
  17. }
  18. }
  19. stage('2.编译'){
  20. agent {
  21. docker {
  22. image 'maven:3-alpine'
  23. args '-v maven-repository:/root/.m2'
  24. }
  25. }
  26. steps {
  27. sh 'pwd && ls -alh'
  28. sh 'mvn -v'
  29. sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true'
  30. }
  31. }
  32. stage('3.打包'){
  33. steps {
  34. sh 'pwd && ls -alh'
  35. sh 'echo ${WS}'
  36. // sh 'mv ${WS}/${IMAGE_NAME}/target/*.jar ${WS}/${IMAGE_NAME}.jar && pwd && ls -alh && docker build -t ${IMAGE_NAME} .'
  37. sh 'docker build -t ${IMAGE_NAME} -f Dockerfile ${WS}/${IMAGE_NAME}/target/'
  38. }
  39. }
  40. stage('4.部署'){
  41. // 删除容器和虚悬镜像
  42. steps {
  43. sh 'pwd && ls -alh'
  44. sh 'docker rm -f ${IMAGE_NAME} || true && docker rmi $(docker images -q -f dangling=true) || true'
  45. sh 'docker run -d -p 8888:8080 --name ${IMAGE_NAME} -v /mydata/logs/${IMAGE_NAME}:/logs/${IMAGE_NAME} ${IMAGE_NAME}'
  46. }
  47. }
  48. }
  49. }

19、新增配置文件, 使用我们刚才创建的mysql和redis

  1. # 数据源配置
  2. spring:
  3. datasource:
  4. type: com.alibaba.druid.pool.DruidDataSource
  5. driverClassName: com.mysql.cj.jdbc.Driver
  6. druid:
  7. # 主库数据源
  8. master:
  9. url: jdbc:mysql://xx.xx.xx.xx:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
  10. username: root
  11. password: 123456
  12. # 从库数据源
  13. slave:
  14. # 从数据源开关/默认关闭
  15. enabled: false
  16. url:
  17. username:
  18. password:
  19. # 初始连接数
  20. initialSize: 5
  21. # 最小连接池数量
  22. minIdle: 10
  23. # 最大连接池数量
  24. maxActive: 20
  25. # 配置获取连接等待超时的时间
  26. maxWait: 60000
  27. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  28. timeBetweenEvictionRunsMillis: 60000
  29. # 配置一个连接在池中最小生存的时间,单位是毫秒
  30. minEvictableIdleTimeMillis: 300000
  31. # 配置一个连接在池中最大生存的时间,单位是毫秒
  32. maxEvictableIdleTimeMillis: 900000
  33. # 配置检测连接是否有效
  34. validationQuery: SELECT 1 FROM DUAL
  35. testWhileIdle: true
  36. testOnBorrow: false
  37. testOnReturn: false
  38. webStatFilter:
  39. enabled: true
  40. statViewServlet:
  41. enabled: true
  42. # 设置白名单,不填则允许所有访问
  43. allow:
  44. url-pattern: /druid/*
  45. # 控制台管理用户名和密码
  46. login-username: ruoyi
  47. login-password: 123456
  48. filter:
  49. stat:
  50. enabled: true
  51. # 慢SQL记录
  52. log-slow-sql: true
  53. slow-sql-millis: 1000
  54. merge-sql: true
  55. wall:
  56. config:
  57. multi-statement-allow: true
  58. redis:
  59. # 地址
  60. host: xx.xx.xx.xx
  61. password: 123456

20、初始化若依项目的数据库

21、在前端项目ruoyi-ui中编写Dockerfile和Jenkinsfile两个文件, 并创建两个环境的nginx的配置文件(前端项目要在nginx中运行), 案例演示两个nginx的配置文件除了名字不同, 里面的内容是一相同

  1. FROM nginx:1.22
  2. # 构建参数,在Jenkinsfile中构建镜像时定义
  3. ARG PROFILE
  4. # 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
  5. COPY dist/ /usr/share/nginx/html/
  6. # 用本地配置文件来替换nginx镜像里的默认配置
  7. COPY nginx/nginx-${PROFILE}.conf /etc/nginx/nginx.conf
  8. EXPOSE 80
  9. # 以前台形式持续运行
  10. CMD ["nginx", "-g", "daemon off;"]
  1. pipeline{
  2. agent any
  3. environment {
  4. // 镜像名称
  5. IMAGE_NAME = "ruoyi-ui"
  6. // 工作目录
  7. WS = "${WORKSPACE}"
  8. // 后台项目镜像名称
  9. API_IMAGE_NAME = "ruoyi-admin"
  10. // 自定义的构建参数
  11. PROFILE = "prod"
  12. }
  13. //定义流水线的加工流程
  14. stages {
  15. //流水线的所有阶段
  16. stage('1.环境检查'){
  17. steps {
  18. sh 'pwd && ls -alh'
  19. sh 'printenv'
  20. sh 'docker version'
  21. sh 'git --version'
  22. }
  23. }
  24. stage('2.编译'){
  25. agent {
  26. docker {
  27. image 'node:12-alpine'
  28. }
  29. }
  30. steps {
  31. sh 'pwd && ls -alh'
  32. sh 'node -v'
  33. sh 'cd ${WS} && npm install --registry=https://registry.npmmirror.com --no-fund && npm run build:prod'
  34. }
  35. }
  36. stage('3.打包'){
  37. steps {
  38. sh 'pwd && ls -alh'
  39. sh 'docker build --build-arg PROFILE=${PROFILE} -t ${IMAGE_NAME} .'
  40. }
  41. }
  42. stage('4.部署'){
  43. // 删除容器和虚悬镜像
  44. steps {
  45. sh 'pwd && ls -alh'
  46. sh 'docker rm -f ${IMAGE_NAME} || true && docker rmi $(docker images -q -f dangling=true) || true'
  47. sh 'docker run -d -p 8889:80 --name ${IMAGE_NAME} --link ruoyi-admin:ruoyi-admin ${IMAGE_NAME}'
  48. }
  49. }
  50. }
  51. }
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name localhost;
  13. location / {
  14. root /usr/share/nginx/html;
  15. try_files $uri $uri/ /index.html;
  16. index index.html index.htm;
  17. }
  18. location /prod-api/{
  19. proxy_set_header Host $http_host;
  20. proxy_set_header X-Real-IP $remote_addr;
  21. proxy_set_header REMOTE-HOST $remote_addr;
  22. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  23. #访问容器地址
  24. proxy_pass http://ruoyi-admin:8080/;
  25. #访问外网地址, 后台容器端口映射8888:8080
  26. #proxy_pass http://47.114.186.174:8888/;
  27. }
  28. error_page 500 502 503 504 /50x.html;
  29. location = /50x.html {
  30. root html;
  31. }
  32. }
  33. }

 22、将前后端两个项目上传到gitee

23、下面开始配置jenkins的CICD
 

24、添加分支源

25、 选择发现分支, 根据名称过滤

   一个项目可能会有很多分支, 添加过滤之会只会创建master和dev分支的流水线


26、配置完成保存, 开始构建流水线,  这个过程有点慢, 耐心等待SUCCESS再刷新页面

27、打开Blue Ocean, 可以看见我们的多分支流水线已经构建成功! 因为ruoyi后端项目我们没有创建其他分支, 所以只有master一个流水线
28、手动运行一次

29、测试后端项目接口, 后端项目自动构建部署成功!!
  30、下面开始部署前端项目, 创建一个dev分支, 测试多分支流水线, 步骤和部署后端项目类似

 31、等待初次构建完成

 32、打开Blue Ocean, 可以看到有两条流水线

32、构建master的流水线, 访问若依前端首页

33、奥利给! 全部部署成功

如果有问题可以在评论区提问
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/244981
推荐阅读
相关标签
  

闽ICP备14008679号