Docker 镜像使用(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代软件开发中,Docker 已成为构建、部署和运行应用程序的基石。Docker 镜像使用是掌握容器化技术的核心环节,它解决了传统开发环境配置复杂、依赖混乱等问题。无论是编程初学者还是中级开发者,理解如何高效利用 Docker 镜像,都能显著提升开发效率和部署的可靠性。本文将从零开始,结合实例和代码,深入讲解 Docker 镜像的原理、操作命令及应用场景,帮助读者轻松上手这一技术。


一、Docker 镜像的核心概念

1. 什么是 Docker 镜像?

Docker 镜像是一个轻量级、独立的软件包,包含运行应用程序所需的所有依赖、库、环境配置等。它可以被比作“软件的快照”,通过它可以直接生成一个或多个运行时的容器实例。

形象比喻
如果将容器比作“虚拟机实例”,那么镜像就是“虚拟机模板”。例如,你可以在一个 Ubuntu 镜像的基础上,快速创建多个 Ubuntu 容器,每个容器都拥有独立的运行环境。

2. 镜像的分层特性

Docker 镜像采用分层结构(Union File System),每一层对应一个操作步骤(如安装软件、添加文件)。这种设计使得镜像体积小且复用性强。

分层原理示例

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y python3

COPY . /app

WORKDIR /app

每一层仅记录与前一层的差异,最终镜像通过叠加所有层形成完整环境。

3. 镜像的存储与来源

  • 本地存储:Docker 守护进程会将镜像保存在 /var/lib/docker/ 目录下。
  • 远程仓库:公共仓库(如 Docker Hub)和私有仓库(如 Harbor)是获取镜像的主要渠道。

二、Docker 镜像的核心操作命令

1. 搜索与拉取镜像

1.1 搜索镜像

使用 docker search 命令在 Docker Hub 中查找镜像:

docker search python

1.2 拉取镜像

通过 docker pull 下载指定镜像:

docker pull nginx:latest
docker pull mysql:8.0

2. 查看本地镜像

docker images 命令列出所有本地镜像:

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx              latest              abc123def...        2 hours ago         90MB
mysql              8.0                 456xyz789...        3 days ago          312MB

3. 构建自定义镜像

3.1 编写 Dockerfile

Dockerfile 是构建镜像的“配方”,以下是一个 Python Web 应用的示例:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt ./

RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

3.2 构建镜像

docker build -t my-python-app:1.0 .

4. 运行容器

通过 docker run 命令从镜像启动容器:

docker run -d -p 8080:5000 --name my-app-container my-python-app:1.0

5. 删除镜像

docker rmi my-python-app:1.0
docker rmi -f abc123def...  # 强制删除(谨慎使用)

三、镜像管理的进阶技巧

1. 镜像的缓存机制

Docker 在构建镜像时会利用缓存加速重复步骤。例如,若 Dockerfile 的前几层未改动,后续构建会直接复用已有的层。

避免缓存失效的技巧

  • 将频繁变动的指令(如 COPY . .)放在 Dockerfile 的最后。
  • 使用 .dockerignore 文件排除不必要的文件(如 node_modules)。

2. 镜像的多阶段构建

通过多阶段构建减少镜像体积,例如:

FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM alpine:3.18
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

此方法将编译环境与运行环境分离,最终镜像仅包含必要文件。

3. 镜像的版本控制

  • 使用语义化标签(如 v1.0.2)管理版本。
  • 结合 Git 提交哈希生成唯一标签:
    docker build -t my-image:$(git rev-parse HEAD) .
    

四、实战案例:Docker 化一个 Python 应用

4.1 案例背景

假设有一个简单的 Flask Web 应用,包含以下文件:

.
├── app.py
├── requirements.txt
└── Dockerfile

4.2 编写 Dockerfile

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

4.3 构建与运行

docker build -t flask-app:1.0 .

docker run -d -p 5000:5000 --name flask-container flask-app:1.0

curl http://localhost:5000

4.4 镜像优化

若发现镜像体积过大,可通过以下方式优化:

  • 使用更小的基础镜像(如 python:3.9-slim 代替 python:3.9)。
  • 清理构建过程中产生的临时文件:
    RUN pip install -r requirements.txt && rm -rf /root/.cache
    

五、常见问题与解决方案

1. 镜像拉取失败

问题

docker pull mysql:8.0
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 192.168.1.1:53: no such host

解决方案

  • 检查网络连接是否正常。
  • 更换镜像源(如使用阿里云镜像加速):
    # 编辑 /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
    }
    

2. 容器端口冲突

现象:运行容器时提示端口已被占用。

docker run -p 80:80 nginx
Error: driver failed programming external connectivity on endpoint ...: Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)

解决方法

  • 停止占用端口的进程(如 lsof -i :80 查找并终止)。
  • 改用未占用的端口:
    docker run -p 8080:80 nginx
    

3. 镜像体积过大

原因
镜像包含不必要的调试工具或临时文件。

优化策略

  • 使用 docker history 分析镜像层:
    docker history --no-trunc flask-app:1.0
    
  • 在 Dockerfile 中删除冗余步骤或清理缓存。

六、最佳实践与社区资源

1. 推荐操作规范

  • 避免 root 权限:在容器内使用非 root 用户运行应用。
  • 环境变量配置:通过 docker run -e KEY=VALUE.env 文件管理配置,而非硬编码。
  • 日志与监控:将日志输出到标准输出(stdout),便于使用 docker logs 查看。

2. 学习资源

  • 官方文档Docker 官方指南
  • 社区镜像:Docker Hub 上的高质量镜像(如 library
  • 进阶工具:Docker Compose(多容器编排)、Docker Desktop(图形化工具)

结论

通过本文,我们系统地学习了 Docker 镜像的原理、操作命令、进阶技巧及实际案例。掌握 Docker 镜像使用 能帮助开发者摆脱环境配置的困扰,实现“一次构建,到处运行”的目标。无论是快速部署 Web 应用,还是构建复杂的微服务架构,Docker 都提供了灵活且高效的解决方案。

建议读者从简单的项目入手(如 Python Flask 应用),逐步实践镜像构建与容器管理。随着经验的积累,可以进一步探索多阶段构建、CI/CD 集成等高级场景。记住,Docker 的核心价值在于标准化和一致性——它让开发、测试和生产环境如同“镜像”般一致,从而显著提升团队协作与交付效率。

最新发布