Docker 系列(四):创建和管理 Docker 镜像
1. 概述
在 Docker 中,镜像(Image)是容器的基础,每个容器都是从镜像生成的。本篇文章将介绍 Docker 镜像的创建与管理方法,包括构建自定义镜像、理解镜像层、镜像优化方法等内容,帮助您深入掌握 Docker 镜像操作。
2. Docker 镜像基础
Docker 镜像是一个只读的模板,包含了运行容器所需的文件系统和配置。镜像由多个只读层组成,通常底层是基础镜像(如 Ubuntu),上层是自定义的应用程序和依赖。
概念 | 说明 |
---|---|
基础镜像 | 官方提供的如 ubuntu:latest 、node:14 等系统环境镜像 |
自定义镜像 | 在基础镜像上添加应用及依赖,并保存为新镜像 |
镜像层 | 每个镜像由多层构成,层叠在一起形成最终的镜像 |
3. 创建自定义 Docker 镜像
要创建自定义 Docker 镜像,可以使用 Dockerfile 来定义各个构建步骤。
-
编写 Dockerfile
以 Node.js 应用为例,创建一个文件夹并添加以下
Dockerfile
:# 使用 Node.js 官方镜像作为基础 FROM node:14 # 设置工作目录 WORKDIR /app # 将 package.json 和 package-lock.json 复制到工作目录 COPY package*.json ./ # 安装依赖 RUN npm install # 将当前目录的代码复制到工作目录 COPY . . # 暴露应用运行端口 EXPOSE 3000 # 运行应用 CMD ["npm", "start"]
-
构建镜像
在 Dockerfile 所在目录运行以下命令,将镜像命名为
my-node-app
:docker build -t my-node-app .
-
运行镜像
使用以下命令运行新镜像创建的容器:
docker run -p 3000:3000 my-node-app
4. 优化 Dockerfile
为了减少镜像大小、提升构建速度,推荐以下优化策略:
- 使用多阶段构建:通过多阶段构建拆分开发和生产环境,减少生产镜像的体积。
- 清理构建缓存:在安装包之后清理缓存文件,如
apt-get
缓存。 - 合并 RUN 指令:将多个
RUN
命令合并为一个,减少镜像层数。
示例优化后的 Dockerfile:
# 多阶段构建
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# 生产镜像
FROM node:14
WORKDIR /app
COPY --from=build /app /app
CMD ["npm", "start"]
5. 镜像管理
命令 | 说明 |
---|---|
docker images | 列出所有本地镜像 |
docker rmi <镜像ID> | 删除指定镜像 |
docker tag <源镜像> <目标镜像:标签> | 给镜像重新打标签 |
docker save -o <文件名> <镜像名> | 导出镜像为 tar 文件 |
docker load -i <文件名> | 从 tar 文件导入镜像 |
示例:
-
查看本地镜像列表:
docker images
-
删除镜像:
docker rmi my-node-app
-
导出和导入镜像:
docker save -o my-node-app.tar my-node-app docker load -i my-node-app.tar
6. 推送镜像到 Docker Hub
将镜像推送到 Docker Hub 可以方便地共享和管理镜像。
-
登录 Docker Hub:
docker login
-
给镜像打标签:
docker tag my-node-app your-dockerhub-username/my-node-app:latest
-
推送镜像:
docker push your-dockerhub-username/my-node-app:latest
7. 常见问题与解决方案
- 镜像太大:使用小型基础镜像(如
alpine
),或者删除不必要的文件。 - 构建时间过长:使用 Docker 缓存,避免重复安装依赖。
- 镜像版本冲突:使用多阶段构建隔离不同的环境和依赖,保持版本一致。
8. 案例:构建一个 Python Web 应用 Docker 镜像
以下是创建 Python Flask Web 应用的 Dockerfile 示例:
# 使用 Python 基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 安装依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]
-
requirements.txt 示例:
flask
-
构建和运行:
docker build -t my-python-app . docker run -p 5000:5000 my-python-app
9. 小结
通过本篇文章,您已经学会了如何创建和管理 Docker 镜像。镜像管理是 Docker 中非常重要的环节,为后续容器化应用打下了基础。熟练掌握镜像创建和优化技巧,将极大提升项目的效率和性能。
下一篇预告:Docker 系列(五):深入理解 Docker 容器 - 从镜像到实例的转变