Docker
Docker 是什么
Docker 是一个开源的容器化平台,它将应用及其依赖打包成轻量级、可移植的容器,从而确保在不同环境中都能一致运行。
与传统虚拟机相比,Docker 的优势包括:
- 资源占用更少: 容器共享宿主机操作系统内核,无需启动完整操作系统。
- 启动速度快: 容器几乎可以在秒级启动,提升开发和部署效率。
- 便于移植: “一次构建,到处运行”,避免环境不一致问题。
- 易于扩展与维护: 镜像版本管理、微服务架构的天然支持。
Docker 镜像和容器
- Docker 镜像: 是一个只读的模板,包含应用运行所需的所有内容(代码、依赖、配置等)。
- Docker 容器: 是镜像的运行实例,拥有独立的运行时环境,可以增加一个读写层,对外提供实际服务。
Docker 的基本架构组件
- Docker Engine: 是 Docker 的核心,包括守护进程(docker daemon)和客户端工具。
- 镜像(Images): 存储应用及其依赖的打包文件。
- 容器(Containers): 镜像的运行实例。
- 仓库(Registry): 存放和分发镜像的集中存储库,如 Docker Hub 或私有仓库。
- 辅助工具: 如 Docker Compose(定义和管理多容器应用)、Docker Swarm(集群编排)等。
什么是 Dockerfile
Dockerfile 是一个文本文件,其中定义了如何构建 Docker 镜像。
常用指令包括:
- FROM: 指定基础镜像。
- RUN: 在镜像构建过程中执行命令(如安装软件)。
- CMD: 指定容器启动后执行的默认命令。
- COPY/ADD: 将文件复制到镜像中。
- ENV: 设置环境变量。
- EXPOSE: 声明容器监听的端口。
- VOLUME: 指定挂载点,实现数据持久化。
- WORKDIR: 设置工作目录。
- ENTRYPOINT: 配置容器启动时执行的入口程序。
如何在 Docker 中实现数据持久化?
数据持久化可以通过以下方式实现:
- 数据卷(Volumes): Docker 管理的目录,用于存储和共享数据,易于备份和迁移。
- 绑定挂载(Bind Mounts): 将宿主机的目录挂载到容器中,但依赖于宿主机环境。
- 数据卷容器(Data Volume Containers): 使用专门的容器来管理数据卷。
通常推荐使用数据卷,因为其隔离性好且易于管理。
Docker 网络有哪些类型
- Bridge 网络: 默认网络,适用于单机容器间通信。
- Host 网络: 容器共享宿主机的网络栈,性能高,但隔离性较低。
- Overlay 网络: 用于跨主机的容器通信,常见于集群环境(如 Docker Swarm)。
- Macvlan 网络: 为容器分配独立的 MAC 地址,使其在物理网络中表现得像独立设备。
- None: 容器无网络连接,适用于不需要网络通信的场景。
什么是 Docker Compose
Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具。通过编写一个 YAML 配置文件,你可以描述各个服务(包括镜像、网络、数据卷、环境变量等),然后用一条命令(docker-compose up
)启动所有服务。它简化了多容器应用的部署和管理流程。
如何优化 Docker 镜像的构建和性能?
- 多阶段构建: 将构建过程拆分成多个阶段,最后只保留需要运行的部分,减小镜像体积。
- 减少镜像层: 合并相关指令,避免产生过多中间层。
- 使用轻量级基础镜像: 如 Alpine Linux 镜像。
- 清理缓存和临时文件: 在 RUN 命令中安装依赖后立即清理无用文件。
- 合理利用缓存机制: 根据变更频率调整 Dockerfile 指令顺序,减少重复构建。
什么是 Docker Registry
Docker Registry 是一个存储和分发 Docker 镜像的集中仓库。常见的公共仓库有 Docker Hub,而企业可以搭建私有仓库。使用方法:
- 推送(push): 将本地构建好的镜像上传到 Registry。
- 拉取(pull): 从 Registry 下载需要的镜像。
这使得团队协作和持续集成/部署流程更加便捷。
Docker 如何与 CI/CD 流程集成
在 CI/CD 流程中,Docker 常用于构建、测试和部署应用:
- 构建阶段: 在 CI 工具中通过 Dockerfile 构建应用镜像。
- 测试阶段: 启动容器运行自动化测试,保证代码质量。
- 部署阶段: 将构建好的镜像推送到 Registry,再由容器编排工具(如 Kubernetes、Docker Swarm)部署到生产环境。
这种方式能保证环境一致性,提高交付效率与可靠性。
如何优化前端 Docker 镜像体积
- 多阶段构建:用 node 镜像编译代码,用 nginx 镜像运行生产代码
- 基础镜像选择:使用 alpine 等精简镜像(如
node:18-alpine
) - 忽略无用文件:
.dockerignore
排除 node_modules 等 - 层合并:合并 RUN 指令减少镜像层数
示例 Dockerfile:dockerfile# 构建阶段 FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 生产阶段 FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html
如何通过 Docker 实现前端多环境配置
- 环境变量注入:运行时通过
-e
参数传递 - 配置文件挂载:开发时挂载本地配置文件
- 构建参数:使用 ARG 指令构建不同版本
示例(React 环境变量):bashdocker run -e REACT_APP_API_URL=https://api.prod.com my-frontend-image
Docker Compose 在前端开发中的典型使用场景
- 启动完整开发环境:同时启动前端、后端、数据库容器
- 统一管理服务依赖:定义服务网络和卷挂载
- 快速重建环境:
docker-compose up/down
一键操作
示例场景:yamlversion: '3' services: frontend: build: ./frontend ports: - "3000:3000" api: image: my-api:latest ports: - "8080:8080"
如何持久化前端应用的日志文件
- 挂载 volume:
docker run -v /host/path:/app/logs
- 使用日志驱动:
--log-driver=syslog
- ELK 收集:生产环境配合 ELK 技术栈
(开发环境常用 volume 挂载)
如何清理 Docker 占用的磁盘空间
bash
# 删除停止的容器
docker container prune
# 删除无用镜像
docker image prune -a
# 删除构建缓存
docker builder prune
# 删除所有未使用资源
docker system prune
容器中前端应用如何获取真实客户端 IP
- Nginx 配置:设置
proxy_set_header X-Real-IP $remote_addr;
- Docker 网络配置:使用 host 网络模式或正确配置反向代理
- 日志驱动:使用
json-file
日志格式记录 IP
(常见于 SSR 应用日志记录)