一、Docker 核心基础概念
1. 核心组件
组件 | 本质/定义 | 核心作用 |
镜像 (Image) | 分层的只读文件,包含微型OS(无内核)、软件、依赖库、配置文件 | 容器的“模板”,可重复使用,是容器运行的基础 |
容器 (Container) | 镜像运行后的实例,本质是宿主机上的受隔离的进程 | 运行应用程序,拥有独立的网络、文件系统、进程空间,启停秒级 |
仓库 (Repository) | 存储镜像的仓库(公有/私有) | 镜像的分发渠道(官方:hub.docker.com;国内:docker.aityp.com、阿里云ACR) |
Dockerfile | 制作镜像的“配方文件”,包含构建镜像的指令序列 | 标准化构建自定义镜像,实现镜像构建自动化、可追溯 |
2. 容器核心特性
●轻量级:共享宿主机内核,仅封装应用及依赖,体积远小于虚拟机
●隔离性:通过 Linux Namespace 实现网络、进程、用户、文件系统等隔离
●资源可控:通过 Linux Cgroup 限制 CPU、内存、磁盘 IO 等资源
●可移植性:镜像可在任意支持 Docker 的环境运行(跨服务器/操作系统)
●单进程思想:一个容器仅运行一个核心程序(便于资源管控和故障定位)
二、Docker 环境部署
1. CentOS 安装 Docker
# 1. 安装系统工具 sudo yum install -y yum-utils # 2. 添加阿里云软件源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 3. 安装 Docker 核心组件 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 4. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 5. 关闭防火墙/SELinux(生产环境建议按需开放端口,而非直接关闭) sudo systemctl stop firewalld && sudo systemctl disable firewalld sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && sudo setenforce 02. Ubuntu 安装 Docker
# 1. 更新系统并安装依赖 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg # 2. 信任 Docker GPG 公钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # 3. 添加软件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. 安装 Docker sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 核心组件说明
组件 | 核心作用 |
docker-ce | Docker 核心守护进程(daemon),管理容器生命周期、资源隔离 |
docker-ce-cli | Docker 命令行客户端,用户与 daemon 交互的入口(如 docker run/ps) |
[containerd.io](containerd.io) | 底层容器运行时,负责容器的实际创建/启动,对接 runc |
docker-buildx-plugin | 增强镜像构建能力(多平台构建、缓存优化) |
docker-compose-plugin | 多容器编排工具,通过 docker-compose.yml 管理关联容器 |
三、Docker 核心操作命令
1. 镜像管理
命令 | 作用 |
docker images | 查看本地镜像 |
docker pull <镜像名:版本> | 拉取镜像(国内建议用阿里云/华为云镜像源) |
docker tag <原镜像> <新标签> | 为镜像打标签(用于推送私有仓库) |
docker build -t <镜像名:版本> . | 基于 Dockerfile 构建镜像 |
docker save -o <文件名.tar> <镜像> | 导出镜像为 tar 包 |
docker load -i <文件名.tar> | 导入 tar 包为镜像 |
docker rmi <镜像ID/名称> | 删除本地镜像(需先删除依赖该镜像的容器) |
2. 容器管理
命令 | 作用 |
docker run [参数] <镜像> | 创建并启动容器(核心参数见下表) |
docker ps [-a] | 查看运行中(-a 包含已停止)的容器 |
docker start/stop/restart <容器> | 启动/停止/重启容器 |
docker exec -it <容器> bash/sh | 进入容器交互式终端 |
docker rm [-f] <容器> | 删除容器(-f 强制删除运行中的容器) |
docker logs [-f] <容器> | 查看容器日志(-f 实时跟踪) |
docker stats <容器> | 查看容器资源占用(CPU、内存、IO) |
docker inspect <容器/镜像> | 查看容器/镜像的详细元数据 |
docker run 核心参数
参数 | 作用 |
-d | 后台运行容器 |
--name <名称> | 指定容器名称(唯一) |
-p <宿主机端口>:<容器端口> | 端口映射(DNAT),对外暴露容器服务 |
-e <KEY=VALUE> | 设置容器环境变量(如 MYSQL_ROOT_PASSWORD=123456) |
--network <网络> | 指定容器所属网络(默认 bridge) |
--cpu-shares <值> | 设置 CPU 权重(相对值,默认1024) |
-m <大小> | 限制内存(如 500M、1G) |
-v <卷/宿主机路径>:<容器路径> | 挂载数据卷/目录(持久化数据) |
--link <容器>:<别名> | 容器间网络互通(已被自定义网络替代,不推荐) |
3. 数据卷管理
命令 | 作用 |
docker volume create <卷名> | 创建自定义数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume inspect <卷名> | 查看数据卷详细信息(存储路径:/var/lib/docker/volumes/卷名/_data) |
docker volume rm <卷名> | 删除数据卷 |
docker volume prune | 删除未使用的所有数据卷 |
4. 网络管理
命令 | 作用 |
docker network ls | 查看所有网络 |
docker network create <网络名> | 创建自定义 bridge 网络 |
docker network inspect <网络名> | 查看网络详情(子网、网关、关联容器) |
docker network connect <网络> <容器> | 将容器接入指定网络 |
容器网络类型
类型 | 特点 |
bridge | 默认网络,容器有独立IP,通过宿主机 docker0 网桥实现网络互通(SNAT/DNAT) |
host | 容器共享宿主机网络命名空间,无独立IP,无需端口映射(端口冲突风险) |
null | 容器无网络(仅本地回环) |
overlay | 跨主机容器网络(Docker Swarm/K8s 集群使用) |
四、Docker 底层原理
1. 隔离技术:Linux Namespace
Namespace 类型 | 隔离内容 | 作用 |
Network | 网络(IP、端口、网卡) | 容器拥有独立的网络栈,端口不冲突 |
PID | 进程ID | 容器内进程 PID 从 1 开始,无法看到宿主机/其他容器进程 |
UTS | 主机名/域名 | 容器可自定义主机名 |
User | 用户/组ID | 容器内 root 不等于宿主机 root |
Mount | 文件系统 | 容器有独立的挂载点,与宿主机隔离 |
IPC | 进程间通信(信号、共享内存) | 容器间默认无法IPC通信 |
2. 资源限制:Linux Cgroup
●核心作用:限制进程/进程组的 CPU、内存、磁盘 IO、网络带宽等资源
●关键特性:
○可精细化控制(如 CPU 核数、内存上限、IO 速率)
○资源使用可监控(docker stats 基于此实现)
○层级化管理(子组继承父组限制)
3. 镜像分层:OverlayFS
●核心思想:镜像由多个只读层 + 容器运行时的可写层组成,相同层共享存储,减少冗余
●容器读写规则:
○读文件:从上到下遍历各层,找到第一个匹配的文件
○写文件:Copy-on-Write(COW),先将只读层文件复制到可写层,再修改
○删除文件:在可写层创建“白名单”标记,隐藏只读层文件
五、Dockerfile 制作自定义镜像
1. 核心指令
指令 | 作用 | 注意事项 |
FROM | 指定基础镜像(必填,如 busybox、python:3.9-slim) | 优先选择轻量级镜像(alpine/busybox)减小体积 |
WORKDIR | 设置容器工作目录(后续指令的执行目录) | 避免使用 cd 命令,建议绝对路径 |
COPY/ADD | 复制宿主机文件到容器(ADD 支持解压压缩包、下载URL) | COPY 更安全,优先使用 |
RUN | 构建镜像时执行命令(如安装依赖) | 多条命令用 && 合并,减少镜像层数 |
ENV | 设置环境变量(可在容器内使用) | 便于镜像参数化,如版本、配置路径 |
EXPOSE | 声明容器暴露的端口(仅文档作用,不实际映射) | 需配合 docker run -p 对外暴露 |
CMD/ENTRYPOINT | 容器启动时执行的命令 | CMD 可被覆盖,ENTRYPOINT 不可覆盖(CMD 可作为其参数) |
VOLUME | 声明数据卷(容器启动时自动创建) | 建议运行时通过 -v 挂载,更灵活 |
LABEL | 添加镜像元数据(如作者、版本) | 便于镜像管理和检索 |
2. CMD vs ENTRYPOINT
特性 | CMD | ENTRYPOINT |
可覆盖性 | 运行容器时可通过命令行参数覆盖 | 不可覆盖(需用 --entrypoint 参数) |
用途 | 定义默认启动命令(可替换) | 定义容器核心启动命令(固定) |
组合使用 | 作为 ENTRYPOINT 的参数 | 接收 CMD 的参数,如 ["/bin/sh", "/script.sh"] + ["arg1"] |
3. 镜像优化技巧
1减少层数:RUN 指令合并(&&)、少用 COPY/ADD 分散复制
2选择轻量基础镜像:alpine(几MB)> slim > 完整版 OS
3清理构建缓存:RUN 指令最后清理依赖包、日志、缓存(如 apt-get clean)
4多阶段构建:编译和运行分离(如 Go/C 编译后仅复制二进制文件到 alpine)
六、Docker 生态与进阶应用
1. 多容器编排:docker-compose
●核心文件:docker-compose.yml(YAML 格式),定义多个关联容器的配置
●核心优势:一键启动/停止所有容器,自动管理网络、依赖关系
●常用命令:
docker compose up [-d] # 启动(-d 后台) docker compose down # 停止并删除容器/网络 docker compose logs # 查看所有容器日志
2. 跨主机数据共享:NFS
部署步骤(服务端)
# 1. 安装 NFS 服务 yum install -y nfs-utils # CentOS # apt install -y nfs-kernel-server # Ubuntu # 2. 创建共享目录 mkdir /web && chown nobody:nobody /web # 3. 配置共享规则 echo "/web 192.168.152.0/24(rw,sync,all_squash)" >> /etc/exports # 4. 启动服务并生效配置 systemctl start nfs-server && systemctl enable nfs-server exportfs -arv
客户端挂载并创建 Docker 卷
# 1. 安装 NFS 客户端 yum install -y nfs-utils # CentOS # 2. 创建本地挂载目录 mkdir /nfs-web # 3. 挂载 NFS 目录 mount 192.168.152.134:/web /nfs-web # 4. 创建 Docker NFS 卷 docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.152.134,nolock,soft,rw \ --opt device=:/web \ nfs-web # 5. 启动容器挂载卷 docker run -d -p 8058:80 -v nfs-web:/usr/share/nginx/html nginx
3. 私有镜像仓库:Harbor
核心特性
●支持多项目、多用户权限管理
●镜像安全扫描、签名验证
●兼容 Docker Registry 规范
部署关键步骤
1解压 Harbor 离线包,修改 harbor.yml(配置 hostname、关闭 HTTPS)
2执行 ./install.sh 安装(依赖 docker-compose)
3配置 Docker 信任私有仓库(/etc/docker/daemon.json)
4登录并推送镜像
4. 容器监控:Prometheus + Grafana + cAdvisor
核心组件
组件 | 作用 |
Prometheus | 时序数据库,采集并存储监控指标 |
cAdvisor | 采集容器/宿主机资源指标(CPU、内存、IO、网络) |
node_exporter | 采集宿主机系统指标(补充 cAdvisor 宿主机监控能力) |
Grafana | 可视化监控数据,提供丰富的仪表盘模板 |
部署关键步骤
1启动 cAdvisor(依赖 Redis)
2配置 Prometheus 采集 cAdvisor/node_exporter 指标(修改 prometheus.yml)
3启动 Grafana,导入模板(如 8919 监控 node_exporter),关联 Prometheus 数据源。
5. 云原生镜像仓库:阿里云 ACR
核心操作
# 1. 登录阿里云 ACR docker login --username=<阿里云账号> registry.cn-heyuan.aliyuncs.com # 2. 为镜像打标签 docker tag nginx:latest registry.cn-heyuan.aliyuncs.com/<命名空间>/nginx:latest # 3. 推送镜像 docker push registry.cn-heyuan.aliyuncs.com/<命名空间>/nginx:latest # 4. 拉取镜像 docker pull registry.cn-heyuan.aliyuncs.com/<命名空间>/nginx:latest
七、生产环境最佳实践
1. 容器部署
●避免使用 --privileged 特权模式(降低隔离性)
●容器运行用户非 root(减少安全风险)
●关键容器设置 --restart=always(异常重启)
●数据持久化优先使用数据卷/外部存储(NFS/云存储),而非容器内存储
2. 镜像管理
●镜像版本使用固定标签(如 8.4.6),而非 latest(避免版本混乱)
●私有仓库开启镜像扫描(防范漏洞)
●定期清理无用镜像/容器/卷(docker system prune)
3. 监控与日志
●所有容器日志输出到标准输出(便于集中收集)
●部署 Prometheus + Grafana 监控核心指标(CPU、内存、磁盘、服务可用性)
●关键服务配置告警(如容器退出、资源使用率超阈值)
4. 开机自启
容器自启
# 方法1:创建启动脚本 cat > /usr/local/bin/start_docker_containers.sh << 'EOF' #!/bin/bash docker start sc-nginx-1 sc-mysql-1 sc-redis-1 EOF chmod +x /usr/local/bin/start_docker_containers.sh # 方法2:添加到 rc.local(Ubuntu 需配置 rc.local 可执行) echo "/usr/local/bin/start_docker_containers.sh" >> /etc/rc.local chmod +x /etc/rc.local八、核心知识点总结
1.Docker 本质:基于 Linux Namespace/Cgroup/OverlayFS 技术,将应用及依赖封装为镜像,运行时创建隔离的容器进程,实现“一次构建、到处运行”。
2.核心操作:镜像构建(Dockerfile)、容器启停(run/start/stop)、数据持久化(volume/NFS)、网络管理(bridge/自定义网络)是日常使用的核心。
3.生产关键:数据持久化、资源限制、监控告警、镜像安全、容器自启是生产环境落地的核心要点,需重点关注。
4.生态延伸:Docker 是云原生基础,向上对接 docker-compose(单机编排)、K8s(集群编排),向下依赖 containerd/runc 等底层运行时。
若有收获,就点个赞吧