Docker入门知识学习(一)

44 阅读3分钟

前言

最近再折腾自己"年久失修"的博客,再将博客的后端部署到服务器上时,之前一直是刀耕火种的形式,将前端项目打包出dist文件,然后通过FTP GUI(Transmit)将文件拖入到服务器中,为了稍微与时俱进一点,也正好将学习面的广度拉大一下,就入了docker的坑。

为什么使用Docker

刀耕火种(传统部署)的缺点

  1. 效率低,每一步都需要手动操作
  2. 容易出错,人工操作易产生失误
  3. 不可重复性,难以保证每次部署的一致性
  4. 环境依赖问题,本地环境和服务器环境可能不一致
  5. 回滚困难,出现问题时不易恢复
  6. 团队协作困难,不同成员的部署方式可能不同

Docker的优势

  1. 环境一致性

    • 开发环境和生产环境保持一致
    • 团队成员可以使用相同的开发环境
  2. 快速部署

    • 构建一次,到处运行
    • 不需要在每台服务器上重复安装环境
    • 容器启动速度快,秒级部署
  3. 资源隔离

    • 每个容器都是独立的环境
    • 不同应用之间互不影响
    • 可以在同一台机器上运行多个版本
  4. 版本控制和回滚

    • 镜像版本可以精确控制
    • 出现问题可以快速回滚
    • 方便进行 A/B 测试
  5. 降低系统资源开销

    • 比传统虚拟机更轻量
    • 共享主机的系统资源
    • 更高效的资源利用率
  6. 简化配置

    • 通过 Dockerfile 管理配置
    • 配置即代码,可以版本控制
    • 减少人工配置错误
  7. 方便的横向扩展

    • 容器可以快速复制
    • 便于实现负载均衡
    • 适合微服务架构
  8. 标准化交付

    • 统一的容器格式
    • 简化开发运维流程
    • 提高团队协作效率

Docker核心概念

镜像(Image)

可以理解为镜像是一个只读的模板,包含了运行应用程序所需的所有文件和配置。可以理解为"安装包"或"模板"。

特点:

  • 分层构建
FROM node:14.21.0-alpine  # 基础层
COPY . .                  # 新的一层
RUN npm install          # 又一层
  • 每一层都是只读的
  • 共享相同的层来节省空间

来源:

  1. 可以从 Docker Hub 拉取官方镜像
  2. 可以基于 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 的更多特性,以进一步优化我的开发和部署流程。