ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Docker 从入门到精通:原理、实战与生产运维全攻略

Docker 从入门到精通:原理、实战与生产运维全攻略 第九章Docker 原理深入从会用到真正懂docker基础自己的docker前面我们一直在讲怎么使用 Docker。现在开始讲Docker 为什么能做到这些如果你想成为 Docker 高手这一章必须理解。1. Docker 的整体架构先看 Docker 内部结构id3qz3rd 用户 | | docker 命令 | ↓ Docker Client | | Docker API | ↓ Docker Daemon | ---------------- | | ↓ ↓ containerd 镜像管理 | ↓ runc | ↓ Linux Kernel | ↓ Container我们逐个解释。2. Docker Client你平时输入docker run nginx这个docker就是客户端。它负责例如你输入docker ps实际上不是 docker 自己管理容器。它只是告诉 Docker 服务给我列一下容器。3. Docker Daemon核心Docker Daemon中文Docker 守护进程。它是真正干活的人。负责创建容器删除容器下载镜像管理网络管理 VolumeLinux 查看systemctl status docker看到dockerd就是它。4. containerd现在 Docker 不直接管理容器运行。中间有containerd它负责镜像管理容器生命周期结构Docker ↓ containerd ↓ runc ↓ Linux5. runc 是什么runc真正创建容器的程序。它根据 OCI 标准创建NamespaceCgroups文件系统最后产生Linux 进程。所以Docker 容器本质不是 Docker 创建的。而是Docker ↓ containerd ↓ runc ↓ Linux进程6. Docker 为什么能隔离容器核心Linux 内核技术。两个最重要NamespaceCgroups7. Namespace命名空间作用隔离视图。让一个进程看到的是自己的世界。例如普通 Linux执行ps aux看到PID 1 nginx PID 2 mysql PID 3 bash但是容器里面ps aux可能PID 1 nginx为什么因为Namespace 隔离了进程空间。8. Namespace 有哪些Linux 有多个 NamespacePID Namespace隔离进程。容器认为自己是 PID 1。例如宿主PID 5000 nginx容器PID 1 nginx实际上同一个进程。Network Namespace隔离网络。每个容器拥有独立网卡IP路由例如容器eth0 172.18.0.2Mount Namespace隔离文件系统。容器看到/bin /etc /usr但是和宿主不同。UTS Namespace隔离主机名。容器hostname输出mysql-containerUser Namespace隔离用户。例如容器 root不一定等于宿主 root。9. Cgroups资源限制Namespace解决“你看到什么”。Cgroups解决“你能用多少资源”。例如限制docker run \ --memory512m \ --cpus1 \ nginx背后就是 Cgroups。没有 Cgroups一个容器可能吃光CPU 内存 磁盘导致服务器崩溃。10. UnionFS 镜像分层原理这是 Docker 镜像核心。之前说镜像像千层蛋糕。为什么因为Union File System。例如DockerfileFROM ubuntu RUN apt install nginx COPY index.html /生成三层Layer 3 index.html ------------ Layer 2 nginx ------------ Layer 1 ubuntu启动容器增加一层Container Layer (可写) -------------- Layer 3 -------------- Layer 2 -------------- Layer 1重点镜像只读。容器增加可写层。11. 为什么删除容器数据消失因为数据在Container Writable Layer删除这一层消失。Volume为什么保存因为它在外部Container | Volume | Host Disk12. Docker 为什么启动快虚拟机启动BIOS ↓ 启动内核 ↓ 启动系统 ↓ 启动程序需要几十秒。Docker启动进程 ↓ 隔离环境 ↓ 运行几秒。因为没有启动完整操作系统。13. Docker 镜像为什么下载快原因三个1. 分层例如Ubuntu已经下载。Python镜像复用。2. 缓存Docker 保存Layer下一次不用重新下载。3. 并行下载多个 layer同时下载。14. 容器和普通进程区别很多人问Docker 容器是不是虚拟机不是。实际上普通程序 nginx ↓ Linux进程 Docker: nginx ↓ Linux进程 Namespace Cgroups Filesystem15. Docker 安全边界注意容器不是绝对安全。为什么因为共享Linux Kernel。如果Kernel 有漏洞可能突破。所以生产环境需要更新内核最小权限非 root 用户镜像扫描网络隔离16. Docker 和 Kubernetes 的关系很多人混淆。Docker负责运行容器。例如一台服务器 运行10个容器Docker 很舒服。但是100台服务器10000个容器。怎么办需要Kubernetes。关系Kubernetes 管理 ↓ Docker / containerd 运行 ↓ Containers17. Docker 到底解决了什么总结以前开发环境 Python版本不同 依赖不同 服务器不同 部署失败Docker程序 环境 依赖 ↓ 镜像 ↓ 哪里都能运行18. 高手必须掌握的 Docker 排错思路生产出问题不要乱试。按层排查第一层容器有没有运行docker ps第二层日志docker logs第三层进入容器docker exec -it第四层网络docker network inspect第五层资源docker stats第六层镜像docker inspect19. 到这里你的 Docker 知识体系现在基础 docker run docker ps ↓ 核心 Image Container Volume Network ↓ 开发 Dockerfile Compose ↓ 生产 部署 日志 优化 ↓ 原理 Namespace Cgroups containerd runc UnionFS第十章Docker 高级实战工程师级现在你已经不是 Docker 小白了。前面你掌握了Docker基础 ↓ 镜像 ↓ 容器 ↓ Volume ↓ Network ↓ Dockerfile ↓ Compose ↓ 底层原理这一章开始进入企业真实环境。目标能写生产级 Dockerfile能优化镜像能部署、维护、排查线上 Docker 服务。一、Docker 镜像优化企业必做很多新人写 DockerfileFROM ubuntu RUN apt update RUN apt install python COPY . CMD python app.py能运行。但是生产不合格。问题1. 镜像巨大Ubuntu70MB安装各种工具可能1GB2. 攻击面增加软件越多漏洞越多。3. 下载慢部署速度慢。生产目标小 快 安全二、选择合适基础镜像普通FROM ubuntu大小几百 MB。slim例如FROM python:3.12-slim特点删除很多无用工具。推荐生产常用。alpine例如FROM python:3.12-alpine非常小。但是有兼容问题。例如某些 Python 库需要 gcc。经验场景选择生产Pythonpython-slimJavatemurin-jreNodenode-slim极致优化alpine三、多阶段构建重点这是企业最常用技术。问题Java 项目。编译需要JDK Maven 源码 依赖但是运行只需要JRE jar包错误FROM maven COPY . RUN mvn package CMD java -jar app.jar结果镜像包含Maven源码编译工具巨大。多阶段# 第一阶段编译 FROM maven:3.9 AS build WORKDIR /app COPY . . RUN mvn package # 第二阶段运行 FROM eclipse-temurin:17-jre WORKDIR /app COPY --frombuild /app/target/app.jar . CMD [java,-jar,app.jar]结构阶段1 Maven 源码 ↓ app.jar 阶段2 JRE app.jar结果可能1GB ↓ 200MB四、Dockerfile 最佳实践1. 固定版本不要FROM python因为未来版本变化。推荐FROM python:3.12.5-slim2. 不使用 root默认容器root。风险攻击后权限过高。推荐FROM nginx RUN adduser app USER app3. 不安装无用工具不要RUN apt install vim生产不需要。4. 清理缓存例如错误RUN apt update RUN apt install nginx留下缓存。正确RUN apt update \ apt install -y nginx \ rm -rf /var/lib/apt/lists/*五、Docker 镜像安全扫描企业不会直接使用镜像。流程镜像 ↓ 扫描漏洞 ↓ 上线常见工具Trivy例如扫描trivy image nginx发现CVE漏洞为什么因为基础镜像可能包含漏洞软件。六、私有镜像仓库公司不会把所有镜像放 Docker Hub。通常自己搭私有 Registry。结构开发电脑 docker build ↓ 公司Registry ↓ 服务器pull例如镜像nginx变registry.company.com/shop/backend:v1七、Docker Registry 工作流程开发构建docker build -t backend:v1 .登录docker login打标签docker tag backend:v1 \ registry.com/backend:v1上传docker push registry.com/backend:v1服务器docker pull registry.com/backend:v1八、Harbor企业常用Harbor很多公司使用。它比普通 Registry 强提供用户管理权限控制镜像扫描审计Web界面结构开发 | docker push ↓ Harbor | docker pull ↓ 生产服务器九、Docker CI/CD 自动化真实公司不会每天手动docker build docker push而是自动。流程开发提交代码 ↓ Git ↓ CI系统 ↓ 自动测试 ↓ docker build ↓ 镜像仓库 ↓ 服务器部署例如代码git push自动1. 拉代码 2. 构建镜像 3. 扫描 4. 上传 5. 更新服务器十、GitLab CI 示例文件.gitlab-ci.yml例如build: script: - docker build -t app:v1 . - docker push app:v1提交代码自动执行。十一、Jenkins Docker传统企业大量使用。流程Git ↓ Jenkins ↓ Docker Build ↓ Docker Push ↓ 服务器部署十二、Docker 生产监控线上不能只看docker ps需要监控。关注CPUCPU使用率内存Memory网络流量容器状态是否重启命令docker stats企业常用PrometheusGrafana组成Docker ↓ Prometheus ↓ Grafana ↓ 监控面板十三、Docker 日志管理默认json-file长期可能撑爆磁盘。查看docker info限制daemon.json{ log-driver:json-file, log-opts:{ max-size:100m, max-file:3 } }意思单个日志最多100MB。保留3个文件。十四、Docker 健康检查问题容器运行不代表服务正常。例如容器 alive 但是 Java死循环添加DockerfileHEALTHCHECK CMD curl http://localhost:8080Composehealthcheck: test: - CMD - curl - localhost:8080效果Docker知道服务健康状态。十五、自动恢复生产一定restart: always例如服务器重启服务器开机 ↓ Docker启动 ↓ 容器自动启动常见restart: unless-stopped意思除非人为停止。十六、Docker 网络生产设计不要所有服务一个网络。推荐分层公网网络 | ↓ Nginx 内部网络 | ↓ Backend 数据库网络 | ↓ MySQL例如networks: frontend: backend: database:隔离。十七、Docker 数据备份策略数据库不能只靠 Volume。生产至少每日备份例如凌晨3点 mysqldump ↓ 备份文件异地备份例如服务器↓对象存储。十八、Docker 常见线上事故事故1磁盘爆满原因日志。解决docker system prune事故2容器不停重启查看docker ps然后docker logs事故3数据库数据丢失原因没有 Volume。事故4服务访问不了检查顺序docker psdocker logsdocker network inspect端口docker port十九、Docker 运维黄金流程上线代码提交 ↓ CI构建 ↓ Docker镜像 ↓ 漏洞扫描 ↓ 推送仓库 ↓ 服务器拉取 ↓ Compose更新 ↓ 监控观察二十、现在你的 Docker 能力等级大概初级会docker run docker ps docker pull中级会Dockerfile Volume Network Compose高级会镜像优化 安全 CI/CD 私有仓库 监控 生产部署你现在已经进入高级 Docker 使用者。
返回列表