【云原生|Docker系列3】Docker镜像构建与实战:从拉取到自定义
1. Docker镜像基础:从拉取到运行
第一次接触Docker镜像时,我把它理解成一个"软件安装包"——但这个安装包有点特殊,它不仅包含软件本身,还把运行环境也打包进去了。比如你想运行一个MySQL服务,传统方式需要先安装操作系统、配置依赖库、设置配置文件,而用Docker只需要一条命令:docker pull mysql。
拉取镜像的完整过程是这样的:当你在终端输入docker pull ubuntu:22.04时:
- Docker客户端会先检查本地是否有该镜像
- 如果没有,会默认从Docker Hub(相当于应用商店)下载
- 下载过程中会显示分层下载的进度条
- 最后将各层组合成完整的镜像
我常用这个命令查看镜像详情:
docker inspect ubuntu:22.04输出结果会显示镜像的创建时间、环境变量、启动命令等元数据,这对排查问题特别有用。
2. 镜像加速与配置技巧
在国内直接拉取镜像可能会很慢,就像我最初用时经常遇到超时问题。后来发现配置镜像加速器能极大改善体验,这里分享我的配置方法:
- 创建或修改daemon.json文件:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ] } EOF- 重启服务生效:
sudo systemctl daemon-reload sudo systemctl restart docker验证加速是否生效可以执行:
docker info | grep Mirrors如果看到配置的镜像地址,说明加速成功。我实测下来,下载速度从原来的几十KB/s提升到了10MB/s以上。
3. 构建自定义镜像实战
去年我负责将一个Python数据分析项目容器化,这个经历让我深刻理解了Dockerfile的重要性。下面通过一个Flask应用的例子,详解构建过程:
- 首先准备项目结构:
/flask-demo ├── app.py ├── requirements.txt └── Dockerfile- 编写app.py:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello, Docker!"- 关键步骤是Dockerfile:
# 使用官方Python镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 先复制依赖文件(这层可以缓存) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 再复制应用代码 COPY . . # 暴露端口 EXPOSE 5000 # 启动命令 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]- 构建镜像:
docker build -t flask-demo:v1 .构建优化技巧:
- 把变化频率低的指令放前面(如安装依赖)
- 使用
.dockerignore排除不需要的文件 - 多阶段构建可以减小镜像体积
4. 镜像管理与安全实践
随着使用深入,我发现镜像管理是个技术活。有一次测试环境磁盘突然满了,排查发现是积累了上百个无用镜像。现在我的管理策略是:
- 定期清理无用镜像:
# 删除所有悬空镜像 docker image prune # 删除指定镜像 docker rmi flask-demo:v1- 给镜像打标签推送到私有仓库:
docker tag flask-demo:v1 my-registry.com/flask-demo:v1 docker push my-registry.com/flask-demo:v1- 安全扫描(使用Trivy工具):
docker scan flask-demo:v1镜像分层原理特别有意思:每个Dockerfile指令都会创建一个新层。通过docker history命令可以看到:
docker history flask-demo:v1输出会显示各层大小和创建它的指令,这正是Docker高效利用存储的关键。
