共 13 节,按顺序
- 120 分钟
什么是 Docker
你在自己电脑上做出了一个东西,跑得好好的。你把它发给队友,或者放到服务器上,它就坏了。操作系统不一样,某个库的版本不一样,某个文件待的文件夹不一样。这是软件行业最老的头疼事之一,而 Docker 生下来要解决的正是这个问题。读完这一课,你会知道 Docker...
Containers vs VMsImagesContainersDocker daemonDocker CLI - 225 分钟
你的第一个容器 (container)
在理论上你已经知道,镜像是一个封好的包裹,而容器是你真正把它打开之后发生的事情。理论能带你走的距离有限。这一课里,你要往上一课那座共享的房子里领进真正的客人:你会启动、列出、停止和删除真实的容器。这里的操作不会留下任何永久的东西,所以没什么需要小心的。尽管折腾,弄坏也没关系。
Docker runHello-worldInteractive shellDocker psDocker stopDocker rm - 330 分钟
镜像 (image) 与 Dockerfile
到目前为止,你打开的都是别人封好的袋子:hello-world、ubuntu、alpine。拿来探索没什么问题,但这解决不了第一课一开始就提出的那个问题:让你自己的程序在每台机器上都以相同的方式运行。要做到这一点,你得自己封一个袋子。这一课教你写 Dockerfile,一个纯文本文件,里面写着...
FROMRUNCMDDocker buildDocker imagesDocker rmi - 435 分钟
构建自定义镜像 (image)
上一课那个 Dockerfile 从头到尾只做了一件事:装软件。它没有把你自己的任何文件带进镜像,也没有控制过它的命令究竟在镜像里的哪个位置执行。真正的应用程序两样都需要:把源代码复制进去,再有一个合适的工作目录。这一课来补上这两块空缺,顺带解释为什么指令的书写顺序不只是个人风格问题,它直接影响以后...
COPYWORKDIRENVEXPOSELayer caching.dockerignore - 530 分钟
容器 (container) 网络
你在一个容器里跑起过一个 web 服务器,看着它报告自己正监听 80 端口,然后在浏览器里打开 http://localhost:80,结果什么都没有。容器没问题,服务器也没问题。什么都没坏,而这背后的原因值得真正弄明白,而不是死记一个参数了事。
Published ports-p host:containerUser-defined networksContainer DNSDocker network - 630 分钟
卷 (volume) 与持久化
在容器里跑一个数据库,插进去几行数据,把容器删掉,再启动起来,那几行数据就没了。不是损坏,也不是藏起来了,是没了,就好像你从来没敲过一样。人人都会被这件事绊倒一次,而解决办法并不是打开某个开关。它是容器存储的构造方式必然带来的结果,只要你脑子里能浮现出那幅图,这一课剩下的内容就都顺理成章了。
Bind mountsNamed volumesContainer writable layerDocker volumeWhere data lives - 735 分钟
Docker Compose
到现在为止,启动一个像样的应用要敲四条命令,而且没有一条是短的。创建网络。创建卷。带上环境变量、卷和网络启动数据库。带上网络和对外发布的端口启动 web 服务器,还必须按这个顺序,因为数据库得先在。
Compose.yamlServicesDepends_onPort mappingDocker compose up/downNamed volumes in compose - 835 分钟
多阶段构建 (multi-stage builds)
用最直白的方式给一个编译型程序构建容器镜像,你会得到一个吓人的结果:一个 900 兆字节的镜像,里面真正有用的内容是一个 8 兆字节的文件。剩下的全是编译器、装编译器用的包管理器、头文件、中间产生的目标文件,还有模块缓存。这些东西没有一样会在生产环境里跑起来,可它们每一次都会被下载到每一台运行你应用...
Build stageRuntime stage--from=builderSlim final imagesAS aliasing - 925 分钟
环境变量与密钥
镜像在你自己的笔记本电脑上跑得很好。现在它要在预发布环境里连另一个数据库,在生产环境里再连第三个,而生产库的密码绝不能被任何拉得到这个镜像的人读出来。为此构建三个镜像显然是错的:它们之间只差几个字符串,而容器的全部价值就在于,你测过的那个制品正是你上线的那个制品。
ENV in Dockerfile-e at runEnv_file in composeWhy not to bake secretsDocker secrets brief mention - 1025 分钟
健康检查 (healthcheck) 与重启策略
栈已经起来了。docker ps 说所有东西都在运行,可站点返回的全是错误。你一路查下去,发现 API 比数据库先启动,第一次连接就失败了,从那以后一直在返回 500,而这个进程从技术上说还活着,所以从技术上说一切正常。
HEALTHCHECK directive--restart=unless-stoppedDocker inspect healthCompose healthcheck - 1130 分钟
镜像 (image) 优化与安全
几乎没有哪起跟 Docker 有关的生产事故真的是 Docker 本身的缺陷。反复出现的情形要平淡得多:两年前用 node:latest 构建出来的一个镜像,以 root 身份运行,体积 900MB,带着某个谁也没再更新过的发行版里全部已知漏洞,只因为它在构建那天跑得起来,而此后也没人说过它不行。
Small bases like alpine and distrolessUSER non-rootPinning versionsDocker scoutTrivyMulti-arch idea - 1225 分钟
注册表 (registry) 与发布
到目前为止你构建的每一个镜像都只存在于一个地方: 本机上的 Docker 守护进程里。只要运行它的人只有你,这没什么问题,而这也恰好是"在我机器上明明是好的"变成真麻烦的那个点,因为别人的机器根本没办法拿到它。同事跑不了你的镜像,服务器跑不了,CI 作业也跑不了。
Docker tagDocker loginDocker pushDocker HubGHCRPrivate registries - 1350 分钟
综合实战:部署完整技术栈
到目前为止,每一课都只讲一件事,验证的对象也都是一个只会打印一行字符串的容器。学一条指令本该这么学,但这样做会把真正难的部分藏起来: 真实的应用程序是好几个容器,它们得互相找到对方、按正确的顺序启动、把数据保住,最后还要落在另一台机器也能访问到的地方。
Multi-stage DockerfileCompose.yaml with two servicesHealthcheck and restart policyTag and pushRun elsewhere
用你的语言学习 Docker
每一节课、测验和导师回复都以你的语言显示。AI 导师会用你提问的语言来回答。
Roles that use Docker
See how hiring teams interview engineers on Docker, in production-like environments.
DevOps Engineer
Hire DevOps engineers who actually ship. Run live or take-home interviews in production-like Linux environments with Docker, Kubernetes, Terraform and CI/CD. See how they debug, automate, and work alongside AI.
See the interviewPlatform Engineer
Hire platform engineers who reduce friction for every team. Real golden-path templates, real internal CLIs, real service onboarding flows. We record every step.
See the interviewSite Reliability Engineer (SRE)
Hire SREs who actually run production. Live workspaces with metrics, logs, traces and a service that is starting to misbehave. We record every keystroke.
See the interview