news 2026/9/12 13:00:05

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 深入理解:从容器原理到生产环境最佳实践

作者:王仕宇(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 Container

1. Docker Client

就是我们使用的命令:

dockerrun nginx

实际上发送请求:

docker CLI ↓ Docker API ↓ Docker Daemon

2. Docker Daemon

后台服务:

Linux:

systemctl statusdocker

负责:

  • 创建容器
  • 管理镜像
  • 管理网络
  • 管理存储

3. Docker Registry

镜像仓库:

例如:

Docker Hub:

hub.docker.com

流程:

docker pull nginx 本地没有 ↓ Docker Hub下载 ↓ 保存Image

三、Docker 容器为什么这么快?

很多新人认为:

Docker = 小型虚拟机

实际上不是。


虚拟机架构

传统虚拟机:

物理服务器 ↓ Hypervisor ↓ Guest OS ↓ 应用

例如:

VMware

VirtualBox

需要完整操作系统。


Docker 架构

Docker:

服务器 ↓ Linux Kernel ↓ Docker ↓ Container ↓ 应用

多个容器共享:

  • Linux Kernel
  • 系统资源

所以启动:

虚拟机:

分钟级

Docker:

秒级

四、Docker 三大核心技术

Docker 能实现隔离,主要依靠 Linux:

  • Namespace
  • Cgroups
  • UnionFS

1. Namespace:隔离环境

Namespace 负责:

看起来像独立系统。

例如:

容器 A:

PID: 1 nginx 2 worker

容器 B:

PID: 1 mysql

实际上:

宿主机:

PID: 100 nginx 200 mysql

但是容器内部认为:

自己就是系统

Namespace 类型:

类型作用
PID进程隔离
NET网络隔离
MNT文件系统隔离
UTS主机名隔离
IPC进程通信隔离

2. Cgroups:资源限制

如果一个容器占满 CPU:

服务器可能挂掉。

Cgroups:

控制:

  • CPU
  • 内存
  • IO

例如:

限制 MySQL:

dockerrun\--memory=512m\mysql

表示:

最多使用:

512MB RAM

限制 CPU:

dockerrun\--cpus=2\nginx

最多:

2个CPU核心

3. UnionFS:镜像分层

Docker 镜像不是一个完整文件。

例如:

nginx:

Layer 1 Ubuntu Layer 2 nginx Layer 3 配置文件 Layer 4 启动脚本

多个镜像共享基础层。

好处:

减少空间。

查看:

dockerhistorynginx

五、Docker 镜像到底是什么?

镜像:

本质:

一个只读模板。

例如:

Dockerfile:

FROM 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 数据持久化

很多新人踩坑:

启动 MySQL:

dockerrun 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

启动:

MySQL:

dockerrun\--networkapp-net\mysql

应用:

dockerrun\--networkapp-net\backend

然后:

代码连接:

MYSQL_HOST=mysql

不需要写 IP。


九、Docker Compose 企业实践

实际项目:

不会启动:

docker run mysql docker run redis docker run nginx

而是:

docker-compose.yml

例如:

version:"3"services: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 用户

Dockerfile:

USER app

提高安全性。


2. 健康检查

HEALTHCHECK CMD curl http://localhost

Docker 自动判断:

服务是否正常。


3. 日志管理

不要:

日志写文件 无限增长

推荐:

stdout ↓ Docker logging ↓ ELK

4. 固定版本

不要:

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 12:59:45

Android车载串口开发实战:UART/RS232/RS485通信与稳定性优化

1. 这个项目要解决什么问题:车载屏与ECU之间的最后一公里 做了多年车载应用开发,大家应该都有同感:Android层能玩的花活再多,到了和整车ECU通信这一步,绕不开的就是串口。我接手这个项目时,硬件端已经固定了…

作者头像 李华
网站建设 2026/9/12 12:59:45

LunaTranslator上手指南:5分钟让视觉小说跑出实时翻译

LunaTranslator上手指南:5分钟让视觉小说跑出实时翻译 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator是一款免费开源的视觉小说实时翻译工具&…

作者头像 李华
网站建设 2026/9/12 12:59:38

Proteus仿真51单片机电流检测与过流保护设计详解

简介:这份Protues仿真实例围绕51单片机电流检测设计,适合自动化、电子类学生及初学者用来理解电流采样与单片机控制结合的完整流程。资源内含完整的DSN仿真电路、KEIL工程及C51源程序,并附带编译后的HEX文件,可直接加载到Protues中…

作者头像 李华
网站建设 2026/9/12 12:58:22

3C组装线零件厚度测量的工程适配实战指南

1. 这不是简单的“换个传感器”——3C组装线厚度测量的真实战场 在东莞松山湖一家做折叠屏铰链精密件的工厂里,我蹲点两周,亲眼看着产线工程师为一个0.08mm的厚度公差反复调试了17次。他们用的不是激光测距仪,也不是千分尺,而是一…

作者头像 李华
网站建设 2026/9/12 12:58:04

2025年17款AI编程Agent全面盘点:从补全到自主执行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华