资讯动态

Docker 深入理解:从容器原理到生产环境最佳实践

发布时间:2026/9/12 13:00:05 来源:尧图企业网站定制
作者王仕宇JavaPub前言很多开发者学习 Docker只停留在dockerrun nginx然后认为 Docker 就是一个启动程序的工具。但真正进入企业开发之后你会发现为什么 Docker 启动速度这么快容器和虚拟机有什么区别为什么删除容器数据没了为什么线上 Docker 容器会越来越大为什么生产环境一定使用 Docker Compose为什么 Kubernetes 基于 Docker 思想发展理解 Docker 底层原理才能真正掌握容器化技术。一、Docker 到底解决了什么问题在传统开发模式中开发环境Mac Node 20 MySQL 8 Redis 7 Python 3.12测试环境Linux Node 18 MySQL 5.7 Redis 6 Python 3.10生产环境Linux Node 16 MySQL 5.7 Redis 6结果开发我本地可以运行。上线为什么服务器不能运行Docker 解决的问题应用 运行环境 依赖 一起打包形成Docker Image无论在哪里开发机器 服务器 云服务器 Kubernetes运行结果保持一致。这就是Build Once, Run Anywhere二、Docker 架构Docker 主要由三部分组成Docker Client | | Docker Daemon | ---------------- Image Container1. Docker Client就是我们使用的命令dockerrun nginx实际上发送请求docker CLI ↓ Docker API ↓ Docker Daemon2. Docker Daemon后台服务Linuxsystemctl statusdocker负责创建容器管理镜像管理网络管理存储3. Docker Registry镜像仓库例如Docker Hubhub.docker.com流程docker pull nginx 本地没有 ↓ Docker Hub下载 ↓ 保存Image三、Docker 容器为什么这么快很多新人认为Docker 小型虚拟机实际上不是。虚拟机架构传统虚拟机物理服务器 ↓ Hypervisor ↓ Guest OS ↓ 应用例如VMwareVirtualBox需要完整操作系统。Docker 架构Docker服务器 ↓ Linux Kernel ↓ Docker ↓ Container ↓ 应用多个容器共享Linux Kernel系统资源所以启动虚拟机分钟级Docker秒级四、Docker 三大核心技术Docker 能实现隔离主要依靠 LinuxNamespaceCgroupsUnionFS1. Namespace隔离环境Namespace 负责看起来像独立系统。例如容器 APID: 1 nginx 2 worker容器 BPID: 1 mysql实际上宿主机PID: 100 nginx 200 mysql但是容器内部认为自己就是系统Namespace 类型类型作用PID进程隔离NET网络隔离MNT文件系统隔离UTS主机名隔离IPC进程通信隔离2. Cgroups资源限制如果一个容器占满 CPU服务器可能挂掉。Cgroups控制CPU内存IO例如限制 MySQLdockerrun\--memory512m\mysql表示最多使用512MB RAM限制 CPUdockerrun\--cpus2\nginx最多2个CPU核心3. UnionFS镜像分层Docker 镜像不是一个完整文件。例如nginxLayer 1 Ubuntu Layer 2 nginx Layer 3 配置文件 Layer 4 启动脚本多个镜像共享基础层。好处减少空间。查看dockerhistorynginx五、Docker 镜像到底是什么镜像本质一个只读模板。例如DockerfileFROM ubuntu RUN apt update RUN apt install nginx COPY index.html / CMD nginx执行dockerbuild-tmy-nginx.生成Image my-nginx运行dockerrun my-nginx产生Container关系Image ↓ Container类似类 ↓ 对象六、Dockerfile 最佳实践1. 使用官方基础镜像推荐FROM node:20-alpine不要FROM ubuntu 自己安装node原因镜像小安全快速2. 减少镜像体积错误RUN apt update RUN apt install xxx多个 Layer。优化RUN apt update \ apt install xxx \ rm -rf /var/lib/apt/lists/*3. 使用 .dockerignore类似.gitignore例如node_modules .git .env避免进入镜像。七、Docker 数据持久化很多新人踩坑启动 MySQLdockerrun mysql创建数据users orders products删除dockerrmmysql数据全部消失。原因容器是临时的。解决Volume。结构宿主机 /data/mysql | | 容器 /var/lib/mysql创建dockervolume create mysql-data使用dockerrun\-vmysql-data:/var/lib/mysql\mysql八、Docker 网络原理容器默认container network docker0查看ipaddr创建app | docker network | mysql推荐dockernetwork create app-net启动MySQLdockerrun\--networkapp-net\mysql应用dockerrun\--networkapp-net\backend然后代码连接MYSQL_HOSTmysql不需要写 IP。九、Docker Compose 企业实践实际项目不会启动docker run mysql docker run redis docker run nginx而是docker-compose.yml例如version:3services:mysql:image:mysql:8environment:MYSQL_ROOT_PASSWORD:123456volumes:-mysql-data:/var/lib/mysqlredis:image:redisnginx:image:nginxports:-80:80volumes:mysql-data:启动dockercompose up-d停止dockercompose down十、生产环境 Docker 优化1. 不使用 root 用户DockerfileUSER app提高安全性。2. 健康检查HEALTHCHECK CMD curl http://localhostDocker 自动判断服务是否正常。3. 日志管理不要日志写文件 无限增长推荐stdout ↓ Docker logging ↓ ELK4. 固定版本不要mysql:latest生产mysql:8.0.36避免升级导致故障。十一、Docker 常见排查命令查看日志dockerlogs-fapp查看资源dockerstats查看详细信息dockerinspect app查看进程dockertopapp进入容器dockerexec-itappsh十二、Docker 与 Kubernetes 的关系Docker负责运行一个容器Kubernetes负责管理大量 Docker 容器例如100 台服务器1000 个容器Kubernetes 自动创建删除扩容故障恢复关系Docker ↓ Container ↓ Kubernetes ↓ 云原生平台十三、Docker 学习路线第一阶段掌握docker run docker ps docker images docker logs docker exec第二阶段学习Dockerfile Volume Network Compose第三阶段深入Namespace Cgroups 镜像优化 安全 CI/CD Kubernetes总结Docker 不只是一个部署工具。它改变了软件交付方式以前代码 ↓ 配置环境 ↓ 部署 ↓ 解决环境问题现在代码 ↓ Docker Image ↓ 任何服务器运行对于后端开发者Java、Go、Python、Node.js、AI 服务部署Docker 已经成为现代工程体系的重要基础。作者王仕宇 JavaPub

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价