Docker 镜像使用(手把手讲解)

Docker 镜像使用:从零开始掌握容器化核心技能

在现代软件开发中,开发环境与生产环境不一致导致的“在我机器上能跑”问题,几乎成了每个团队的噩梦。而 Docker 的出现,正是为了解决这一痛点。它通过“镜像”这一核心概念,让我们可以将应用及其所有依赖打包成一个标准化的单元,实现“一次构建,处处运行”。今天,我们就来深入聊聊 Docker 镜像使用,带你从零开始掌握容器化开发的核心能力。

Docker 镜像使用,本质上是把一个完整的运行环境(操作系统、依赖库、应用代码)封装成一个不可变的文件包。你可以把它想象成一个“应用的快照”,就像电影的光盘一样,只要插入兼容的播放器(Docker 引擎),就能完整运行。


什么是 Docker 镜像?它为什么如此重要?

Docker 镜像(Image)是构建容器的基础。它是一个只读的模板,包含了运行某个应用所需的一切:操作系统基础层、运行时环境、依赖库、配置文件和应用代码。

举个例子:你想运行一个用 Python 编写的 Web 服务。这个服务需要 Python 3.9、Flask 框架、特定的配置文件,以及你的代码。如果没有 Docker,你需要在每台机器上手动安装这些依赖,容易出错。而有了 Docker 镜像,你只需要写一个 Dockerfile,构建出一个镜像,就能在任何支持 Docker 的机器上运行。

💡 形象比喻:Docker 镜像就像一个“预制房屋”。它不是空房子,而是已经装好水电、地板、门窗的完整单元。你只需要把它运到你的土地上(服务器),接上电源(启动容器),就能立刻使用。


如何获取和查看 Docker 镜像?

Docker 官方维护了一个巨大的镜像仓库,叫 Docker Hub。你可以在上面搜索到几乎所有主流软件的官方镜像。

1. 拉取镜像

使用 docker pull 命令从 Docker Hub 下载镜像。例如:

docker pull ubuntu:22.04

这行命令的意思是:从 Docker Hub 拉取名为 ubuntu、版本为 22.04 的镜像。

🔍 注释:ubuntu:22.04 是镜像的标签(tag),22.04 是 Ubuntu 的版本号,也是镜像的版本标识。

2. 查看本地镜像

使用 docker images 查看当前机器上已有的所有镜像:

docker images

输出示例:

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 a4a476d56664 2 weeks ago 72.8 MB
nginx latest e6911662749d 3 weeks ago 141 MB

🔍 注释:REPOSITORY 是镜像名称,TAG 是版本标签,IMAGE ID 是镜像的唯一标识(哈希值),SIZE 是镜像大小。
注意:镜像越大,占用空间越多,但通常也意味着包含更多功能。


构建自己的 Docker 镜像:从 Dockerfile 开始

你不可能只用别人构建的镜像。当你要部署自己的应用时,必须学会构建自定义镜像。

创建一个简单的 Python Web 应用

假设你有一个 app.py 文件,内容如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello from Docker!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

编写 Dockerfile

在项目根目录创建一个名为 Dockerfile 的文件(注意大小写),内容如下:

FROM python:3.9-slim

WORKDIR /app

COPY . /app

RUN pip install flask

EXPOSE 5000

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

🔍 注释:

  • FROM 指定基础镜像,这里是官方的 Python 3.9 小型版本,体积小、安全。
  • WORKDIR 设置容器内的工作目录,后续操作都基于此路径。
  • COPY 将本地文件复制到容器中,. 代表当前目录。
  • RUN 在构建阶段执行命令,这里是安装依赖。
  • EXPOSE 声明端口,但不实际打开,仅用于文档说明。
  • CMD 定义容器启动时默认执行的命令。

构建镜像

在 Dockerfile 所在目录执行:

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

🔍 注释:

  • docker build 是构建命令。
  • -t my-python-app:1.0 给镜像打上标签,my-python-app 是名称,1.0 是版本。
  • . 表示构建上下文为当前目录(Dockerfile 所在目录)。

构建成功后,你可以通过 docker images 看到新镜像。


运行镜像并测试服务

构建完成后,就可以用 docker run 命令运行容器了。

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

🔍 注释:

  • -d 表示后台运行(detached 模式),不阻塞终端。
  • -p 8080:5000 将主机的 8080 端口映射到容器的 5000 端口。
  • my-python-app:1.0 是你刚刚构建的镜像名称。

打开浏览器,访问 http://localhost:8080,你应该能看到 Hello from Docker!

✅ 提示:如果提示端口被占用,可以换一个端口,比如 -p 8081:5000


镜像管理:删除、更新与优化

随着项目增多,本地会积累大量镜像。学会管理它们很重要。

查看运行中的容器

docker ps

查看所有容器(包括停止的):

docker ps -a

删除镜像

docker rmi my-python-app:1.0

🔍 注释:rmi 是 remove image 的缩写。如果镜像正在被容器使用,需先删除对应容器。

镜像优化建议

  1. 使用最小基础镜像:如 python:3.9-slim 而非 python:3.9,减少体积。
  2. 合并 RUN 指令:多个 RUN 可合并为一行,减少镜像层。
  3. 使用 .dockerignore:避免把不必要的文件(如 node_modules.git)复制进镜像。

创建 .dockerignore 文件,内容如下:

.git
__pycache__
*.pyc
.env
.DS_Store

这能显著提升构建速度和镜像体积。


Docker 镜像使用中的常见问题与解决

问题 1:镜像拉取失败

可能原因:

  • 网络问题
  • Docker Hub 限流(尤其在公共网络)

解决方法

  • 使用国内镜像加速器(如阿里云、腾讯云),配置方式参考官方文档。
  • 检查本地 Docker 服务是否正常运行。

问题 2:容器启动后立即退出

检查 CMDENTRYPOINT 是否正确。如果命令执行完就退出,容器也会停止。

解决方法

  • 使用 docker run -it --rm my-image:tag /bin/bash 进入容器调试。
  • 确保主进程(如 Flask 服务)持续运行。

总结:掌握 Docker 镜像使用,开启高效开发之路

Docker 镜像使用,是现代开发不可或缺的一环。它不仅解决了环境不一致的问题,还极大提升了部署效率和可维护性。从拉取官方镜像,到构建自定义镜像,再到运行和管理,每一步都值得深入掌握。

通过本文的学习,你应该已经能够:

  • 理解 Docker 镜像的本质与作用
  • 掌握镜像的获取、查看与管理
  • 独立编写 Dockerfile 构建自定义镜像
  • 成功运行并调试自己的容器化应用

未来,当你在团队协作中遇到“环境问题”时,不妨回想起今天学到的 Docker 镜像使用技巧——一个镜像,就能解决所有烦恼。从现在开始,把你的项目“打包”进镜像,让开发更轻松,部署更可靠。