Docker 核心知识体系
一、 Docker 核心知识体系(思维导图)
为了让你在大脑中快速建立完整的 Docker 认知框架,这里为你梳理了一份文字版的思维导图:
Docker 知识体系结构图
├── 1. 核心三大概念
│ ├── 镜像 (Image) —— 只读模板(相当于“游戏安装包”)
│ ├── 容器 (Container) —— 运行实例(相当于“运行中的游戏”)
│ └── 仓库 (Registry) —— 存储中心(相当于“应用商店”,如 Docker Hub)
│
├── 2. 基础安装与加速
│ ├── 安装 Docker 引擎
│ └── 配置镜像加速器 (如阿里云,解决国内下载慢的问题)
│
├── 3. 核心生命周期与操作
│ ├── 获取镜像:docker pull
│ ├── 运行容器:docker run
│ ├── 进阶构建:编写 Dockerfile -> docker build
│ └── 分发共享:docker tag -> docker push
│
└── 4. 进阶应用 (扩展)
├── 数据持久化 (Volumes & Bind Mounts)
└── 多容器编排 (Docker Compose)

二、 安装 Docker 与配置阿里镜像加速
拉取镜像慢是国内开发者常遇到的痛点,配置阿里云镜像加速是第一步的“基操”。
1. 安装 Docker (以 Linux/Ubuntu 为例)
最简单的方法是使用官方提供的一键安装脚本:
# 下载并运行官方安装脚本,并指定使用阿里云镜像源进行安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 启动 Docker 服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
(注:如果是 Windows 或 Mac,直接去 Docker 官网下载 Docker Desktop 安装包,一路“下一步”即可。)
2. 配置阿里云镜像加速器 (极速拉取镜像)
-
登录阿里云控制台,搜索“容器镜像服务 (ACR)”。
-
在左侧菜单找到“镜像工具” -> “镜像加速器”,你会得到一个专属的加速地址(如
https://xxxxxx.mirror.aliyuncs.com)。 -
配置 Docker 的
daemon.json文件:sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://你的专属前缀.mirror.aliyuncs.com"] } EOF -
重载配置并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
三、 拉取镜像与运行容器
配置好加速器后,我们就可以拉取别人的“安装包”并运行了。
1. 拉取镜像 (Pull)
# 以拉取官方的 Nginx Web 服务器镜像为例
docker pull nginx
2. 运行容器 (Run)
# 以后台模式运行 Nginx,并将本机的 8080 端口映射到容器的 80 端口
docker run -d -p 8080:80 --name my-web-server nginx
参数解释:
-d: 后台运行 (Detached mode)。-p 8080:80: 端口映射宿主机端口:容器内部端口。--name: 给这个容器起个好记的名字。
现在,打开浏览器访问 http://localhost:8080,你就能看到 Nginx 的欢迎页面了!
四、 如何编写 Dockerfile
当你想要把自己的代码做成镜像时,就需要编写 Dockerfile。它就像一份“菜谱”,告诉 Docker 怎么打包你的应用。
示例:为一个简单的 Python (Flask) 应用编写 Dockerfile
在你的项目根目录下创建一个名为 Dockerfile 的无后缀文件:
# 1. 指定基础镜像 (站在巨人的肩膀上,这里使用轻量级的 Python 3.9)
FROM python:3.9-slim
# 2. 设置容器内的工作目录
WORKDIR /app
# 3. 将当前宿主机目录下的所有文件,复制到容器的 /app 目录下
COPY . /app
# 4. 在容器内执行命令,安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt
# 5. 声明容器运行时需要暴露的端口 (仅作说明,真正映射需要 run -p)
EXPOSE 5000
# 6. 指定容器启动时默认执行的命令
CMD ["python", "app.py"]
根据菜谱“做菜”(构建镜像):
# 在 Dockerfile 所在目录执行。-t 指定镜像名称和标签,注意最后的 "." 代表当前目录
docker build -t my-python-app:v1.0 .
五、 打包与上传镜像 (Push)
构建好自己的镜像后,我们可以把它推送到云端仓库(如 Docker Hub 或 阿里云私有仓库),供其他人或服务器下载。
以推送到 Docker Hub 为例:
1. 登录账号
docker login
# 输入你的 Docker Hub 用户名和密码
2. 给镜像打标签 (Tag)
镜像名称必须包含你的 Docker Hub 用户名,否则会没有权限推送。
# 格式:docker tag 本地镜像名:版本号 你的用户名/远程镜像名:版本号
docker tag my-python-app:v1.0 your_username/my-python-app:v1.0
3. 推送镜像 (Push)
docker push your_username/my-python-app:v1.0
推送成功后,任何人在任何机器上,只需执行 docker pull your_username/my-python-app:v1.0,就能拿到与你一模一样的运行环境!
六、 Docker 核心命令速查表
这里为你总结了日常开发中最常用的 Docker 命令:
| 类别 | 命令 / 语法 | 详细功能说明 |
|---|---|---|
| 基础信息 | docker version / docker info |
查看 Docker 客户端/服务端版本及系统全貌。 |
| 镜像操作 | docker pull <image> |
从仓库拉取指定的镜像。 |
docker images |
列出本地所有已下载的镜像。 | |
docker rmi <image> |
删除本地特定的镜像 (-f 强制删除)。 |
|
docker build -t <name>:<tag> . |
根据当前目录的 Dockerfile 构建新镜像。 | |
| 容器运行 | docker run [参数] <image> |
创建并启动一个新容器。常用参数:-d (后台)、-p (端口映射)、-v (挂载目录)、-it (交互终端)。 |
| 容器管理 | docker ps |
列出当前正在运行的容器 (-a 包含已停止的容器)。 |
docker stop <container> |
优雅地停止一个正在运行的容器。 | |
docker start <container> |
启动一个已停止的容器。 | |
docker rm <container> |
删除一个已停止的容器 (-f 强制删除正在运行的)。 |
|
| 容器交互 | docker logs -f <container> |
实时查看指定容器的运行日志。 |
docker exec -it <container> bash |
进入正在运行的容器内部(类似 SSH 登录)。 | |
| 清理维护 | docker system prune |
大招:清理所有未被使用的镜像、停止的容器和网络,释放磁盘空间。 |
这份指南涵盖了 Docker 的核心脉络。你可以先跟着指南跑一个简单的 Nginx 容器试试手感。
(示例)
请在你的 Java 项目根目录(与 pom.xml 同级)下创建一个名为 Dockerfile 的文件,并填入以下内容:
# ==========================================
# 第一阶段:构建阶段 (编译打包代码)
# ==========================================
# 1. 使用带有 Maven 和 JDK 17 的官方镜像作为构建环境,并命名为 'builder'
FROM maven:3.8.6-eclipse-temurin-17 AS builder
# 2. 设置容器内的工作目录
WORKDIR /build
# 3. 优化缓存:先只复制 pom.xml,下载依赖。
# 这样只要 pom 没变,后续构建就能复用缓存,大幅提高打包速度
COPY pom.xml .
RUN mvn dependency:go-offline
# 4. 复制所有源代码到工作目录
COPY src ./src
# 5. 执行 Maven 打包命令,生成 jar 包 (跳过测试以加快打包速度)
RUN mvn clean package -DskipTests
# ==========================================
# 第二阶段:运行阶段 (构建极简的生产镜像)
# ==========================================
# 6. 使用极其轻量级的 JRE 17 Alpine 镜像作为最终运行环境
FROM eclipse-temurin:17-jre-alpine
# 7. 设置时区为上海 (这是国内 Java 应用极其重要的细节,防止日志和数据库时间错乱)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 8. 设置运行环境的工作目录
WORKDIR /app
# 9. 核心步骤:从上一个叫 'builder' 的阶段,把 target 目录下生成的 jar 包拷贝过来,并重命名为 app.jar
COPY --from=builder /build/target/*.jar app.jar
# 10. 声明容器运行时需要暴露的端口 (以 Spring Boot 默认的 8080 为例)
EXPOSE 8080
# 11. 启动 Java 应用 (推荐使用 ENTRYPOINT 而不是 CMD)
ENTRYPOINT ["java", "-jar", "app.jar"]
核心知识点解读
AS builder 和 COPY --from=builder:这就是多阶段构建的魔法。最终生成的镜像里绝对没有 Maven 和你的源代码,只有干干净净的 JRE 和 app.jar。
eclipse-temurin:17-jre-alpine:
eclipse-temurin 是目前非常官方且稳定的 OpenJDK 发行版。
jre 代表只包含运行环境(不含 javac 等编译工具),体积小。
alpine 是一个极简的 Linux 发行版,基础镜像通常只有 5MB 左右,能极大降低服务器存储和网络传输压力。
时区设置 (ENV TZ=Asia/Shanghai):由于 Alpine 默认是 UTC 时间,如果不加这行,你的 Java 程序打印的日志和存入数据库的时间都会比北京时间慢 8 个小时。
如何构建和运行这个 Java 镜像?
在终端中,确保你处于 Dockerfile 所在的目录。
- 执行构建命令
docker build -t my-java-app:v1.0 .
(注意:第一次构建可能会比较慢,因为要下载 Maven 依赖和基础镜像。之后的构建会因为缓存机制变得飞快。)
- 运行你的 Java 容器
docker run -d -p 8080:8080 --name my-spring-boot-app my-java-app:v1.0
- 查看 Java 启动日志
docker logs -f my-spring-boot-app
在真实的 Java 业务场景中,应用往往不是孤立运行的,通常还需要连接 MySQL 数据库或 Redis 缓存。
需要我为你提供一份 docker-compose.yml 示例,演示如何一键同时启动你的 Java 应用容器和 MySQL 数据库容器吗?
更多推荐
所有评论(0)