什么是 Docker?Docker 的核心概念和常用命令有哪些?
Docker 是什么
Docker 是一个开源的容器化平台,它把应用程序及其所有依赖打包成一个标准化的容器镜像,确保应用在任何环境中都能一致地运行。简单来说,Docker 解决的是"在我机器上能跑"的环境一致性问题。
容器和虚拟机的核心区别在于:虚拟机需要运行完整的操作系统,而容器直接共享宿主机内核,只隔离进程和资源。这带来了秒级启动、MB 级占用和接近原生的性能表现。
| 对比项 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 性能 | 接近原生 | 有虚拟化损耗 |
| 隔离级别 | 进程级(namespace + cgroups) | 硬件级 |
| 适用场景 | 微服务、CI/CD、快速扩缩容 | 强隔离需求、不同操作系统 |
Docker 三大核心概念
镜像(Image)
镜像是容器的只读模板,包含了运行应用所需的代码、运行时、库、环境变量和配置文件。镜像采用分层存储(UnionFS),每一层都是只读的,只有最上层的容器层可写。
关键点:
- 镜像通过 Dockerfile 定义构建流程
- 分层结构使得相同层可以跨镜像共享,节省磁盘和传输开销
- 每次修改只产生新的层,不会修改已有层(不可变性)
容器(Container)
容器是镜像的运行实例。它是一个隔离的进程,拥有独立的文件系统、网络和进程空间,但共享宿主机内核。
容器底层依赖两项 Linux 内核机制:
- Namespace:实现资源隔离(PID、NET、MNT、UTS 等)
- Cgroups:实现资源限制(CPU、内存、IO 等)
容器的生命周期:Created → Running → Paused → Stopped → Deleted。
仓库(Registry)
仓库用于存储和分发镜像。最常用的是 Docker Hub(公共仓库),企业内部通常搭建私有仓库。
常见选择:
- Docker Hub:官方公共仓库,镜像最全
- Harbor:企业级私有仓库,支持 RBAC 和镜像扫描
- AWS ECR / Google GCR:云厂商托管仓库,与云服务深度集成
Dockerfile 常用指令
Dockerfile 是构建镜像的脚本,每条指令对应镜像中的一层:
dockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV PYTHONUNBUFFERED=1 EXPOSE 8000 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
核心指令速查:
| 指令 | 作用 | 注意事项 |
|---|---|---|
FROM | 指定基础镜像 | 尽量用 slim/alpine 变体减小体积 |
RUN | 执行命令 | 多条命令用 && 合并,减少层数 |
COPY/ADD | 复制文件到镜像 | 优先用 COPY,ADD 会自动解压 tar |
CMD | 容器启动默认命令 | 可被 docker run 参数覆盖 |
ENTRYPOINT | 容器启动入口 | 不会被覆盖,与 CMD 配合使用 |
ENV | 设置环境变量 | 构建和运行时均生效 |
EXPOSE | 声明监听端口 | 仅文档作用,实际映射靠 -p |
VOLUME | 声明数据卷 | 运行时自动挂载到宿主机 |
WORKDIR | 设置工作目录 | 后续指令基于此目录执行 |
CMD 和 ENTRYPOINT 的区别是高频面试点:CMD 定义默认执行命令,可以被 docker run 传入的命令覆盖;ENTRYPOINT 定义容器入口程序,不会被覆盖,CMD 可以作为它的默认参数。
Docker 常用命令
镜像操作
bash# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:1.25 # 查看本地镜像 docker images # 删除镜像 docker rmi nginx:1.25 # 构建镜像(-t 指定名称和标签,末尾的 . 表示 Dockerfile 在当前目录) docker build -t myapp:v1 . # 清理无用镜像 docker image prune
容器操作
bash# 运行容器(-d 后台运行,-p 端口映射,--name 命名) docker run -d -p 8080:80 --name mynginx nginx:1.25 # 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 停止 / 启动 / 重启容器 docker stop mynginx docker start mynginx docker restart mynginx # 进入运行中的容器 docker exec -it mynginx /bin/bash # 查看容器日志(-f 实时跟踪) docker logs -f mynginx # 删除容器(-f 强制删除运行中的容器) docker rm mynginx docker rm -f mynginx # 查看容器资源占用 docker stats
数据与网络
bash# 创建数据卷 docker volume create mydata # 挂载数据卷运行容器 docker run -d -v mydata:/data nginx # 挂载宿主机目录 docker run -d -v /host/path:/container/path nginx # 查看数据卷 docker volume ls # 创建自定义网络 docker network create mynet # 容器加入指定网络 docker run -d --network mynet --name app1 nginx
Docker 默认提供四种网络模式:bridge(默认,容器通过虚拟网桥通信)、host(直接使用宿主机网络栈)、none(无网络)、container(共享另一个容器的网络栈)。生产环境推荐使用自定义网络,容器间可以通过容器名互访。
镜像构建优化实践
构建小而快的镜像是 Docker 使用的核心技能:
- 选择轻量基础镜像:优先用
alpine或slim变体,python:3.11约 1GB,python:3.11-slim约 150MB,python:3.11-alpine约 50MB - 多阶段构建:编译阶段用完整镜像,运行阶段只复制产物到精简镜像
dockerfile# 构建阶段 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 运行阶段 FROM alpine:3.18 COPY /app/myapp /usr/local/bin/ CMD ["myapp"]
- 合并 RUN 指令:把多个
RUN用&&连接,减少镜像层数 - 利用构建缓存:把不常变化的指令(如安装依赖)放在前面,频繁变化的(如 COPY 源码)放在后面
- 使用 .dockerignore:排除 .git、node_modules、pycache 等无关文件,加速构建并减小上下文
面试追问方向
- Docker 容器的隔离机制是什么?→ namespace 实现资源隔离,cgroups 实现资源限制
- CMD 和 ENTRYPOINT 有什么区别?→ CMD 可覆盖,ENTRYPOINT 不可覆盖,两者可组合使用
- 如何减小镜像体积?→ 多阶段构建、alpine 基础镜像、合并 RUN 层、.dockerignore
- Docker 网络模式有哪些?→ bridge/host/none/container 四种,生产推荐自定义网络
- 容器数据如何持久化?→ Volume 和 Bind Mount 两种方式,推荐 Volume
Docker 是现代 DevOps 工具链的基石,掌握其核心概念、常用命令和镜像优化手段,是后端和运维岗位的必备技能。