当前位置: 首页 > article >正文

从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在容器内可以实时修改代码并看到变化而无需重新构建镜像。

相关文章:

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

从Hello-World到自定义镜像:在Ubuntu 20.04上玩转Docker镜像的完整工作流 当开发者第一次接触Docker时,往往会被其"一次构建,到处运行"的理念所吸引。但真正深入使用后才会发现,Docker的魅力远不止于此——它更像是一个…...

如何实现Vuetify与GraphQL Code Generator的完美结合:终极类型安全数据获取指南

如何实现Vuetify与GraphQL Code Generator的完美结合:终极类型安全数据获取指南 【免费下载链接】vuetify 🐉 Vue Component Framework 项目地址: https://gitcode.com/gh_mirrors/vu/vuetify 在现代Web开发中,Vuetify组件框架与Graph…...

如何在浏览器中实现实时人物移除:TensorFlow.js完整指南

如何在浏览器中实现实时人物移除:TensorFlow.js完整指南 【免费下载链接】Real-Time-Person-Removal Removing people from complex backgrounds in real time using TensorFlow.js in the web browser 项目地址: https://gitcode.com/gh_mirrors/re/Real-Time-Pe…...

KawaiiPhysics动画通知实战:AnimNotifyState与AnimNotify的完整应用指南

KawaiiPhysics动画通知实战:AnimNotifyState与AnimNotify的完整应用指南 【免费下载链接】KawaiiPhysics KawaiiPhysics : Simple Bone Physics for UnrealEngine 4 & 5 项目地址: https://gitcode.com/gh_mirrors/ka/KawaiiPhysics 在Unreal Engine开发…...

git-split-diffs自定义主题开发:创建属于你的终端diff主题

git-split-diffs自定义主题开发:创建属于你的终端diff主题 【免费下载链接】git-split-diffs Syntax highlighted side-by-side diffs in your terminal 项目地址: https://gitcode.com/gh_mirrors/gi/git-split-diffs git-split-diffs是一款强大的终端工具&…...

终极指南:如何构建高性能Ghost渐进式Web应用(PWA)实现离线发布与快速访问

终极指南:如何构建高性能Ghost渐进式Web应用(PWA)实现离线发布与快速访问 【免费下载链接】Ghost Independent technology for modern publishing, memberships, subscriptions and newsletters. 项目地址: https://gitcode.com/gh_mirrors…...

终极指南:gallery本地AI模型平台的架构演进与技术发展历程

终极指南:gallery本地AI模型平台的架构演进与技术发展历程 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/GitHub_Trending/gallery44/galle…...

STM32F103ZET6【HAL库实战】STM32CubeMX配置高级定时器实现三相电机驱动PWM

1. 为什么需要带死区的互补PWM 在驱动三相无刷电机时,最头疼的问题就是上下桥臂直通。想象一下,如果同一个桥臂的上下两个MOS管同时导通,电源正负极就直接短路了,轻则烧MOS管,重则整个电路板冒烟。我当年第一次调电机驱…...

快马平台十分钟速成:用自然语言驱动你的第一个任务管理Agent原型

最近在尝试用AI技术简化日常任务管理,发现用自然语言驱动的任务管理Agent特别有意思。这种Agent能理解我们随口说的任务需求,自动分类整理,比传统手动输入方便多了。今天就来分享如何在十分钟内快速搭建这样一个原型,特别适合想验…...

新手福音:通过快马生成tokenp钱包代码示例,轻松入门区块链开发

作为一名刚接触区块链开发的新手,我最近在学习tokenp钱包的相关知识。刚开始看文档时,那些密钥对、地址生成、签名验证的概念让我一头雾水。直到我尝试用InsCode(快马)平台生成示例代码,才真正理解了这些核心概念。下面分享我的学习过程&…...

利用快马AI快速原型:十分钟搭建软件下载站首页与详情页

最近在帮朋友做一个软件下载站的原型,要求能快速上线测试用户反馈。传统开发方式从设计到编码至少需要一周,但这次我用InsCode(快马)平台的AI生成功能,十分钟就搞定了基础框架,分享下具体实现思路。 首页布局设计 首页需要突出展示…...

ozz-animation多格式导入工具链详解:FBX、glTF、Collada全支持

ozz-animation多格式导入工具链详解:FBX、glTF、Collada全支持 【免费下载链接】ozz-animation Open source c skeletal animation library and toolset 项目地址: https://gitcode.com/gh_mirrors/oz/ozz-animation ozz-animation是一款开源C骨骼动画库和工…...

Amundsen多租户架构:企业级数据隔离的终极解决方案

Amundsen多租户架构:企业级数据隔离的终极解决方案 【免费下载链接】amundsen Amundsen is a metadata driven application for improving the productivity of data analysts, data scientists and engineers when interacting with data. 项目地址: https://git…...

LabVIEW发动机性能评估与故障诊断

基于 LabVIEW 的发动机性能评估与故障诊断系统采用模块化架构,以 PXI 总线为硬件核心,软件层通过图形化编程实现多维度数据处理与分析。硬件部分整合振动、压力、转速等多类型传感器,经信号调理模块与 PXI 数据采集卡完成信号转换&#xff0c…...

2026届毕业生推荐的十大AI辅助论文平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作范畴之内,论文AI工具已然变成提高研究效率的关键辅助法子。当下主流工…...

