2026年Docker入门指南
Docker彻底改变了软件开发的方式,让环境变得可携带、可复现、可扩展。到2026年,Docker已经成为每个开发者工具箱里不可或缺的利器——据云原生计算基金会(CNCF)的年度调查,89%的组织已经在用它。这篇指南从容器基础一直讲到生产部署,帮你一次性搞清楚。
Docker不是虚拟机,也不是魔法
初学者通常把Docker想象成一个更轻的虚拟机。它不是。抱着这个误解,每次应用在容器内外行为不一样时,调试都会让你一头雾水。Docker把你的应用连同依赖打包成一个轻量、隔离的运行时,它共享宿主机的内核,所以容器几秒就能启动,单位资源下用的内存远少于一整台操作系统。一旦这点通了,剩下的就是词汇问题:镜像(image)、容器(container)、卷(volume)、网络(network)、仓库(registry)。这篇指南先把心智模型建立起来,再带你跑完一个能用的项目,让理论锤进肌肉记忆。

先从心智模型开始:镜像 vs 容器
镜像是只读模板——代码、运行时、库和配置的"快照"。容器是该镜像的一个运行实例,带有自己的可写层。把镜像想成一份存好的菜谱,把容器想成正在烧的一道菜;一道菜谱能做很多道菜,每个容器彼此隔离。这个区别解释了大半的初学者困惑:你在容器里改了文件,镜像毫发无损;容器一旦销毁,这些改动就消失了,除非它们存在一个具名的卷(named volume)上。

为什么容器成了交付软件的主流方式
容器通过"把环境做成构件的一部分"解决了"在我机器上能跑"的问题。因为镜像自带运行时,同一个镜像是在笔记本、CI运行器还是生产服务器上跑出来都一样。正是这种普适性,让编排大量容器的Kubernetes在部署环节占据主导,也让岗位JD越来越把容器素养当作底层要求。Docker和编排搭配起来的更深层生态,本站的云原生与DevOps课程讲得详细。

你的第一个Dockerfile,逐行拆解
别再复制你看不懂的Dockerfile了。这是一个最小且正确的Node Web应用版本:

- FROM node:20-alpine——基础镜像(基于Alpine Linux的轻量Node 20镜像)。
- WORKDIR /app——设置容器内的工作目录。
- COPY package*.json ./——先复制依赖清单,让Docker能缓存它们。
- RUN npm install——安装依赖。
- COPY . .——复制其余源码。
- EXPOSE 3000——声明应用监听的端口。
- CMD ["npm","start"]——容器启动时运行的命令。
按层构建很重要:Docker会缓存每一层,所以在复制源码之前放`npm install`,意味着只有`package.json`变了依赖才会重装——大幅加快重新构建。如果你对编码这头还比较新,底层脚本和Web概念的速成在Python自动化脚本里能补上。
Docker Compose:一条命令跑起整套环境
单容器应用很少能满足真实需要。Docker Compose让你在一个`docker-compose.yml`文件里定义整套技术栈——应用、数据库、缓存——然后用`docker compose up`一次性全部启动。一个典型的开发栈会把你Web服务和Postgres容器配对,再用一个具名卷让数据库数据在容器重启后存活。你需要抓住的三件事是:服务(services,即容器)、网络(networks,它们怎么互相通信)和卷(volumes,持久化数据)。一旦你编排出一个双服务栈,本地开发就不再是玄学了——想为这个环节提速,可以看看本站的每天15分钟学编程。

