目的
实现git commit后,自动化部署然后更新线上环境的代码
用到的技术栈:CentOS+Docker+Nginx+Jenkins
十分感谢 @不叫猫先生 大佬的文章,juejin.cn/user/835284… 本文章只是看了大佬的文章做了一些总结和提炼,就当做是一个学习笔记和踩坑日记
准备一个服务器
这里推荐阿里云轻量级服务器,但是如果经济条件好的同学,一定要选择更好的,因为我就因为这个服务器的配置太低,踩了好多坑。
云服务器的目的:用docker去托管我们的项目,用nginx反向代理来将网页映射到ip或者域名所在的站点
服务器系统:CentOS 7.6 (最好不要选8版本,因为已经停止维护了,7版本现在是主流)
这里要先去生成一个密钥对
购买好之后,运行实例 一定要以root身份登入
配置服务器环境
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
出现下面的就大功告成啦!!!!!!
nginx和Jenkins镜像拉取
简单介绍一下Jenkins和Nginx
Jenkins就是自动化构建的工具,他可以根据你写的脚本对项目进行下载依赖和📦打包等一些操作
Nginx就是反向代理服务器,可以高并发、处理跨域等等优点,总之就是一个高性能的服务器
Jenkins jenkins/jenkins是jenkins官方维护的库。更新频率非常的到位。后面跟lts表示长期支持的意思
docker pull jenkins/jenkins:lts
docker pull nginx
安装好之后,检查一下镜像库中是否安装成功
docker images
下面这样就可以了
创建容器
创建目录,这里的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端口,所以我们需要在云服务器取开放端口
点击数字
然后添加一下要开放的端口号即可
我们这里先开放8080和8001端口 8080是jenkins工作台的端口,8001是nginx dev服务反向代理的端口号。
添加好后就可以注册一下jenkins账号
浏览器输入服务器地址:8080/jenkins_home
进入到这个页面就可以啦
jenkins环境配置
点击系统管理 我们先要安装一些plugins
然后我们这安装的插件有 nodejs、publish over ssh、webhook这三个插件
jenkins与github集成
假如你在云服务还没有生成ssh密钥对,那么在云服务器终端中输入下面的命令
ssh-keygen -t rsa
ssh密钥对所在的位置一般在/root/.ssh(如果使用的是阿里云服务器,可以在左上角文件->新建文件树来打开可视化目录,这样项目结构更加清晰,但也要注意,这个目录其实不是实时更新的,所以可能要手动的去刷新一下)
在github->settings->ssh key 来设置ssh key
然后在key这一栏中复制你的公钥对进去,也就是id_rsa.pub文件的所有内容
jenkins配置私钥
在系统管理的凭据管理
添加ssh凭据
添加ssh凭据
添加github凭据
填写你github的账号和密码
配置远程连接服务器
添加密码即可
这样我们的jenkins就配置完成了,接下来的内容下一节在来讲
🌸 Docker+Nginx+Jenkins+GitHub 实现自动化部署上线流程 (二):🌸juejin.cn/post/735318…