前置知识阅读建议
▶点击回顾 第 2 章 Docker入门
▶点击回顾 2.1 设置Docker环境
Docker 是什么?它为什么对开发者这么有用?
Docker 是开发者的“秘密武器”:它能把应用打包、分享、部署都变得又快又稳。
对初学者来说,Docker 也特别友好——你不用管环境配置那一堆头疼的事,就能学会怎么上线一个应用。
只要你掌握了 Docker 的整个工作流程:从镜像(image)、容器(container),到网络(network)、存储(storage)、再到多容器管理(比如 Docker Compose),你就能把开发流程简化到极致。
我们下面就一块来拆解这些概念,循序渐进地吃透 Docker。
本节将会介绍
-
Docker 工作流程简介
-
Docker 镜像的生命周期
-
Docker 容器的生命周期
-
Docker 的网络与存储
-
用 Docker Compose 管理多容器应用
Docker 工作流程简介(Docker Workflow)
Docker 给开发者带来的是一种“稳定如一”的开发体验。
你写的应用,无论跑在谁的电脑上、哪个服务器上,它表现都一样。
这张图展示了 Docker 镜像生命周期。 Docker 镜像:是创建 Docker 容器的蓝图或模板 。
docker hub 镜像仓库:是 Docker 官方的镜像存储中心。用户可以进行登录 / 注销操作。
操作流程
- 拉取:从 docker hub 镜像仓库将镜像(带有标签)拉取到本地系统。
- 推送:本地系统中创建或修改后的镜像可以推送到 docker hub 镜像仓库。
- 本地操作:在本地系统中,可基于从Docker Hub镜像仓库拉取下来的 Docker 文件进行修改;还能列出已有的镜像;此外,不再需要的镜像可以进行删除操作。
几个关键概念你得先知道:
-
镜像和镜像仓库(Image & Image Registry):镜像就像是建房子的“蓝图”,你可以从 Docker Hub(镜像仓库)里找到各种现成的蓝图,比如 Python、Node.js、MySQL 等等,拿来就用。
-
容器(Container):容器就是用这些蓝图造出来的“房子”,应用就运行在这些房子里。它们轻巧、隔离、打包即走。
-
网络和存储(Network & Storage):容器之间可以通过网络互相“聊天”,而存储让数据不会因为容器的停止或销毁而丢失。
-
Docker Compose:如果一个应用是由多个部分组成的,比如前端 + 后端 + 数据库,Docker Compose 就能让你“一键同时管理”这些容器,非常高效。
从 Docker Hub 使用镜像
Docker Hub 就像是“应用蓝图市场”。
举个例子:你需要一个 Python 环境?直接 pull
一个官方 Python 镜像下来,完全不用自己从零搭建。
这种方式不仅省时间,而且这些镜像一般都是由社区或官方维护的,安全又可靠。
清理镜像
长时间开发下来,你会发现镜像堆成山,特别是反复尝试新东西的时候。这些没用的旧镜像会占用你大量磁盘空间,电脑也跟着卡。
Docker 提供了很方便的命令来查看当前有哪些镜像,并删掉不需要的,保持系统干净轻快。
自己动手做镜像(Build Custom Docker Image)
有时候,你的应用有自己的依赖、配置,这时候你就得写一个 Dockerfile
,告诉 Docker 怎么做出你想要的镜像。
就像写菜谱一样:用哪个系统基础?需要装哪些库?代码在哪个路径?写清楚了,Docker 就能帮你一键生成镜像。
分享镜像
你做好的镜像,不止自己能用,还可以上传到 Docker Hub(或者私有仓库)分享给别人用。
比如你的同事可以直接 pull
你的镜像下来,运行后环境就一模一样,不用重复配置,团队协作效率大大提升。
Docker 容器生命周期(Container Lifecycle)
容器是运行中的“镜像副本”,是你的应用真正“活起来”的地方。
了解容器的生命周期(从启动、暂停、重启、到销毁),能帮你把 Docker 用得得心应手。
创建和运行容器
启动容器就是“点火启动你的应用”。你可以通过命令设定端口、配置文件、环境变量等。容器响应快、启动速度快,很适合开发调试,也适合线上部署。
暂停、停止与重启容器
开发中你可能需要临时停一下容器,比如调试某个服务的时候。
Docker 允许你暂停(pause)、停止(stop)容器,但不会删掉它,等你准备好了再 start
一下,应用就“满血复活”。
容器扩容和管理
如果你的应用要应对大流量,最简单的办法就是“多跑几个容器”。你可以同时启动多个容器副本,提高吞吐能力。
像 Docker Compose 或 Kubernetes 这类工具,就特别适合帮你管理一大堆容器,让它们协作有序、互不打架。
删除容器
一个容器用完后,别忘了删掉它。旧容器如果不清理,时间一久会拖慢整个系统的运行速度。
Docker 的网络和存储(Network & Storage)
要让容器之间能沟通,还要保证数据不会轻易丢失,这就要靠 Docker 的网络和存储功能。
容器网络管理
容器之间要“互相通话”,就得连在同一个网络上。
比如你一个 Web 应用容器要访问一个数据库容器,它们之间就得有网络连接。
你可以用 Docker 自带的 bridge
网络,也可以根据需要自定义网络,控制更细。
在这个Docker 网络中,运行着不同的应用,比如图中的 Flask 应用和 Nginx 应用 。不同应用的容器能通过 Docker 网络进行通信。
以 Nginx 应用为例,展示了端口映射机制。
docker run -p 8080:80 nginx
这条命令,是将本地主机的 8080 端口映射到 Nginx 容器内部的 80 端口 。这样通过访问http://localhost:8080
,就能访问到容器内 Nginx 应用提供的服务。
容器数据持久化(Docker Storage)
默认情况下,容器一停止,里面的数据就没了。但你不可能每次都重新上传文件、重建数据库吧?
这时候你可以用 Docker 提供的“卷(volume)”或“绑定挂载(bind mount)”,让数据存在宿主机上,就算容器删了也不受影响。
对于数据库、用户上传文件等关键数据来说,这一步必不可少。
Volume(卷): Docker 容器借助 Volume 这种机制来管理和存储数据,并且这个过程由 Docker 引擎进行协调和控制。Volume 是 Docker 管理的一种数据存储机制,独立于容器的生命周期。容器可能会被创建、删除、重启,但 Volume 中的数据不会随之消失,把数据库文件存储在 Volume 里,即便容器被销毁重建,新容器仍能从 Volume 中读取原有数据,保证业务连续性。
绑定挂载:容器还能通过绑定挂载的方式,将数据存储到主机文件系统上。这种方式直接把主机的目录或文件挂载到容器内,实现数据的持久化存储 。
当容器被移除时,无论是通过 Volume 存储在 Docker 引擎中的数据,还是通过绑定挂载存储在主机文件系统中的数据,都能保留下来,不会随着容器的删除而丢失,保证了数据的持久性。
多容器管理:Docker Compose
一个稍复杂点的应用往往不只一个容器,比如:
-
Web 前端容器
-
后端服务容器
-
数据库容器
-
缓存容器...
手动一个个跑起来,不仅麻烦还容易出错。Docker Compose 就是为此而生的。
依据
docker - compose.yml
文件的配置,通过执行 Docker Compose 命令(如docker-compose up
),编排多个容器,实现一键式启动、管理多个相关联的容器服务,简化多容器应用的部署和管理流程。
为什么需要管理多个容器?
把应用拆成多个容器的好处是:职责清晰、维护简单。但如果你手动一个个启动这些容器,很快就会崩溃——太累了。
Docker Compose 让你“一键启动 / 停止”整个应用系统,用一个 docker-compose.yml
文件定义清楚每个容器的职责、镜像、端口等信息,谁跟谁通信,统统安排好。
总结:Docker 工作流程 FAQ
-
Q: Docker 是啥?为啥开发者都在用?
A: 它能帮你把应用打包、部署、分享都做到“一次搞定,到处运行”,再也不用为环境问题头大。 -
Q: Docker 镜像有什么用?
A: 镜像是应用的蓝图,可以从 Docker Hub 下载,也可以自己定制。拿来即用,快速又稳定。 -
Q: 镜像和容器有啥区别?
A: 镜像是静态的“蓝图”,容器是运行中的“房子”。容器用镜像建出来,里面运行着你的程序。 -
Q: 网络和存储在 Docker 里是干啥的?
A: 网络让容器能互相通讯,存储让数据不会因为容器停掉就丢了。 -
Q: Docker Compose 有什么好处?
A: 它能帮你同时管理多个容器,配置一次,用一条命令就能把整个应用“打包上线”,简单又高效。