通常部署不会由前端来干,但是市场已经这么卷了,即使不会也得学啊,哪天转行当运维也说不好😄
说在前面
本文案例会基于Docker
拉取一个Jenkins
镜像并运行容器,在Jenkins
中实现自动化构建部署,前面是概念介绍,对其了解的可以直接看实战开发🌜
快速认识Docker
用于自动化应用程序的部署、运行和管理。它通过容器化技术将应用程序及其依赖打包在一起,确保在不同环境中一致运行。
通俗来讲
就是 Docker
就像是一个“集装箱”,把应用程序和它需要的所有东西(如代码、库、环境等)打包在一起。这样,无论在哪里运行,应用程序都能正常工作,不会因为环境不同而出问题。
镜像
镜像(Image
)是一个只读的模板,包含了运行应用程序所需的所有文件系统结构、依赖、配置和代码。镜像是容器的基础,容器是镜像的运行实例。
通俗来讲
镜像就像是一个“应用程序的安装包”或者“食谱”。它包含了运行程序所需的所有材料(如代码、环境、工具等),但本身不能直接运行。当你用这个“安装包”启动时,它就变成了一个正在运行的“容器”,就像按照食谱做出一道菜一样。
容器
容器(Container
)是Docker
镜像的运行实例。它是一个轻量级、独立的环境,包含了应用程序及其所有依赖,可以在任何支持 Docker 的系统中运行。容器与宿主机和其他容器隔离,但共享操作系统内核。
通俗来讲
容器就像是一个“独立的小房间”,里面运行着一个应用程序。这个房间里有程序需要的所有东西(如代码、工具、环境等),但它与外面的世界隔离开来,不会互相干扰。你可以把这个“房间”搬到任何地方(比如不同的电脑或服务器),它都能正常运行。
Docker 命令
Docker
命令有非常多,具体的可以在线查询,这里更多的是贴出本文案例相关的
镜像相关命令
- 拉取镜像
docker pull <镜像名>:<标签>
docker pull ubuntu:latest
- 查看本地镜像
docker images
- 删除镜像
docker rmi <镜像ID或镜像名>
容器相关命令
- 运行容器
docker run [选项] <镜像名>
docker run -d -p 8080:80 --name mynginx nginx
常用选项:
-d
:后台运行(守护进程模式)-p <主机端口>:<容器端口>
:端口映射--name <容器名>
:为容器命名-v <主机目录>:<容器目录>
:挂载卷-e <环境变量>
:设置环境变量
- 查看运行中的容器
docker ps
- 查看所有容器
docker ps -a
- 启动容器
docker start <容器ID或容器名>
docker stop <容器ID或容器名>
docker restart <容器ID或容器名>
- 删除容器
docker rm <容器ID或容器名>
- 进入容器终端
docker logs <容器ID或容器名>
快速认识Jenkins
Jenkins
是一个开源的自动化服务器,用于持续集成和持续交付(CI/CD
)。
-
持续集成(CI)
- 频繁地将代码集成到主分支,并自动运行测试,确保代码质量。
-
持续交付(CD)
- 自动化部署流程,确保软件可以快速、可靠地发布到生产环境
通俗说法:
Jenkins
就像一个“自动化助手”,它可以帮你完成软件开发中的重复性任务,比如:
- 自动构建:当你提交新代码时,
Jenkins
会自动编译和打包你的程序。 - 自动测试:Jenkins 可以运行测试代码,检查新功能是否破坏了现有的功能。
- 自动部署:如果代码通过了测试,
Jenkins
可以自动将程序部署到服务器上。
简单来说,Jenkins
让开发团队可以更专注于写代码,而不用手动处理繁琐的构建、测试和部署工作。
快速认识Nginx
Nginx 是一个高性能的 Web 服务器,也可以用作 反向代理、负载均衡器 和 HTTP 缓存。
你可以把 Nginx 想象成一个 “交通警察”,它的任务是:
- 把用户的请求(比如访问一个网站)引导到正确的地方(比如你的 HTML 文件或后端服务)。
- 同时,它还能帮你分担流量压力,确保服务器不会因为访问量太大而崩溃。
# 全局配置(影响整个 Nginx)
user www-data;
worker_processes auto;
# 事件模块(处理连接)
events {
worker_connections 1024;
}
# HTTP 模块(处理 HTTP 请求)
http {
# 服务器块(每个 server 块对应一个网站或服务)
server {
listen 80; # 监听 80 端口(HTTP)
server_name example.com; # 域名或 IP
# 根目录(存放网站文件的地方)
root /var/www/html;
index index.html; # 默认加载的文件
# 路由规则
location / {
try_files $uri $uri/ =404; # 尝试加载文件,如果不存在则返回 404
}
}
}
常用命令
-
启动
Nginx
sudo systemctl start nginx
-
停止
Nginx
sudo systemctl stop nginx
-
重启
Nginx
sudo systemctl restart nginx
-
测试配置文件(检查是否有语法错误):
sudo nginx -t
Nginx案例
-
托管静态网站
假设你有一个静态网站,文件存放在
/var/www/html
目录下。你可以这样配置 Nginx:用户访问
http://example.com
时,Nginx 会返回/var/www/html/index.html
。server { listen 80; server_name example.com; root /var/www/html; index index.html; }
-
反向代理
假设你有一个 Node.js 服务运行在
http://localhost:3000
,你可以用 Nginx 做反向代理:server { listen 80; server_name example.com; location / { proxy_pass http://localhost:3000; # 转发请求到 Node.js 服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
实战开发
以下都是在
ubuntu
环境下操作
环境配置
安装docker
# 1. 在安装 Docker 之前,确保系统包是最新的:
sudo apt update
sudo apt upgrade -y
# 2. 安装依赖工具
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 3. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 添加 Docker 的 APT 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 更新 APT 包索引
sudo apt update
# 6. 安装 Docker
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 7. 验证 Docker 安装
sudo docker --version //输出版本号即安装成功
安装Docker问题
sudo apt install -y docker-ce docker-ce-cli containerd.io
安装卡顿
更换docker
镜像
sudo nano /etc/apt/sources.list.d/docker.list
# 1. 将默认镜像替换成国产镜像
# 默认镜像
deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
# 国产镜像(选一个就行)
eb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
# 2. 更新 APT 包索引
sudo apt update
# 3. 重启Docker
sudo systemctl restart docker
安装Nginx
# 安装Nginx
sudo apt-get install -y nginx
# 启动Nginx并设置开机自启
sudo systemctl enable --now nginx
# 验证Nginx是否运行
curl http://localhost
安装Jenkins
# 创建数据卷(持久化数据)
docker volume create jenkins_home
# 拉取 Jenkins 镜像
docker pull jenkins/jenkins:lts
# 创建容器并运行
docker run -u root -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/www/html:/var/www/html \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart unless-stopped \
jenkins/jenkins:lts
# 获取jenkins密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
参数说明:
-p 8080:8080
:Web 访问端口(宿主机端口:容器端口)-p 50000:50000
:Jenkins 代理通信端口-v jenkins_home:/var/jenkins_home
:持久化 Jenkins 配置和数据/var/www/html:/var/www/html
:将nginx中的静态资源目录共享到jenkins中-v /var/run/docker.sock:/var/run/docker.sock
:允许容器内使用宿主机的 Docker(可选,用于在 Jenkins Pipeline 中调用 Docker)--restart unless-stopped
:容器自动重启策略
**通过IP:8080访问:**出现如下图即安装成功
构建Jenkins
- 选择推荐插件
-
创建用户
-
进入jenkins
实战
安装Jenkins插件
- 安装
Nodejs
【dashboard
】➡️【Manage Jenkins
】➡️【Plugins
】➡️【Available plugins
】
Jenkins配置
- 配置
nodejs
环境
-
配置凭证,获得权限拉取代码
- 公钥放到
github
生成ssh
- 在服务器上通过
ssh -T git@github.com
检测是否匹配 - 如果失败,则将
known_hosts
文件设置在安全凭证处
- 公钥放到
-
配置
nodejs
环境 -
构建自动化任务
- 创建任务
-
配置
git
-
指定分支
-
选择
nodejs
环境 -
编写脚本
npm install pnpm -g pnpm install pnpm build # 打包 build 后的文件 tar -zcvf dist.tar.gz dist/ # 删除 build 后的文件 rm -rf dist/ # 移动 build 后的压缩包到 nginx 托管目录下。 echo "Hello, World!" mv dist.tar.gz /var/www/html echo "dist" # 进入托管目录下 cd /var/www/html # 解压 tar -zxf dist.tar.gz # 删除压缩包 rm -rf dist.tar.gz
-
执行任务,查看输出
-
查看服务器是否更新到
Nginx
配置
在上一步jenkins
配置中将代码仓库代码打包到var/www/html/
文件夹中了,在通过nginx
的配置使得可以通过ip
访问
-
修改配置文件
sudo nano /etc/nginx/sites-available/default
-
测试
Nginx
配置sudo nginx -t
如果显示
syntax is ok
和test is successful
,说明配置正确。 -
重启
nginx
sudo systemctl restart nginx
-
通过
ip+80
访问页面
总结
本文基于docker+nginx+jenkins
实现一个简单的业务部署,对初次接触服务端的前端同学有所帮助的话那将是莫大荣幸!🙈
这是前端工程化系列的第十篇【部署】,下一篇会结合githook
实现自动化部署,三连+关注,后期不迷路~