Docker从小白到入门:知识点速通与面试指南

发布于:2025-03-22 ⋅ 阅读:(11) ⋅ 点赞:(0)

Docker从小白到入门:核心知识点、实战案例与面试指南


一、Docker核心概念
  1. Docker是什么?
    Docker是一种容器化平台,基于容器(Container)技术,允许开发者将应用及其依赖打包成轻量级、可移植的镜像,实现一次构建,随处运行

  2. 三大核心概念

    • 镜像(Image):应用的静态模板(类似“安装包”)。
    • 容器(Container):镜像的运行实例(类似“进程”)。
    • 仓库(Registry):镜像的存储中心(如Docker Hub、阿里云镜像仓库)。
  3. 容器 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):仅存于内存,适合敏感数据。

六、安全与最佳实践
  1. 安全原则

    • 非Root用户运行容器
      RUN groupadd -r appuser && useradd -r -g appuser appuser
      USER appuser
      
    • 镜像漏洞扫描:使用docker scan <镜像>或第三方工具(Trivy)。
    • 资源限制
      docker run --memory=512m --cpus=1 myapp
      
  2. 常见问题与调试

    • 容器启动失败:查看日志(docker logs)和检查端口冲突。
    • 权限问题:使用--privileged(谨慎)或--cap-add添加权限。

七、面试高频问题
  1. Q1:Docker镜像分层是什么?有什么好处?

    • :镜像是多层只读文件系统的叠加,分层可实现资源共享(如多个镜像共用基础层),减少存储占用和加速构建。
  2. Q2:如何优化Docker镜像体积?

    • :使用多阶段构建、选择Alpine基础镜像、合并RUN指令、清理缓存文件。
  3. Q3:解释Docker的联合文件系统(UnionFS)?

    • :联合文件系统允许将多个目录挂载到同一个虚拟文件系统,镜像的每一层是只读的,容器层是可写的,修改通过“写时复制”(Copy-on-Write)实现。
  4. 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核心技能,应对面试中的常见问题。建议结合实战项目(如部署个人博客、搭建微服务环境)巩固知识!