前言
最近再折腾自己"年久失修"的博客,再将博客的后端部署到服务器上时,之前一直是刀耕火种的形式,将前端项目打包出dist
文件,然后通过FTP GUI(Transmit)
将文件拖入到服务器中,为了稍微与时俱进一点,也正好将学习面的广度拉大一下,就入了docker
的坑。
为什么使用Docker
刀耕火种(传统部署)的缺点
- 效率低,每一步都需要手动操作
- 容易出错,人工操作易产生失误
- 不可重复性,难以保证每次部署的一致性
- 环境依赖问题,本地环境和服务器环境可能不一致
- 回滚困难,出现问题时不易恢复
- 团队协作困难,不同成员的部署方式可能不同
Docker的优势
-
环境一致性
- 开发环境和生产环境保持一致
- 团队成员可以使用相同的开发环境
-
快速部署
- 构建一次,到处运行
- 不需要在每台服务器上重复安装环境
- 容器启动速度快,秒级部署
-
资源隔离
- 每个容器都是独立的环境
- 不同应用之间互不影响
- 可以在同一台机器上运行多个版本
-
版本控制和回滚
- 镜像版本可以精确控制
- 出现问题可以快速回滚
- 方便进行 A/B 测试
-
降低系统资源开销
- 比传统虚拟机更轻量
- 共享主机的系统资源
- 更高效的资源利用率
-
简化配置
- 通过 Dockerfile 管理配置
- 配置即代码,可以版本控制
- 减少人工配置错误
-
方便的横向扩展
- 容器可以快速复制
- 便于实现负载均衡
- 适合微服务架构
-
标准化交付
- 统一的容器格式
- 简化开发运维流程
- 提高团队协作效率
Docker核心概念
镜像(Image)
可以理解为镜像是一个只读的模板,包含了运行应用程序所需的所有文件和配置。可以理解为"安装包"或"模板"。
特点:
- 分层构建
FROM node:14.21.0-alpine # 基础层
COPY . . # 新的一层
RUN npm install # 又一层
- 每一层都是只读的
- 共享相同的层来节省空间
来源:
- 可以从 Docker Hub 拉取官方镜像
- 可以基于 Dockerfile 构建自己的镜像
构建指令:
# 基本构建命令
docker build -t myapp:1.0 .
# 指定 Dockerfile 路径
docker build -f /path/to/Dockerfile .
容器(Container)
容器是镜像的运行实例,就像类和实例的关系:
- 镜像就像是一个类(Class)
- 容器就像是类的实例(Instance)
- 一个镜像可以创建多个容器
示例:
# 构建镜像(创建类)
docker build -t vue3-blog-backend .
# 运行容器(创建实例)
docker run -p 3000:3000 vue3-blog-backend
生命周期:
docker run # 创建并启动容器
docker stop # 停止容器
docker start # 启动已停止的容器
docker rm # 删除容器
Dockerfile
Dockerfile 是用来构建镜像的配置文件,包含了一系列指令。以下是一个实际的例子:
# 使用 Node.js 14 作为基础镜像
FROM node:14.21.0-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "service/server.js"]
主要指令说明:
FROM
: 指定基础镜像WORKDIR
: 设置工作目录COPY
: 复制文件到容器RUN
: 执行构建命令EXPOSE
: 声明端口CMD
: 容器启动命令
小结
本文主要介绍了Docker的基本概念和优势,对于我的博客项目来说,使用 Docker 不仅简化了部署流程,还提供了更好的环境一致性和可维护性。后续我将继续探索 Docker 的更多特性,以进一步优化我的开发和部署流程。