尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Docker入门:用hello-world跑通容器启动全流程

发布时间:2026/9/29 16:44:29

资讯中心
01
ARTICLE

Docker入门:用hello-world跑通容器启动全流程

Docker入门:用hello-world跑通容器启动全流程
干这一行带新人多了我发现一个很有意思的现象几乎每个人第一次敲完docker run hello-world看到屏幕上蹦出那一段英文欢迎词都会觉得就这然后顺手关掉窗口觉得Docker不过如此。但如果你真的把那段欢迎词逐字读完你就会发现Docker官方其实已经把整个容器的启动流程原原本本地写在里面了。这也是为什么我始终坚持Docker的Hello World绝对值得认认真真跑一遍而不是当成一个不必要的仪式感。这篇文章不打算做任何抽象的理论铺垫就想解决一件事跑通你的第一个Docker容器并且把这背后一个容器到底是怎么被启动起来的完整链路用大白话讲明白。无论你是刚接触容器的后端工程师、正在折腾本地开发的测试还是单纯对容器感兴趣想把环境隔离玩明白的人这篇文章都够用。我会按我平时带人的节奏来写先讲设计思路再讲环境准备然后亲手跑一遍命令最后把启动流程和排错经验全部抖出来。1. 内容整体设计与思路拆解1.1 为什么是Hello World一个有预谋的最小镜像我见过不少初学者困惑学Docker为什么要跑一个看似没有任何功能的镜像这个问题的背后是对hello-world这个镜像价值的误解。hello-world镜像是Docker官方仓库里刻意做得极小的一个镜像整个镜像只有几KB里面就一段编译好的小可执行文件。它的用途就一个让容器能启动、打印一段标准输出、然后正常退出。但恰恰是这种极简设计把Docker的完整工作链路暴露在了你眼前——从命令行发起请求到镜像拉取到容器创建到进程启动到退出回收每一步都发生在眼前。更重要的是hello-world镜像不会因为你的误操作把环境搞坏也不会留下任何持久化数据想跑多少次就跑多少次。对于初学者来说这是零风险试错的最佳入口。我在带团队成员的时候永远是从这个镜像起步的哪怕他之前已经看过一堆PPT式的Docker课程我也会让他先把这条命令跑起来再谈别的。1.2 Docker到底解决了什么问题环境一致性的打包思维在动手之前你得先理解一个关键问题Docker容器本质上是什么我用一句大白话概括——容器就是一个被标准化的、隔离出来的进程运行环境。听起来很玄但你可以想象成打包好的运行环境套装你的代码、运行时、依赖库、配置文件全都被塞进一个镜像里哪里都能跑出同样的效果。很多人会把容器和虚拟机混为一谈但它们底层有本质区别。虚拟机虚拟的是硬件每个虚拟机里都有一套完整的操作系统启动一个虚拟机动不动就是几十秒、占几个G的内存。容器虚拟的是操作系统内核之上的运行环境它直接复用宿主机的内核只把自己需要的那部分用户空间文件打包进来所以启动一个容器通常是毫秒级、内存占用也只是进程级别的开销。打个比方虚拟机是一整套出租的毛坯房你要自己搬家具、装水电而容器是酒店式公寓拎包入住退房也不留垃圾。这就是容器镜像和容器实例之间打包即复用、运行即隔离的核心逻辑。1.3 方案选型为什么第一步要在本地桌面环境跑通我带新人的时候经常会遇到有人问能不能直接在服务器上装Docker操作我的建议永远是本地桌面环境先跑通再考虑远程服务器。原因很简单本地环境你能亲眼看到Docker Desktop的后台状态、日志面板和运行时的可视化信息一旦出问题排查路径短心理负担小。而在远程服务器上操作遇到命令行一致性问题、权限问题和网络问题叠加在一起新手很容易被劝退。所以这篇文章的实操部分我会以Docker Desktop作为主要参考环境同时兼顾Linux命令行环境的差异点。Docker Desktop的优势在于集成了Docker引擎、命令行工具、图形化管理面板和Kubernetes支持安装完就能用避免了在Windows或macOS上手工维护虚拟机、环境变量的麻烦。你要记住一个原则工具选型的核心不是功能最全而是让你最快跑通第一轮流程。2. 环境准备与安装验证2.1 安装Docker Desktop的关键选择与Windows/macOS注意点安装Docker Desktop前最容易被忽略的一件事是操作系统本身的基础环境。Windows平台十有八九需要提前启用WSL2Windows Subsystem for LinuxDocker Desktop默认基于WSL2后端运行这样性能比老一代的Hyper-V方案好得多。如果你在安装过程中遇到WSL 2 installation is incomplete之类的报错去PowerShell里手动执行wsl --update就行。macOS用户则要留意芯片架构Intel芯片和Apple SiliconM1/M2/M3的安装包不通用别下载错了。安装完成后Docker Desktop会自动启动一个小鲸鱼图标并尝试启动Docker Engine。第一次启动可能会提示需要授权、需要重启系统照做就行。整个过程往往需要几分钟这段时间很多新人会误以为卡死了其实它是在启动WSL2后端或者Hyper-V组件。你可以打开任务管理器看下进程如果看到dockerd在运行说明引擎已经拉起来了。2.2 安装后先别急着跑容器用两条命令验证环境健康很多人装完Docker第一件事就是跑去docker run hello-world结果报错一坨看不懂的英文白白打击了信心。我的习惯是装完先做两个基础检查把环境和命令分开验证docker version这条命令会分别打印客户端和服务端的信息。你要重点看Server部分的Engine段是否正常显示版本号。如果看到Cannot connect to the Docker daemon说明引擎没启动或者Docker Desktop没打开这时候先去桌面端把Docker启动起来再继续。然后再跑docker info这条命令会输出更多环境细节包括容器数量、镜像数量、运行时类型、根目录、存储驱动等。我一般只看两个指标Running状态是否为正常以及Registry Mirrors里是否配置了加速源。这两条命令跑完没问题你才算是真正拿到了进入容器世界的第一张门票。2.3 镜像加速配置提升拉取质量的必做操作在国内网络环境下拉取Docker官方镜像经常会遇到一个尴尬的场面下载进度条半天不动或者报dial tcp: lookup超时。这不一定是你网络断了更多是镜像源连接的延迟问题。比较常规的解法是在Docker Desktop的Settings → Docker Engine里配置registry mirrors把这个加速配置写进daemon的配置文件。{ registry-mirrors: [ https://docker.m.daocloud.io ] }配置完保存并重启Docker Desktop让配置生效。这里有个坑改配置文件之前一定要把原有配置里的内容复制出来保留不要在格式上破坏掉否则Docker Engine可能直接启动失败。配置加速这事我建议所有新手都做一遍因为哪怕你只玩Hello World也需要先拉一次镜像拉得快心情才会好。3. 实操过程运行第一个容器3.1 两种路线从“先拉取再运行”开始更稳妥现在正式进入实操。跑第一个容器有两条路线。第一条是分两步走docker pull hello-world docker run hello-world另一条是只敲一条命令docker run hello-world第二条看起来更简洁实际上docker run内部会自动帮你做没有镜像就先拉取这步操作。但为什么我建议新手先走第一条因为当你把pull和run分开执行时你能看清两个阶段各自的输出信息。pull阶段输出的是镜像分层的下载进度run阶段输出的才是容器真正运行后的业务日志。很多初学者混在一起看反而搞不清楚哪段信息是哪个环节产生的。把这两个过程的大脑肌肉记忆分开后面理解镜像是静态文件、容器是运行实例这个关键概念时会顺很多。3.2 逐句解读hello-world的欢迎消息它其实是一份启动流程说明书当你执行docker run hello-world屏幕上会打印一大段英文。我第一次跑的时候也没读全后来认真读完才发现官方早就用这段文字把容器启动流程讲透了。按顺序它讲了四件事Docker客户端连接到了守护进程守护进程从仓库拉取了hello-world镜像守护进程创建了一个新容器并运行了其中的可执行文件容器把输出传回客户端后退出。这段欢迎消息本质上就是你看到Hello from Docker字样的那一刻容器生命周期已经完整地走完了一圈。很多新手以为容器退出是出错了实际上对hello-world这个镜像来说正常退出并返回0状态码就是它的设计目标。这就像你执行echo hello一样执行完进程结束不代表命令失败而是它该干的事干完了。3.3 用docker ps -a验证容器确实存在过跑完hello-world后我要求每个人都必须执行一条命令docker ps -a大多数新手知道docker ps是查看运行中的容器结果跑完hello-world后再执行docker ps发现列表是空的立刻觉得我是不是搞坏了什么。其实docker ps默认只看正在运行的容器而hello-world容器运行完就退出了你得加上-a参数才能看到所有容器包括已退出的。docker ps -a的输出会让你看到一个状态为Exited (0)的容器记录后面的(0)就是退出码代表进程正常结束。这一步对建立容器也有生命周期的认知非常重要容器不是凭空消失的它会留下一条记录直到你用docker rm清理掉。所以记住这个小习惯以后凡是跑完容器想确认它的存在用docker ps -a而不是docker ps。3.4 查看镜像大小理解极简镜像的实际数据再执行一条命令加深印象docker images你会看到hello-world镜像的SIZE大概只有十几KB。这个数字对比一下你之后会拉取的ubuntu镜像几十MB或者nginx镜像一百多MB你就会明白什么叫刻意缩小镜像体积。这里也顺带引出一个重要的容器镜像概念镜像的体积和它的功能丰富度成正比。hello-world之所以只有几KB是因为它内部没有完整的Linux用户空间只有一段静态编译的可执行文件。而像ubuntu这种基础镜像包含了完整的包管理工具和标准库体积自然大得多。这个体量感是在图形化界面看镜像列表时很难体会到的真实上手敲一次docker images视觉冲击力比看文档强得多。4. 核心机制容器启动流程深度拆解4.1 一次docker run背后五个角色的协作链路helloworld跑通之后你可以把视角抬高一层这短短的几秒钟里Docker整个体系里的多个组件是怎么像流水线一样协作的。完整的调用链大致是Docker客户端CLI通过命令行的形式发起请求它和Docker守护进程dockerd之间通过REST API通信守护进程收到请求后检查本地是否存在对应镜像如果不存在就去镜像仓库拉取镜像拉下来之后守护进程把创建容器的任务交给containerd这个更底层的容器运行时管理器containerd再通过shim进程和runc这个OCIRuntime实际调用Linux内核接口完成命名空间、cgroups等隔离和资源限制的设置最终把镜像里的可执行程序跑起来。这套链路你可以形象地类比成在餐厅点外卖你CLI负责下单前台daemon负责接收订单后厨containerd负责准备食材厨师runc负责开火炒菜最后外卖员把菜送到你桌上。你需要的只是喊一声给我来一份hello-world但背后每一步缺一不可。理解这个链路排错时会非常有针对性拉取慢你怀疑网络和仓库启动失败你怀疑镜像和运行时而不是对着一个笼统的报错干瞪眼。4.2 镜像的只读层与容器的可写层一次完整的拷贝-运行逻辑HelloWorld跑通只是表象你得透过现象理解镜像与容器的差别。镜像是一个只读模板它可以被反复用来创建容器。当守护进程根据镜像启动容器时并不是把镜像里的文件全部复制一份给容器而是让容器运行在镜像之上并额外添加一层空白的可写层。容器运行过程中产生的文件修改都会写入这个可写层镜像本身始终保持原貌。这也是为什么同样一个镜像可以放心启动多个容器彼此之间互不干扰。用一个不恰当的但是很好懂的例子来说镜像就像一本印刷好的教材你可以拿它在笔记本上做题笔记本上的笔迹就是可写层。你写完一本笔记本不会影响教材本身的内容。下次你再拿这本教材做另一套题又是从头开始。容器删除的时候销毁的是那个可写层和运行环境镜像作为模板依然还在本地。4.3 容器生命周期与退出码理解运行完就退出是正常状态对新手来说容器生命周期是一个容易糊涂的概念。一个完整的容器生命周期通常包括Created已创建、Running运行中、Paused暂停、Exited已退出、Dead死亡等状态。hello-world容器经历的就是从Created到Running到Exited的快速旅程全程可能不到一秒。很多人会问容器退出后是不是就等于删除了不是的。退出后的容器只是进程终止了但容器的定义、元数据、日志、可写层都还保留着它还可以被docker start重新启动也可以被docker rm删除掉。我见过有人实验用docker start重新启动hello-world容器但发现它不会再次打印欢迎消息因为容器的启动命令已经执行完了重新启动只会让进程再次结束。这里顺便记住一个经验一个容器能不能反复干活取决于它的主进程是否能持续运行。如果主进程是一个一次性打印消息的程序那容器注定是一次性用品如果主进程是一个常驻服务如nginx容器就会一直处于Running状态。4.4 为什么hello-world容器运行完就消失了把这个问题作为一个小节单独拿出来讲因为它困扰过太多人。你会发现在某些体验教程里作者会写hello-world容器执行完就自动删除了这个表述其实不准确。准确说法是容器进程运行结束了但容器记录还在只不过因为退出时间太短、你没有及时执行docker ps -a所以产生了消失了的错觉。如果真想让容器执行完自动删除你要显式加--rm参数例如docker run --rm hello-world。加了--rm后容器在退出时会被自动清理掉docker ps -a里也就看不到它的记录。这个参数在临时测试时非常好用可以防止本地堆积大量无用的退出容器。顺带说一句很多老手调试一次性任务都习惯加--rm因为它干净、没有副作用是用完即走的最佳实践。5. 常见问题与排查技巧实录5.1 数据库守护进程未启动最典型的新手一脸懵报错刚装完Docker就急着跑命令最容易撞见的是类似Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?的报错。这个问题百分之八九十是Docker引擎没有处于运行状态。Windows/macOS上的解法最简单观察桌面端小鲸鱼图标是否在转动没跑就打开Docker Desktop等一两分钟让它完全启动再重新执行命令。Linux环境里则需要你手动启服务常见做法是sudo systemctl start docker sudo systemctl enable docker第一条是立即启动第二条是设置开机自启。很多Linux新手不知道Docker不是跑一条命令就常驻的服务端必须作为一个后台守护进程运行所以这里我强烈建议把enable也加上省得每次重启机器都手动拉一次。5.2 网络原因导致镜像拉取永远的卡住docker run hello-world卡在pull access denied或者下载条不动十有八九是镜像仓库的连接问题。pull access denied本身就是两件事要么镜像名打错了要么仓库源里没有这个镜像。排除打错字的情况后重点检查加速配置是否生效你会用docker info查看Registry Mirrors字段是否是你配置的地址如果为空重启一次Docker Desktop再验证。还有一类网络问题是代理配置冲突。如果你本机开了代理工具Docker Desktop默认会读取系统代理可能导致连接不上本地镜像仓库。遇到这种情况到Settings → Proxies里手动配置或清空再恢复默认。这里有个我踩过的坑改了代理配置一定要重启Docker引擎光保存设置不一定生效很多问题其实是设置没重启引擎背的锅。5.3 Windows环境特有的WSL与虚拟化相关报错Windows下的Docker Desktop问题一半以上出在WSL2或虚拟化环境上。常见报错包括virtualization support not detected、WSL 2 installation is incomplete、failed to connect to the docker API at npipe。第一个和第二个本质上是虚拟化功能或WSL组件没到位解决办法是去启用或关闭Windows功能中打开虚拟机平台与适用于Linux的Windows子系统然后重启再更新WSL。第三个报错通常也是引擎没起来先检查Docker Desktop的Dashboard是否正常显示Engine running。这类问题看着吓人实际没有技术含量基本就是基础功能没开全。排查顺序建议是先确认虚拟化开启再确认WSL安装再确认Docker Desktop启动最后才是看命令报错。很多新手一路卡在第三个步骤反复重启电脑都没解决就是因为顺序搞反了。5.4 Linux环境的权限问题sudo与docker组的关系在Ubuntu这类Linux发行版上如果你直接用普通用户执行docker ps很可能会看到permission denied。原因是Docker的socket文件默认权限属于root用户。正经的解法是把当前用户加入docker组sudo usermod -aG docker $USER newgrp docker第一条命令把当前用户加入docker组第二条命令立刻刷新组权限不用注销重登。这里有个禁忌千万别图省事直接用sudo docker因为sudo会改变环境变量和文件权限还可能让容器获取到不必要的权限长期用sudo操作docker绝对不是好习惯。我见过有人天天用sudo敲命令敲了半年还不知道docker组这回事一旦换台新机器就抓瞎。5.5 积累了一堆Exited容器怎么快速清理连续多次跑hello-world之后执行docker ps -a会看到一长串Exited (0)的容器记录。它们不占资源但会让列表特别乱。我的习惯是定期清理最省事的命令是docker system prune它会清理所有已停止的容器、无用网络、悬空镜像和构建缓存。如果你只想删容器而不动镜像docker container prune这里提醒一句docker system prune默认不会删hello-world这种本地镜像想连镜像一起删得加上-a参数。不过刚入门阶段我不建议急着删镜像因为留着它能让你随时用docker ps -a对照着复习容器生命周期等玩熟了再清理也不迟。6. 进阶扩展从Hello World到真实应用6.1 用Ubuntu容器体验交互式终端Hello World帮你看清了一次性容器的完整流程但真实开发中你更多会用到交互式容器。最简单的例子是运行一个Ubuntu容器并进入它的shelldocker run -it ubuntu bash这条命令里的-i表示保持标准输入打开-t表示分配一个伪终端两者配合你才能看到shell提示符并输入命令。跑完这条命令你会发现自己被丢进了一个全新的Ubuntu环境在里面cat /etc/os-release看到的是一套完整的Linux用户空间信息。用我第一次跑这个命令时觉得很神奇——明明电脑上装的是Windows或macOS但容器里看起来就是一台独立的小Linux机器。这就是容器隔离能力最直观的体验。在容器里你可以随意执行命令、安装软件包改坏了也不怕退出shell后容器停止你随时可以重新起一个宿主机毫发无损。6.2 用Nginx容器体验常驻进程型容器交互式容器理解透之后再来体验一下真正的常驻服务。Nginx是完美的演示对象docker run -d --name my-nginx -p 8080:80 nginx-d让容器在后台运行--name给它起个名字-p映射端口。启动后你在浏览器访问http://localhost:8080就能看到Nginx的欢迎页。这次你再执行docker ps会看到容器状态为Up跟hello-world那次完全不同。这是因为nginx的主进程是长时间运行的服务进程不会自己退出。看日志可以执行docker logs my-nginx停止容器执行docker stop my-nginx重新启动执行docker start my-nginx。这一套组合拳打完你对容器是进程这个概念就算彻底有了肌肉记忆。你还可以试试docker exec -it my-nginx bash直接进入运行中容器的内部修改nginx配置、查看进程列表这是排查容器内部问题的日常操作。6.3 理解容器资源隔离与安全边界跑到Nginx这个阶段你应该留意到隔离这个词的另一层含义。容器虽然有独立的文件系统和进程空间但它仍然共享宿主机的内核。所以在容器里执行top或df -h很多数据反映的是宿主机层面的资源状况。这就是容器和虚拟机最核心的分水岭。也因此引出一个重要认知容器安全性不止依赖隔离还依赖权限控制。常规容器默认以非特权模式运行它无法直接操作宿主机设备。如果你看到网上有人教用--privileged参数跑容器除非明确知道你在干什么否则不建议跟风模仿因为特权模式相当于让容器获得了更宽的内核操作能力一旦容器被攻破宿主机风险会成倍放大。入门阶段记住一句话就够了默认隔离够用扩大特权要谨慎。6.4 接下来可以沿着哪条学习路径继续走Hello World之后建议按这个顺序往下延伸先学会用docker pull拉取常用基础镜像再学Dockerfile编写自定义镜像把从Dockerfile构建镜像docker build -t这条链路跑通然后学Docker Compose编排多个容器。等到你能把一套web应用前端、后端、数据库用Compose文件编排起来时你对Docker的能力边界就有了全局认知。另外一个值得关注的方向是容器的内存和资源占用问题不少开发者在容器里跑Java应用发现进程占用内存居高不下这背后涉及JVM对容器内存限制的感知问题属于进阶实战环节。就我在一线带人的经验来看Docker入门最要不得的心态是我先把所有命令背下来或者我先把原理研究透再动手。这两个极端我都见过效果都不好。正确的心态是先用hello-world把链路跑通再从一次性的容器玩到常驻服务最后回到原理层面补充认知螺旋式上升。每当你对Docker环境产生怀疑别猜直接跑一次docker run hello-world做自检环境没毛病就会正常打印欢迎消息这个几KB的小镜像从入门到工作多年都是你最趁手的诊断工具。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。