docker 基础入门
DevOps 第一块基石。理解 docker,就理解了现代应用部署的底层逻辑。
一、核心概念
1.1 什么是 docker?
docker 是一个容器化平台,将应用程序及其依赖项打包成一个标准化的单元(容器),在任何支持 docker 的环境中都能一致地运行。
一句话概括:"Build once, run anywhere"——一次构建,处处运行。
1.2 三个核心概念
| 概念 | 说明 | 类比 |
|---|---|---|
| 镜像(Image) | 只读模板,包含应用代码 + 运行时 + 系统工具 + 库文件 | 类 / 蓝图 |
| 容器(Container) | 镜像的运行实例,可读可写,相互隔离 | 对象 / 房子 |
| 仓库(Registry) | 存储和分发镜像的服务 | 代码托管平台 |
1.3 docker vs 虚拟机
| 维度 | 虚拟机(VM) | docker 容器 |
|---|---|---|
| 隔离级别 | 完整 Guest OS(GB 级) | 进程级隔离,共享内核(MB 级) |
| 启动速度 | 分钟级 | 秒级 |
| 资源占用 | 高 | 极低 |
| 适用场景 | 异构系统、强隔离需求 | 微服务、CI/CD、快速迭代 |
二、docker 架构
┌─────────────────────────────────────────┐
│ docker Host │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Container A │ │ Container B │ │
│ │ (nginx:1.25)│ │ (redis:7.2) │ │
│ └──────────────┘ └──────────────┘ │
│ ↕ 共享内核 │
│ ┌──────────────────────────────┐ │
│ │ docker Engine │ │
│ │ dockerd + containerd + runc │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────┘
关键组件: - dockerd:docker 守护进程,负责管理镜像、容器、网络等 - containerd:容器运行时,管理容器生命周期 - runc:OCI 容器运行时,真正执行容器启动
三、常用命令速查
3.1 镜像操作
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:1.25
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:1.25
3.2 容器操作
# 启动容器(前台运行)
docker run nginx:1.25
# 启动容器(后台运行)
docker run -d -p 80:80 --name my-nginx nginx:1.25
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 删除容器
docker rm my-nginx
3.3 日志与调试
# 查看容器日志
docker logs my-nginx
# 实时跟踪日志
docker logs -f my-nginx
# 进入容器内部
docker exec -it my-nginx bash
# 查看容器资源占用
docker stats
3.4 镜像构建
# Dockerfile 示例
FROM nginx:1.25-alpine # 基础镜像
COPY index.html /usr/share/nginx/html/ # 复制文件
EXPOSE 80 # 声明端口
CMD ["nginx", "-g", "Daemon off;"] # 启动命令
# 构建镜像
docker build -t my-nginx:v1 .
# 推送镜像到仓库
docker tag my-nginx:v1 registry.example.com/my-nginx:v1
docker push registry.example.com/my-nginx:v1
四、关键参数解析
4.1 docker run 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-d |
后台运行(Detached) | docker run -d nginx |
-p 80:80 |
端口映射(宿主机:容器) | -p 8080:80 |
-v /data:/app |
数据卷挂载 | -v ./logs:/var/log |
--name myapp |
指定容器名称 | --name web-01 |
--rm |
容器退出后自动删除 | docker run --rm busybox |
-e KEY=val |
设置环境变量 | -e DB_HOST=mysql |
--network bridge |
网络模式 | --network host |
4.2 数据卷(Volume)
docker 容器是无状态的,容器删除后数据丢失。数据卷提供持久化存储:
# 创建数据卷
docker volume create mydata
# 使用数据卷
docker run -v mydata:/app/data nginx
# 查看数据卷列表
docker volume ls
# 删除数据卷
docker volume rm mydata
五、docker 网络
# 查看网络列表
docker network ls
# 创建自定义网络
docker network create my-net
# 在指定网络中启动容器
docker run -d --name app1 --network my-net nginx
docker run -d --name app2 --network my-net redis
# 容器间直接通过名称通信
docker exec app1 ping app2 # ✅ 直接互通
六、生产环境注意事项
⚠️ 以下事项在实际部署中必须注意,面试也是高频考点。
- 不要用
latest标签——生产环境必须指定精确版本,防止不可预期的升级 - 最小化基础镜像——优先用
alpine版本,减少攻击面 - 不要在容器中以 root 运行——使用非特权用户
- 限制容器资源——CPU 和内存必须做 cgroup 限制
- 敏感信息不要打包进镜像——用 docker Secrets 或环境变量注入
- 镜像分层优化——变动小的层放前面,变动大的层放后面,充分利用缓存
七、面试高频题
- docker 容器和虚拟机有什么区别?
-
容器共享宿主机内核,轻量、秒启、资源占用低;VM 独立 Guest OS,重量级、强隔离。
-
Dockerfile 中 COPY 和 ADD 的区别?
-
ADD支持自动解压 tar 包和 URL 下载;COPY只做本地文件复制,推荐使用COPY。 -
docker run -d 和 docker start 的区别?
-
-d是启动新容器;start是重新启动已停止的容器,不创建新实例。 -
如何查看 docker 的存储驱动?
docker info | grep "Storage Driver",常用驱动:overlay2、aufs、devicemapper。