Docker把应用和它需要的一切打包进容器,开发、测试、生产环境完全一致。本地用Docker Desktop调试,上云直接跑,再也不用听"在我机器上能跑"。
不堆参数,只讲真功夫。每一处都解决实实在在的麻烦。
基于Linux命名空间和cgroup做进程隔离,每个容器有独立文件系统、网络和PID空间。旧方案用虚拟机跑服务,启动要分钟级、占几GB内存;Docker容器共享宿主机内核,docker run秒级启动,几十MB内存就能跑一个Redis。
镜像用分层存储,每层只读,底层是基础镜像、上层是应用变更。旧方案手动在每台服务器装依赖、配环境,版本对不上就出bug;Dockerfile写清楚FROM/ RUN/COPY/CMD,docker build一键打包,任何地方跑起来都一样。
docker-compose.yml用YAML定义多容器服务,指定镜像、端口映射、环境变量、依赖顺序。旧方案手动敲一堆docker run命令、记端口号、挨个启停;docker compose up一条命令把MySQL+Redis+后端+前端全拉起来,本地联调像在生产环境。
Docker Desktop内置Kubernetes单节点集群,本地写完代码直接kubectl apply测试。旧方案本地测完上云还要重新配环境、改配置;容器镜像到哪都是一样的,Docker Desktop还能直连AWS/Azure/Google Cloud,本地调试云端部署一条龙。
有些麻烦,换个方式就没了。
后端要MySQL+Redis+Elasticsearch,手动装一遍半小时还污染系统。用Docker Compose起一套,用完docker compose down全清掉,系统干干净净。
十几个微服务互相调用,本地只跑一两个其他靠mock。Docker Compose把整套链路拉起来,网关、鉴权、订单、支付全在本机跑,联调不用等测试环境。
流水线里每次重新装依赖慢得要命。用Docker镜像做Runner环境,依赖全打进镜像里,流水线只要pull镜像跑测试,构建速度翻倍。
测试环境好好的,上生产就炸。容器把代码和运行环境绑一起,开发用Docker Desktop测完,生产用同样的镜像部署,环境差异归零。
都是真实体验,没有套话。
以前新同事入职第一天就在装环境,MySQL版本不对、Redis编译失败、Python依赖冲突,折腾两天才能写代码。现在直接docker-compose up,十分钟跑起全套微服务,当天就能提交PR。
最意外的是Docker Desktop的K8s集成。之前本地调K8s要装Minikube或者kind,配置一堆网络问题。现在Desktop里勾一下就开了,kubectl直接连,本地验证YAML再上云。
培训班学Java的时候老师让我们手动装Tomcat配环境变量,全班一半人卡在安装上。后来自己学Docker,一个tomcat镜像run起来就能跑war包,才明白什么叫"环境即代码"。现在教新人第一件事就是装Docker。
冷门细节:Docker的volume挂载在Mac上走的是gRPC-FUSE,IO性能比Windows的WSL2后端差不少。本地开发如果有大量文件热重载,Mac上最好把node_modules放容器里而不是挂载出来,这个坑踩过才知道。
不吹牛,只讲原理和体验。
技术动作:UnionFS把镜像切成只读层,每层只存与前一层的差异,docker pull时已经存在的层直接复用本地缓存;Dockerfile里RUN apt-get && rm -rf /var/lib/apt/lists/*把安装和清理压进同一层避免膨胀;多阶段构建让编译工具和最终产物分离,最终镜像只留运行时。用户感知:一个带Node服务的镜像能压到几十MB,拉取十秒搞定,不像虚拟机镜像动辄几个GB,换版本重拉也不用等半天。
技术动作:容器不虚拟化硬件,直接复用宿主机内核,docker run只做三件事——chroot切换根目录、namespace创建隔离视图、cgroup限制资源配额,fork一个新进程完事;对比虚拟机要bootloader→kernel→init→service完整走一遍。用户感知:docker run redis瞬间就能ping通,启动曲线跟直接跑二进制差不多,一台笔记本能同时起十几个微服务容器不卡。
技术动作:六种namespace分别隔离PID(看不到对方进程)、Mount(文件系统独立)、Network(各有一张网卡)、UTS(各自hostname)、IPC(进程间通信隔离)、User(uid/gid映射);cgroup v2用子树控制CPU quota、memory.high、io.max,超限直接OOM kill而非抢占。用户感知:一个容器把CPU跑满不影响另一个,端口映射出去外界才访问得到,容器内ps看不到宿主机的进程,像各自住在独立房子里却共用同一堵墙。
技术动作:macOS没有原生Linux内核,Docker Desktop跑一个轻量HyperKit虚拟机承载containerd,容器内进程实际跑在虚拟机里的Linux上;virtio-fs实现宿主机目录挂载到VM内,文件IO走virtio队列而非网络转发;Rosetta 2让x86镜像在Apple Silicon上转译运行。用户感知:Mac上docker run跟Linux上体验几乎一样,只是挂载卷的IO比原生Linux慢一截,大文件热重载要留意这个坑。
技术动作:docker-compose.yml被parser转换成Service模型,依赖关系用有向无环图解析启动顺序,depends_on决定wait条件;每个service的config生成container spec后交给containerd创建task;networks字段自动创建bridge并连接各容器,内置DNS让容器名互相解析。用户感知:docker compose up一口气拉镜像、建网络、起Redis/MySQL/后端/前端,端口冲突自动报错,docker compose down全清掉不留垃圾,本地联调不用手动记一堆docker run参数。