2025最权威的AI辅助写作平台推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能工具在学术写作范畴,已然成了提高效率的关键辅助,以下推举五…...

JSON-java JSONML支持:XML与JSON混合格式的终极处理方案

JSON-java JSONML支持:XML与JSON混合格式的终极处理方案 【免费下载链接】JSON-java A reference implementation of a JSON package in Java. 项目地址: https://gitcode.com/gh_mirrors/js/JSON-java JSON-java是一个强大的Java JSON处理库,它提…...

掌握Scalaz函子Functor:函数式编程的终极指南

掌握Scalaz函子Functor:函数式编程的终极指南 【免费下载链接】scalaz Principled Functional Programming in Scala 项目地址: https://gitcode.com/gh_mirrors/sc/scalaz Scalaz是一个强大的Scala函数式编程库,而Functor(函子&#…...

终极RVM Gemset完全指南:如何优雅隔离Ruby项目依赖

终极RVM Gemset完全指南:如何优雅隔离Ruby项目依赖 【免费下载链接】rvm Ruby enVironment Manager (RVM) 项目地址: https://gitcode.com/gh_mirrors/rv/rvm Ruby开发中,项目依赖冲突是开发者最头疼的问题之一。Ruby enVironment Manager (RVM) …...

告别CMake配置地狱:用vcpkg工具链文件一键集成第三方库的保姆级教程

告别CMake配置地狱:用vcpkg工具链文件一键集成第三方库的保姆级教程 每次新建一个C项目,最让你头疼的是什么?是反复修改CMakeLists.txt只为了让编译器找到正确的头文件路径?还是手动添加几十个库文件路径后依然报"找不到符号…...

【LeetCode】队列 栈 | 225.用队列实现栈

题目https://leetcode.cn/problems/implement-stack-using-queues/description/思路 两个队列 利用两个队列倒腾数据,保证一个队列始终为空,用来暂存除"栈顶"外的所有元素。每次push总是往非空队列里加(保证一个队列为空&#xff0…...

跨越云端:在本地浏览器中无缝可视化Linux服务器上的TensorBoard日志

1. 为什么需要远程可视化TensorBoard日志? 作为深度学习工程师,我们经常遇到这样的场景:模型训练在远程Linux服务器上进行,生成了大量TensorBoard日志文件。这些日志包含了训练过程中的关键指标、损失曲线、参数分布等重要信息。传…...

BG3ModManager Pak文件加载异常的深度修复指南

BG3ModManager Pak文件加载异常的深度修复指南 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 三步定位异常表现 当用户点击"导入模组"按…...

BigDL-2.x Chronos时间序列分析:AutoML驱动的预测模型构建

BigDL-2.x Chronos时间序列分析:AutoML驱动的预测模型构建 【免费下载链接】BigDL-2.x BigDL: Distributed TensorFlow, Keras and PyTorch on Apache Spark/Flink & Ray 项目地址: https://gitcode.com/gh_mirrors/bi/BigDL-2.x BigDL-2.x是一个分布式深…...

[Python3高阶编程] - 阅读 Gunicorn 源代码前的准备工作

1. Gunicorn 官方代码仓库 Gunicorn 的官方 Git 仓库托管在 GitHub 上: GitHub 地址: https://github.com/benoitc/gunicorn 克隆代码: # 克隆主仓库 git clone https://github.com/benoitc/gunicorn.git# 或者使用 SSH git clone gitgithub.com:benoitc/gunico…...

[Python3高阶编程] - Gunicorn 介绍与使用指南

Gunicorn 是什么Gunicorn(Green Unicorn)是一个 Python WSGI HTTP 服务器,用于运行 Python Web 应用。它是生产环境中最流行的 Python 应用服务器之一,特点是简单、轻量、高性能。客户端 → Gunicorn(处理 HTTP、管理 …...

重构魔兽争霸III地图编辑:HiveWE的技术革新与性能突破

重构魔兽争霸III地图编辑:HiveWE的技术革新与性能突破 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 行业痛点:传统地图编辑器的技术瓶颈 魔兽争霸III地图创作者长期受限于原版编辑…...

利用快马平台快速原型:五分钟构建你的第一个multisim风格电路仿真器

最近在尝试电路设计时,发现从构思到实际验证往往需要花费大量时间搭建仿真环境。传统方式需要安装专业软件、配置参数,整个过程相当繁琐。直到尝试了InsCode(快马)平台,发现它特别适合用来做电路设计的快速原型验证。下面分享如何用五分钟构建…...

LiuJuan Z-Image Generator完整指南:宽松加载strict=False适配非标权重

LiuJuan Z-Image Generator完整指南:宽松加载strictFalse适配非标权重 1. 引言:当定制权重遇上标准模型 你有没有遇到过这种情况?好不容易找到一个效果惊艳的定制版模型权重,兴冲冲地下载下来,结果在加载时却报了一堆…...

PINCache与App Extension:在扩展中安全使用缓存的完整方案

PINCache与App Extension:在扩展中安全使用缓存的完整方案 【免费下载链接】PINCache Fast, non-deadlocking parallel object cache for iOS, tvOS and OS X 项目地址: https://gitcode.com/gh_mirrors/pi/PINCache PINCache作为一款为iOS、tvOS和OS X打造的…...