5月27日 23:41

什么是 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 是构建镜像的脚本,每条指令对应镜像中的一层:

dockerfile
FROM 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 使用的核心技能:

  1. 选择轻量基础镜像:优先用 alpineslim 变体,python:3.11 约 1GB,python:3.11-slim 约 150MB,python:3.11-alpine 约 50MB
  2. 多阶段构建:编译阶段用完整镜像,运行阶段只复制产物到精简镜像
dockerfile
# 构建阶段 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 运行阶段 FROM alpine:3.18 COPY --from=builder /app/myapp /usr/local/bin/ CMD ["myapp"]
  1. 合并 RUN 指令:把多个 RUN&& 连接,减少镜像层数
  2. 利用构建缓存:把不常变化的指令(如安装依赖)放在前面,频繁变化的(如 COPY 源码)放在后面
  3. 使用 .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 工具链的基石,掌握其核心概念、常用命令和镜像优化手段,是后端和运维岗位的必备技能。

标签:Devops