Docker从小白到入门:核心知识点、实战案例与面试指南
一、Docker核心概念
Docker是什么?
Docker是一种容器化平台,基于容器(Container)技术,允许开发者将应用及其依赖打包成轻量级、可移植的镜像,实现一次构建,随处运行。三大核心概念
- 镜像(Image):应用的静态模板(类似“安装包”)。
- 容器(Container):镜像的运行实例(类似“进程”)。
- 仓库(Registry):镜像的存储中心(如Docker Hub、阿里云镜像仓库)。
容器 vs 虚拟机
特性 容器 虚拟机 启动速度 秒级 分钟级 资源占用 低(共享宿主机内核) 高(独立虚拟化硬件) 隔离性 进程级隔离 完整系统级隔离 部署密度 高(单机可运行数百容器) 低
二、Docker核心命令速查
1. 镜像管理
命令 | 说明 | 示例 |
---|---|---|
docker pull <镜像名> |
拉取镜像 | docker pull nginx:alpine |
docker images |
列出本地镜像 | docker images | grep ubuntu |
docker rmi <镜像ID> |
删除镜像 | docker rmi $(docker images -q) |
docker build -t <镜像名> . |
构建镜像(基于Dockerfile) | docker build -t myapp:v1 . |
docker save -o <文件名> <镜像> |
导出镜像为tar文件 | docker save -o myapp.tar myapp:v1 |
docker load -i <文件名> |
导入镜像 | docker load -i myapp.tar |
2. 容器管理
命令 | 说明 | 示例 |
---|---|---|
docker run [选项] <镜像> |
启动容器 | docker run -d --name web -p 80:80 nginx |
docker ps |
查看运行中的容器 | docker ps -a (查看所有容器) |
docker stop <容器名> |
停止容器 | docker stop web |
docker rm <容器名> |
删除容器 | docker rm $(docker ps -aq) (删除所有容器) |
docker exec -it <容器名> /bin/bash |
进入容器终端 | docker exec -it web bash |
docker logs <容器名> |
查看容器日志 | docker logs -f web (实时跟踪日志) |
docker cp <文件> <容器名>:<路径> |
宿主机与容器间复制文件 | docker cp index.html web:/usr/share/nginx/html |
3. 网络与数据卷
命令 | 说明 | 示例 |
---|---|---|
docker network ls |
列出网络 | docker network create mynet |
docker volume create <卷名> |
创建数据卷 | docker volume create db_data |
docker run -v <宿主机路径>:<容器路径> |
挂载数据卷 | docker run -v /data:/var/lib/mysql mysql |
三、Dockerfile核心指令与最佳实践
1. 常用指令
# 基础镜像
FROM ubuntu:22.04
# 设置工作目录
WORKDIR /app
# 复制文件(优先用COPY而非ADD,避免自动解压)
COPY requirements.txt .
# 安装依赖
RUN apt-get update && apt-get install -y python3
# 暴露端口
EXPOSE 80
# 环境变量
ENV MODE=production
# 容器启动命令
CMD ["python3", "app.py"]
2. 最佳实践
- 多阶段构建:减少镜像体积(如编译环境与运行时分离)。
# 构建阶段 FROM golang:1.18 AS builder WORKDIR /src COPY . . RUN go build -o app . # 运行阶段 FROM alpine:latest COPY --from=builder /src/app /app CMD ["/app"]
- 使用
.dockerignore
:排除无关文件(如日志、临时文件)。 - 最小化镜像:优先选择Alpine等轻量级基础镜像。
四、Docker Compose实战
1. 核心概念
- YAML文件:定义多容器应用的配置(服务、网络、数据卷)。
- 常用命令:
docker-compose up -d # 启动服务(后台运行) docker-compose down # 停止并删除容器 docker-compose logs # 查看日志
2. 示例:部署Web应用(Nginx + Flask + MySQL)
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
app:
build: ./flask-app
environment:
- DB_HOST=db
depends_on:
- db
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=secret
volumes:
db_data:
五、Docker网络与存储
1. 网络模式
模式 | 说明 |
---|---|
bridge | 默认模式,容器通过虚拟网桥通信 |
host | 容器共享宿主机网络命名空间 |
none | 无网络配置 |
自定义网络 | 用户定义网络,支持DNS自动发现 |
2. 数据持久化
- Bind Mount:直接挂载宿主机目录(
-v /host/path:/container/path
)。 - Volume:由Docker管理的数据卷(
docker volume create
)。 - 临时文件系统(tmpfs):仅存于内存,适合敏感数据。
六、安全与最佳实践
安全原则
- 非Root用户运行容器:
RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser
- 镜像漏洞扫描:使用
docker scan <镜像>
或第三方工具(Trivy)。 - 资源限制:
docker run --memory=512m --cpus=1 myapp
- 非Root用户运行容器:
常见问题与调试
- 容器启动失败:查看日志(
docker logs
)和检查端口冲突。 - 权限问题:使用
--privileged
(谨慎)或--cap-add
添加权限。
- 容器启动失败:查看日志(
七、面试高频问题
Q1:Docker镜像分层是什么?有什么好处?
- 答:镜像是多层只读文件系统的叠加,分层可实现资源共享(如多个镜像共用基础层),减少存储占用和加速构建。
Q2:如何优化Docker镜像体积?
- 答:使用多阶段构建、选择Alpine基础镜像、合并RUN指令、清理缓存文件。
Q3:解释Docker的联合文件系统(UnionFS)?
- 答:联合文件系统允许将多个目录挂载到同一个虚拟文件系统,镜像的每一层是只读的,容器层是可写的,修改通过“写时复制”(Copy-on-Write)实现。
Q4:如何实现容器间的通信?
- 答:通过Docker网络(如自定义网络自动DNS解析)或共享数据卷。
八、实战案例
案例1:构建Python Flask应用镜像
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
案例2:多阶段构建优化
# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
案例3:使用Docker Compose部署WordPress
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wpdb
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
通过系统学习以上内容,你可以在1周内快速掌握Docker核心技能,应对面试中的常见问题。建议结合实战项目(如部署个人博客、搭建微服务环境)巩固知识!