卷、端口和环境变量——三个开关
有三个概念几乎造成了所有初学者bug。第一,卷:具名卷能在容器重启之间持久化数据;没有它们,容器一挂你的数据库就全忘了。第二,端口映射:`-p 3000:3000`把宿主机端口映射到容器端口,这样你才能从浏览器访问应用;忘了映射,容器虽然跑着但根本够不着。第三,环境变量:数据库密码这类敏感配置应该来自变量,而不是硬编码值——把硬编码密钥打进镜像,等于把凭据发给了任何能拉这个镜像的人。理解了这点,再去看生产环境里怎么把配置和数据库设计原则结合,会更顺手。
出问题时怎么调试容器
掌握下面三条命令,大多数问题自己就解决了。`docker logs <容器>`显示应用输出——容器一启动立刻退出时第一个该查的就是它。`docker exec -it <容器> sh`在运行中的容器里开一个shell,便于你检查文件和进程。`docker inspect`输出完整的配置和挂载细节。一个常见陷阱:容器创建了但立刻退出,因为应用启动时崩了——日志几乎立刻就能让你看清,所以别瞎猜。
要避免的反模式:把容器当成宠物
容器应该是短暂易逝的——创建、运行、扔掉、重建。如果你发现自己为了手动修复而SSH进容器里,你制造的是一个"宠物"而不是"牲口"。正确的修法是改镜像并重建,把持久状态只放在卷或外部数据库上。这种纪律正是容器能如此适配管道和集群的原因,也是招聘负责人看初级员工时最看重的习惯。
在哪里练手和跑容器:平台对比
| 平台 / 工具 | 核心功能 | 价格(参考) |
|---|---|---|
| Docker Desktop | 本地构建镜像、Compose、单节点Kubernetes、扩展 | 个人/小企业免费;Pro/Team 约 ¥35–¥65/人/月 |
| Docker Hub | 公/私镜像仓库、自动构建、组织命名空间 | 公共仓库免费;私有库免费1个,付费 ¥35/月起 |
| 谷歌云运行(Google Cloud Run) | 无服务器容器、缩到零、按请求计费 | 免费层每月200万请求;超出约 ¥2.9/百万 |
| Play with Docker | 浏览器沙盒,不用装任何东西就能学Docker | 免费,按会话;会话约4小时后结束 |
| 亚马逊 ECS | 托管容器编排,含Fargate无服务器选项 | 免费层:Fargate每月500 GB-小时;超出按请求计费 |
| Podman | 无守护进程、无root的容器引擎,可无缝替代Docker CLI | 免费开源 |
学习阶段,Docker Desktop的免费层加Docker Hub就足够,也是标配。想在不自己管理服务器的情况下试着托管,谷歌云运行的免费额度、亚马逊ECS Fargate的免费层能让你在近乎零成本的生产级条件下练部署。Podman是一个免费的、无守护进程的替代品,值得了解——因为有些组织就是为了避开Docker守护进程而用它。
一个20分钟的项目把一切串起来
构建一个带计数器、把数据存在数据库里的简单Web应用。用Dockerfile把应用容器化、加上Postgres、用Compose把它们接起来、挂载一个具名卷,并确认计数器在`docker compose down`和`docker compose up`之后仍然存活。当数据持久了、应用能在映射的端口上被访问到,你就在这一个项目里证明了一切的核心理念。这个项目——现在放在你的GitHub上——给你的是真实、可展示的技能,而不是一张课程证书。想补齐学习边角:如果你推理扩展和负载时觉得统计是短板,本站的JavaScript入门课程和Python新手入门是实用的助力。
常见问题
Docker和虚拟机有什么区别?
虚拟机虚拟化的是硬件并运行一整个客户操作系统,内存开销大、启动慢。Docker容器共享宿主内核、只虚拟化应用层,所以几秒启动、内存只用一小部分。代价是容器隔离性不如虚拟机,必须跑在兼容的宿主内核上。
用Docker免费吗?
个人和小企业使用免费。Docker Desktop对个人和员工少于250人、营收低于1000万美元的小公司免费,更大规模或企业用则有Pro和Team档。Docker Hub也提供免费公共仓库。Podman等许多替代品则完全免费、开源。
学了Docker还必须学Kubernetes吗?
起步不用。先把Docker玩熟——镜像、容器、卷、网络、Compose。Kubernetes是在这些地基之上大规模编排容器的,底层扎实了,你会理解得透彻得多。最好把它当作第二阶段,而不是第一课。
为什么我的容器一启动就立刻退出?
最常见的元凶是主进程崩溃,或容器跑了一条瞬间就结束的命令。用`docker logs <容器>`看应用报错,并确认`CMD`跑的是一个长驻进程而不是一次性脚本。如果应用在容器里缺端口或数据库,那也常常是底层的崩溃原因。
容器被删掉后文件去哪了?
写在容器可写层里的文件会随容器删除而销毁。要保留数据,就用具名卷或绑定挂载,并从容器文件系统路径引用它。这就是为什么容器里的数据库几乎总是用卷——否则每次重启都会清空数据。