🌸 Docker+Nginx+Jenkins+GitHub 实现自动化部署上线流程 (一)🌸

767 阅读6分钟

目的

实现git commit后,自动化部署然后更新线上环境的代码

用到的技术栈:CentOS+Docker+Nginx+Jenkins

参考文章:juejin.cn/post/730603…

十分感谢 @不叫猫先生 大佬的文章,juejin.cn/user/835284… 本文章只是看了大佬的文章做了一些总结和提炼,就当做是一个学习笔记和踩坑日记

准备一个服务器

这里推荐阿里云轻量级服务器,但是如果经济条件好的同学,一定要选择更好的,因为我就因为这个服务器的配置太低,踩了好多坑。

云服务器的目的:用docker去托管我们的项目,用nginx反向代理来将网页映射到ip或者域名所在的站点

服务器系统:CentOS 7.6 (最好不要选8版本,因为已经停止维护了,7版本现在是主流)

这里要先去生成一个密钥对

image.png 购买好之后,运行实例 一定要以root身份登入 image.png

配置服务器环境

yum

yum是CenOS自带的软件包管理工具,但是我们要对yum进行更新

切换到root用户:

sudo -i

小坑:如果不更新的话安装docker-compose会失败

yum update -y

docker安装

  • image->镜像:其实就是你要拉取包的分身,简单来说,就是你要用到的包产生的影分身。

  • container->容器:其实就是image创造的镜像实例。简单来说,镜像是图纸,容器就是根据图纸1:1打造出来的建筑

这里可以参考一下 docker官方文档:docs.docker.com/engine/inst… 我这里就简要的总结一下吧

除去安装的docker相关文件

 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

然后安装 yum-utils(提供了 yum-config-manager 工具)

sudo yum install -y yum-utils

设置软件源

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker Engine

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这样docker就安装好了

docker-compose 安装

docker-compose的作用呢 就是通过一个容器群来管理多个容器,处理多个容器之间的依赖,这样极大提升了容器的可玩性

小坑:使用github.com/docker 这个下载巨巨巨慢,所以要等等,我也使用过阿里镜像下载但是总是开始就停止了不知道为什么,所以等一等吧。

# 安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 提升权限
sudo chmod +x /usr/local/bin/docker-compose

下载完后查看版本

docker-compose -v

出现下面的就大功告成啦!!!!!! image.png

nginx和Jenkins镜像拉取

简单介绍一下Jenkins和Nginx

Jenkins就是自动化构建的工具,他可以根据你写的脚本对项目进行下载依赖和📦打包等一些操作

Nginx就是反向代理服务器,可以高并发、处理跨域等等优点,总之就是一个高性能的服务器

Jenkins jenkins/jenkins是jenkins官方维护的库。更新频率非常的到位。后面跟lts表示长期支持的意思

docker pull jenkins/jenkins:lts
docker pull nginx 

安装好之后,检查一下镜像库中是否安装成功

docker images

下面这样就可以了 image.png

创建容器

创建目录,这里的docker时根目录下的文件夹

mkdir /docker 
mkdir /docker/compose 
mkdir /docker/jenkins_home
mkdir /docker/nginx
mkdir /docker/nginx/conf 
mkdir /docker/html 
mkdir /docker/html/dev
mkdir /docker/html/release 
mkdir /docker/html/pro

创建配置文件

cd /docker/compose 
touch docker-compose.yml 
cd /docker/nginx/conf 
touch nginx.conf

大概的目录结构就是这样的

   + docker 
       + compose
           - docker-compose.yml  //docker-compose配置
       + html             //各环境代码目录(实际项目可能不在同一目录)
           + dev          //dev环境代码目录
           + release      //release环境代码目录
           + pro          //pro环境代码目录
       + jenkins_home     //Jenkins工程目录
       + nginx            //nginx工程目录
           + conf
               - nginx.conf  //nginx配置

nginx.conf

nginx容器的配置文件,这里我尽可能的把配置文件的每一句代码都打上注释,方便大家对nginx有进一步的了解

