从Hello-World到自定义镜像:在Ubuntu 20.04上玩转Docker镜像的完整工作流

张开发
2026/4/6 20:45:34 15 分钟阅读

分享文章

从Hello-World到自定义镜像:在Ubuntu 20.04上玩转Docker镜像的完整工作流
从Hello-World到自定义镜像在Ubuntu 20.04上玩转Docker镜像的完整工作流当开发者第一次接触Docker时往往会被其一次构建到处运行的理念所吸引。但真正深入使用后才会发现Docker的魅力远不止于此——它更像是一个精密的乐高工厂允许你从基础镜像开始通过层层叠加构建出完全符合需求的定制化环境。本文将带你从最基础的Hello-World镜像出发逐步深入到自定义镜像的创建与管理最终形成一个完整的Docker镜像工作流闭环。1. 环境准备与基础概念在开始构建自定义镜像之前我们需要确保Docker环境已正确安装并理解几个核心概念。Ubuntu 20.04作为长期支持版本提供了稳定的基础环境。Docker三大核心组件镜像(Image)只读模板包含创建容器所需的文件系统结构和内容容器(Container)镜像的可运行实例具有自己的隔离环境仓库(Registry)集中存放镜像的地方Docker Hub是默认公共仓库安装Docker CE最新版本# 更新软件包索引 sudo apt update # 安装依赖工具 sudo apt install apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加稳定版仓库 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu focal stable # 安装Docker CE sudo apt install docker-ce验证安装是否成功sudo docker run hello-world这个简单的命令实际上完成了从拉取镜像到运行容器的完整生命周期。如果看到Hello from Docker!的输出说明你的环境已经准备就绪。2. 镜像生命周期管理基础理解Docker镜像的生命周期是进行自定义镜像开发的基础。一个典型的镜像生命周期包括拉取→运行→修改→提交→推送。2.1 镜像拉取与容器运行让我们以Ubuntu官方镜像为例展示基础操作# 拉取Ubuntu 20.04镜像 docker pull ubuntu:20.04 # 运行交互式容器 docker run -it --name my_ubuntu ubuntu:20.04 /bin/bash在容器内你可以像在普通Ubuntu系统中一样操作# 更新包列表 apt update # 安装常用工具 apt install -y curl wget vim注意在容器中进行的修改默认不会保存到镜像中退出后这些修改将丢失除非提交为新的镜像2.2 镜像与容器管理掌握以下命令对日常开发至关重要# 列出本地镜像 docker images # 列出运行中的容器 docker ps # 列出所有容器包括停止的 docker ps -a # 停止容器 docker stop my_ubuntu # 删除容器 docker rm my_ubuntu # 删除镜像 docker rmi ubuntu:20.043. 构建Python Flask开发环境镜像现在让我们通过一个实际案例——构建Python Flask开发环境镜像来演示完整的自定义镜像工作流。3.1 基础环境准备首先启动一个干净的Ubuntu容器docker run -it --name flask_dev ubuntu:20.04 /bin/bash在容器内执行以下操作# 更新软件源 apt update apt upgrade -y # 安装基础工具 apt install -y python3 python3-pip vim # 安装Flask pip3 install flask # 验证安装 python3 -c import flask; print(flask.__version__)3.2 创建简单的Flask应用在容器内创建应用目录和文件mkdir /app cat /app/app.py EOF from flask import Flask app Flask(__name__) app.route(/) def hello(): return Hello from custom Docker image! if __name__ __main__: app.run(host0.0.0.0, port5000) EOF3.3 提交为自定义镜像退出容器后将其提交为新的镜像docker commit \ -m Added Python3 and Flask with demo app \ -a Your Name \ flask_dev \ my_flask_app:1.0验证新镜像docker images | grep my_flask_app3.4 运行自定义镜像使用新镜像启动容器docker run -d -p 5000:5000 --name flask_container my_flask_app:1.0 python3 /app/app.py访问http://localhost:5000即可看到Flask应用的输出。4. 使用Dockerfile构建专业级镜像虽然docker commit可以快速创建镜像但最佳实践是使用Dockerfile进行可重复的构建。4.1 创建Dockerfile在本地创建项目目录和Dockerfilemkdir flask_project cd flask_project cat Dockerfile EOF FROM ubuntu:20.04 RUN apt update apt upgrade -y \ apt install -y python3 python3-pip \ pip3 install flask WORKDIR /app COPY app.py /app/app.py EXPOSE 5000 CMD [python3, app.py] EOF创建相同的app.py文件cat app.py EOF from flask import Flask app Flask(__name__) app.route(/) def hello(): return Hello from Dockerfile-built image! if __name__ __main__: app.run(host0.0.0.0, port5000) EOF4.2 构建并运行镜像# 构建镜像 docker build -t my_flask_app:2.0 . # 运行容器 docker run -d -p 5001:5000 --name flask_container_2 my_flask_app:2.0访问http://localhost:5001验证新容器是否正常运行。4.3 镜像优化技巧专业级的镜像构建需要考虑以下优化1. 减小镜像体积FROM python:3.8-slim RUN pip install --no-cache-dir flask2. 多阶段构建# 构建阶段 FROM python:3.8 as builder COPY requirements.txt . RUN pip install --user -r requirements.txt # 运行阶段 FROM python:3.8-slim COPY --frombuilder /root/.local /root/.local COPY app.py . ENV PATH/root/.local/bin:$PATH3. 使用.dockerignore__pycache__ *.pyc *.pyo *.pyd .Python env5. 高级镜像管理技巧当拥有多个自定义镜像后有效的管理策略变得尤为重要。5.1 镜像标签与版本控制# 为镜像添加标签 docker tag my_flask_app:1.0 my_flask_app:latest # 查看镜像历史 docker history my_flask_app:1.05.2 镜像导出与导入# 导出镜像为tar文件 docker save -o my_flask_app_1.0.tar my_flask_app:1.0 # 从tar文件导入镜像 docker load -i my_flask_app_1.0.tar5.3 镜像仓库管理虽然本文不涉及具体仓库推送操作但了解以下命令很有帮助# 登录Docker Hub docker login # 标记镜像准备推送 docker tag my_flask_app:1.0 username/my_flask_app:1.0 # 推送到仓库 docker push username/my_flask_app:1.06. 实际开发中的镜像工作流在实际开发中完整的Docker镜像工作流通常包含以下环节开发阶段使用基础镜像启动开发容器在容器内进行应用开发和测试通过volume挂载实现代码热更新构建阶段编写Dockerfile定义构建过程使用多阶段构建优化镜像添加必要的标签和元数据测试阶段运行容器化测试套件扫描镜像中的安全漏洞验证生产环境配置部署阶段将镜像推送到私有仓库使用编排工具部署容器监控容器运行状态一个典型的开发命令示例# 开发时使用volume挂载 docker run -it -v $(pwd):/app -p 5000:5000 my_flask_app:1.0 bash在容器内可以实时修改代码并看到变化而无需重新构建镜像。

更多文章