Docker 学习笔记一为什么需要镜像、容器和仓库我以前对 Docker 的理解很简单Docker 好像就是一个“装环境”的工具。看完 Docker 入门视频之后我发现这个理解不算错但太粗糙了。Docker 真正解决的问题不是“怎么安装 Node、MongoDB、Nginx”而是如何把一个应用运行所需的环境打包成一份可复制、可分发、可复现的东西。这篇文章先不急着堆命令先把几个最容易混在一起的概念讲清楚镜像、容器、Docker Hub、镜像仓库。1. 问题从哪里来假设我有一个后端项目依赖这些东西Node.jsMongoDBpnpm / npm一堆环境变量指定端口指定启动命令在我自己的电脑上这些东西都配好了所以项目可以跑。但是换一台电脑就可能出现这些问题node:commandnot found mongo:commandnot found 端口被占用 环境变量没配置 版本不一致 依赖安装失败这就是经典的在我电脑上明明是好的。Docker 的价值就是把“我的电脑环境”变成一个可以复制的运行单元。2. 镜像可以理解成“应用运行环境的快照”镜像英文叫 Image。它不是正在运行的程序而是一份静态模板。你可以把它理解成镜像 操作系统基础层 语言运行时 项目代码 依赖 默认启动命令比如dockerpull nginx:alpine这条命令做的事情是从远程镜像仓库下载一个nginx:alpine镜像到本地。这个镜像里面已经包含了 Nginx 运行所需的环境。但是注意镜像本身不会运行它只是一个模板。真正跑起来的是容器。3. 容器由镜像创建出来的运行实例容器英文叫 Container。如果镜像是“类”容器就是“对象”。如果镜像是“安装包”容器就是“运行中的应用”。比如dockerrun-d--namemy-nginx-p8080:80 nginx:alpine这条命令的意思是使用nginx:alpine镜像创建并启动一个容器容器名字叫my-nginx后台运行把宿主机的8080端口映射到容器的80端口运行后访问http://localhost:8080就能看到 Nginx 页面。这个时候本机并没有真的安装一个传统意义上的 Nginx而是 Docker 在容器里帮我们运行了它。4. 镜像和容器的关系最容易混淆的是这句话镜像不是容器容器也不是镜像。它们的关系可以这样看Dockerfile --build-- 镜像 --run-- 容器或者菜谱 --做菜-- 菜品模板 --端上桌-- 一份真正的菜 Dockerfile --构建-- 镜像 --运行-- 容器你可以用同一个镜像创建多个容器dockerrun-d--namenginx-1-p8081:80 nginx:alpinedockerrun-d--namenginx-2-p8082:80 nginx:alpinedockerrun-d--namenginx-3-p8083:80 nginx:alpine这三个容器都来自同一个镜像但它们是三个独立的运行实例。5. Docker Hub公共镜像仓库我们平时执行dockerpull mongo:7Docker 默认会去 Docker Hub 找mongo:7这个镜像。你可以把 Docker Hub 理解成 Docker 世界里的 npmnpm registry 存 npm 包 Docker Hub 存 Docker 镜像常见镜像dockerpull nginx:alpinedockerpull mongo:7dockerpull redis:7dockerpull node:22-alpine这些镜像别人已经做好了我们可以直接使用。6. 镜像仓库不一定只有 Docker HubDocker Hub 是最常见的公共仓库但不是唯一选择。实际公司里还可能使用Docker Hub 私有仓库阿里云容器镜像服务腾讯云镜像仓库华为云 SWRHarbor 私有仓库公司内网自建镜像仓库也就是说镜像仓库只是一个概念它负责保存、分发镜像。Docker Hub 是其中一种实现。7. 为什么公司内网经常拉不到镜像如果公司网络不能直接访问 Docker Hub就会出现类似failed to resolve referencedocker.io/library/mongo:7failed to fetch oauth token connecttimeout本质原因不是 Docker 命令错了而是Docker 客户端需要访问远程镜像仓库但公司内网不允许或者代理没有配置好。解决方式通常有几种配置 Docker 代理。使用公司内网镜像仓库。在外网机器提前docker pull再docker save导出成 tar 包拷贝到内网机器docker load。由公司统一维护基础镜像。比如离线导出# 外网电脑dockerpull mongo:7dockersave-omongo-7.tar mongo:7# 内网电脑dockerload-imongo-7.tar这个思路非常适合不能直接访问 Docker Hub 的环境。8. 一张图理解 Docker 的主线编写 Dockerfile │ ▼ docker build │ ▼ 生成镜像 image │ ┌───────┴────────┐ ▼ ▼ docker run docker push │ │ ▼ ▼ 启动容器 上传镜像仓库 │ ▼ 其他机器 docker pull │ ▼ docker run这就是 Docker 的核心闭环写 Dockerfile → 构建镜像 → 运行容器 → 推送仓库 → 其他机器拉取运行。9. 第一篇小结这篇文章只讲心智模型。几个概念可以这样记概念作用类比Dockerfile描述如何构建镜像菜谱镜像 Image静态运行环境模板安装包 / 模板容器 Container镜像运行后的实例正在运行的程序Docker Hub公共镜像仓库npm registry私有镜像仓库公司内部镜像分发中心公司私有 npm 源下一篇开始进入命令docker run后面那些-p、-v、-e、--name、-d到底都在控制什么。参考资料Docker Docs: https://docs.docker.com/Docker Hub quickstart: https://docs.docker.com/docker-hub/quickstart/Build and push your first image: https://docs.docker.com/get-started/introduction/build-and-push-first-image/