Docker 基础
2026/1/15大约 3 分钟
Docker 基础
什么是 Docker
Docker 是一个开源的容器化平台,可以将应用及其依赖打包到一个轻量级、可移植的容器中。
容器 vs 虚拟机
┌─────────────────────────────────────────────────────────┐
│ 容器 vs 虚拟机 │
├─────────────────────────┬───────────────────────────────┤
│ 容器 │ 虚拟机 │
├─────────────────────────┼───────────────────────────────┤
│ App A App B │ App A App B │
│ Bins/Libs Bins/Libs │ Bins/Libs Bins/Libs │
│ ───────────────── │ Guest OS Guest OS │
│ Docker Engine │ ───────────────────── │
│ ───────────────── │ Hypervisor │
│ Host OS │ ───────────────────── │
│ ───────────────── │ Host OS │
│ Hardware │ ───────────────────── │
│ │ Hardware │
└─────────────────────────┴───────────────────────────────┘| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB级 | GB级 |
| 隔离性 | 进程级 | 系统级 |
| 性能 | 接近原生 | 有损耗 |
Docker 核心概念
镜像(Image)
镜像是一个只读的模板,包含运行应用所需的所有内容。
# 拉取镜像
docker pull nginx:latest
# 查看镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 搜索镜像
docker search mysql容器(Container)
容器是镜像的运行实例。
# 运行容器
docker run -d --name mynginx -p 80:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx /bin/bash
# 查看容器日志
docker logs -f mynginx仓库(Registry)
仓库是存储和分发镜像的地方。
# 登录 Docker Hub
docker login
# 推送镜像
docker push username/myimage:tag
# 拉取镜像
docker pull username/myimage:tagDockerfile
Dockerfile 是构建镜像的脚本文件。
常用指令
# 基础镜像
FROM openjdk:11-jre-slim
# 维护者信息
LABEL maintainer="dev@example.com"
# 设置工作目录
WORKDIR /app
# 复制文件
COPY target/app.jar app.jar
# 添加文件(支持URL和解压)
ADD https://example.com/file.tar.gz /app/
# 设置环境变量
ENV JAVA_OPTS="-Xms512m -Xmx512m"
# 暴露端口
EXPOSE 8080
# 运行命令(构建时执行)
RUN apt-get update && apt-get install -y curl
# 启动命令
CMD ["java", "-jar", "app.jar"]
# 入口点
ENTRYPOINT ["java", "-jar", "app.jar"]CMD vs ENTRYPOINT
# CMD 可被覆盖
CMD ["echo", "Hello"]
# docker run image echo "World" -> 输出 World
# ENTRYPOINT 不可被覆盖(除非 --entrypoint)
ENTRYPOINT ["echo"]
CMD ["Hello"]
# docker run image World -> 输出 World多阶段构建
# 构建阶段
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]最佳实践
# 1. 使用官方基础镜像
FROM openjdk:11-jre-slim
# 2. 合并 RUN 命令减少层数
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*
# 3. 使用 .dockerignore 排除文件
# .dockerignore 内容:
# .git
# node_modules
# *.log
# 4. 非 root 用户运行
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
USER appuser
# 5. 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/health || exit 1构建和运行
# 构建镜像
docker build -t myapp:1.0 .
# 构建时指定 Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .
# 运行容器
docker run -d \
--name myapp \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-v /data:/app/data \
myapp:1.0常用命令速查
# 镜像操作
docker images # 列出镜像
docker pull <image> # 拉取镜像
docker push <image> # 推送镜像
docker rmi <image> # 删除镜像
docker build -t <name> . # 构建镜像
docker tag <image> <new-name> # 标记镜像
# 容器操作
docker run <image> # 运行容器
docker ps # 列出运行中容器
docker ps -a # 列出所有容器
docker stop <container> # 停止容器
docker start <container> # 启动容器
docker restart <container> # 重启容器
docker rm <container> # 删除容器
docker logs <container> # 查看日志
docker exec -it <container> sh # 进入容器
# 系统操作
docker system df # 查看磁盘使用
docker system prune # 清理无用资源
docker stats # 查看容器资源使用