# 访问操作的用户身份,这里我们设置为root
user  root;
# 这里是工作进程数 也就是cpu数量
worker_processes  1;
# 这里是错误log日志(有时候真的很重要!!)
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
# 链接网站的数量,其实也就是用户数量
events {
    worker_connections  1024;
}
 
 
http {
#   从外部引入配置
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
#   日志的输出格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#   日志输出路径
    access_log  /var/log/nginx/access.log  main;
#   sendfile使用高效文件传输,提升传输性能
    sendfile        on;
#  启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率
    #tcp_nopush     on;
#  客户端与服务端的超时时间
    keepalive_timeout  65;
#   对文件进行压缩
    gzip  on;

    #dev环境
    server {
#   监听的端口
        listen  8001;
        server_name  localhost;
#   设置日志
#        access_log  logs/dev.access.log  main;
        
#   定位到index.html
           location / {
#   你的前端项目文件夹 你要展示的打包后的index.html路径
               root  /usr/share/nginx/html/dev/dist;
#   输入网址(server_name:port)后,默认的访问页面
               index  index.html;
               try_files $uri $uri/ /index.html;
           }
    }

    #sit环境
    server {
            #监听的端口
        listen  8002;
        server_name  localhost;
        #设置日志
#        access_log  logs/sit.access.log  main;
        
        #定位到index.html
           location / {
               #linux下HTML文件夹,就是你的前端项目文件夹
               root  /usr/share/nginx/html/sit/dist;
#               root  /home/html/dev/dist;
               #输入网址(server_name:port)后,默认的访问页面
               index  index.html;
               try_files $uri $uri/ /index.html;
           }
    }
#    include /etc/nginx/conf.d/*.conf;
}

docker-compose.yml

version: '3'

networks:
  frontend:
    external: true

services:                                      # 容器
  docker_jenkins:
    user: root                                 # root权限
    restart: always                            # 重启方式
    image: jenkins/jenkins:lts                 # 使用的镜像
    container_name: jenkins                    # 容器名称
    environment:
      - TZ=Asia/Shanghai
      - "JENKINS_OPTS=--prefix=/jenkins_home" ## 自定义 jenkins 访问前缀(上下文context)


    ports:                                     # 对外暴露的端口定义
      - 8080:8080
      - 50000:50000
      

    volumes:                                   # 卷挂载路径
      - /docker/jenkins_home/:/var/jenkins_home     # 挂载到容器内的jenkins_home目录
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
  
  docker_nginx_dev:                            # nginx-dev环境
    restart: always
    image: nginx
    container_name: nginx_dev
    ports:
      - 8001:8001
    volumes:
      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /docker/html:/usr/share/nginx/html
      - /docker/nginx/logs:/var/log/nginx

  docker_nginx_sit:                            # nginx-sit环境
    restart: always
    image: nginx
    container_name: nginx_sit
    ports:
      - 8002:8002
    volumes:
      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /docker/html:/usr/share/nginx/html
      - /docker/nginx/logs:/var/log/nginx

然后启动docker

systemctl start docker

查看一下运行状态

docker-compose ps -a

Jenkins环境配置

初始化

首先根据上面 docker-compose.yml的配置文件,我们把Jenkins暴露在了8080端口,所以我们需要在云服务器取开放端口

点击数字 image.png

然后添加一下要开放的端口号即可

image.png

我们这里先开放8080和8001端口 8080是jenkins工作台的端口,8001是nginx dev服务反向代理的端口号。

添加好后就可以注册一下jenkins账号 浏览器输入服务器地址:8080/jenkins_home

在这里插入图片描述

在这里插入图片描述

进入到这个页面就可以啦

image.png

jenkins环境配置

点击系统管理 我们先要安装一些plugins

image.png

image.png

image.png

image.png

然后我们这安装的插件有 nodejs、publish over ssh、webhook这三个插件

image.png

image.png

image.png

jenkins与github集成

假如你在云服务还没有生成ssh密钥对,那么在云服务器终端中输入下面的命令

ssh-keygen -t rsa

ssh密钥对所在的位置一般在/root/.ssh(如果使用的是阿里云服务器,可以在左上角文件->新建文件树来打开可视化目录,这样项目结构更加清晰,但也要注意,这个目录其实不是实时更新的,所以可能要手动的去刷新一下) image.png

在github->settings->ssh key 来设置ssh key

image.png

image.png

image.png

然后在key这一栏中复制你的公钥对进去,也就是id_rsa.pub文件的所有内容

image.png

jenkins配置私钥

在系统管理的凭据管理

image.png

image.png

添加ssh凭据

添加ssh凭据 image.png

image.png

添加github凭据

填写你github的账号和密码

image.png

配置远程连接服务器

image.png

image.png

image.png 添加密码即可 image.png

这样我们的jenkins就配置完成了,接下来的内容下一节在来讲

🌸 Docker+Nginx+Jenkins+GitHub 实现自动化部署上线流程 (二):🌸juejin.cn/post/735318…