最近工作过程中被领导指出不清楚拉取和推的区别,求助度娘的过程中发现暂时没有准确的梳理,故整理完结果匆匆赶来更新一篇博客。
但本人未从事开发行业,本文内容也属于整理,如有存在不足请各位师傅及时指出。
什么是 Docker?
简单来说,Docker 是一个开源的应用容器引擎,它能让开发者把应用程序和其依赖的各种库、配置等打包到一个可移植的容器中。这个容器就像一个独立的 “小箱子”,里面包含了应用运行所需的全部环境,不管把它放到什么操作系统(比如 Windows、Linux、macOS)上,只要安装了 Docker,这个应用都能以相同的方式运行。
举个生活中的例子,就像外卖送餐。
餐品(应用程序)做好后,会被放在外卖盒(容器)里,里面可能还会有餐具、调料(依赖环境),不管是骑电动车、自行车还是步行(不同运行环境),这个外卖盒里的餐品都能保持原样送到用户手中。
Docker 解决的就是传统开发中 “在我电脑上能运行,到你那怎么就不行了” 的环境一致性问题,大大简化了应用的部署、迁移和扩展流程。
Docker Image(Docker 镜像)
可以把它看作是一个包含了应用程序、运行环境、配置文件等所有东西的 “模板”,是静态的。
比如你开发了一个简单的网页应用,包含 HTML 文件、CSS 样式和 JavaScript 脚本,还有运行它需要的 Nginx 服务器环境,把这些打包在一起形成的文件就是一个 Docker 镜像。
专业来讲,它是由一系列层(layers)组成的只读模板,这些层叠加起来构成了运行应用所需的完整文件系统。
Docker Hub
这是一个公共的 “镜像仓库”,就像大家共用的一个大仓库,里面存放着各种各样的 Docker 镜像,供大家下载使用。
比如你想搭建一个 MySQL 数据库服务,不用自己从头制作镜像,直接去 Docker Hub 上搜索 “mysql”,就能找到官方或其他开发者上传的 MySQL 镜像。
它是 Docker 官方提供的最大的公共镜像 registry(注册中心),方便开发者分享和获取镜像。
Push(推送)与 Pull(拉取)
Push(推送):当你制作好了一个自己的 Docker 镜像,想把它存到 Docker Hub 上,方便自己在其他地方使用或者分享给别人,这个上传的过程就叫 push。比如你刚才制作的那个网页应用镜像,通过命令 “docker push 你的用户名 / 镜像名:版本号”,就能把它推送到你在 Docker Hub 的账户下。
Pull(拉取):和 push 相反,从 Docker Hub 或者其他镜像仓库把别人的镜像下载到自己电脑上的过程就是 pull。比如你在另一台电脑上想运行之前那个网页应用,就可以用命令 “docker pull 你的用户名 / 镜像名:版本号” 把镜像拉取下来。
操作 | 数据流向 | 核心作用 | 关键前提 |
---|---|---|---|
pull | 远程 → 本地 | 获取镜像,用于本地运行容器 | 远程有镜像,有读取权限 |
push | 本地 → 远程 | 上传镜像,用于共享或备份 | 本地有镜像,有写入权限 |
pull 常用于:
- 初始化环境:新机器部署时,拉取基础镜像(如 Nginx、Python)。
- 更新镜像:获取镜像的最新版本(如
docker pull ubuntu:latest
)。 - 使用他人镜像:直接拉取开源社区或团队共享的镜像,无需重复构建。
push 常用于:
- 共享镜像:将自己开发的应用镜像推送到团队私有仓库,供同事使用。
- 部署联动:CI/CD 流程中,构建好的镜像推送到仓库后,服务器自动拉取并部署。
- 备份镜像:将重要镜像上传到远程仓库,避免本地丢失。
Docker Container(Docker 容器)
它是从 Docker 镜像创建出来的运行实例,就像用模板做出的具体产品,是动态的。
比如基于你那个网页应用镜像启动一个容器,这个容器就会运行起你的网页应用,你可以通过浏览器访问。容器可以被启动、停止、删除等操作,而且它和宿主机(运行 Docker 的电脑)以及其他容器相互隔离,保证了应用运行环境的一致性。
实例演示
你想在电脑上运行一个 WordPress 博客系统。
首先,你可以去 Docker Hub 上 pull 官方的 WordPress 镜像和 MySQL 镜像(因为 WordPress 需要数据库支持)。然后,基于 MySQL 镜像创建一个容器,配置好数据库;再基于 WordPress 镜像创建一个容器,并连接到 MySQL 容器。
这样,你的 WordPress 博客系统就通过 Docker 容器运行起来了。
如果后续你对 WordPress 的配置做了修改,想保存下来,就可以把这个运行中的容器打包成一个新的 Docker 镜像,然后 push 到 Docker Hub 上,方便以后在其他地方使用这个修改后的镜像来创建容器。
如有不准确请各位师傅及时指出!感恩!