简介:这份PPT面向正在学习Docker容器技术的开发者与运维人员,聚焦Docker Compose的安装环节,帮助读者解决多容器编排工具落地时的环境搭建问题。资源共1个pptx文件,压缩包约263KB,内容以图文幻灯片形式呈现,便于课堂讲解或自学时按页浏览。讲解覆盖Docker Compose的基本定位——通过docker-compose.yml定义文件一次性启动多个具有依赖关系的容器,并对比两种主流安装路径:下载软件包方式需获取对应版本二进制文件、添加可执行权限并验证版本号;源码仓库方式则借助yum源安装docker-compose插件,同时说明两种方式在命令调用上的差异,即短横线与空格写法的区别。目前已有158人学习,适合作为容器编排入门阶段的安装参考,也可用于梳理Compose与Docker CLI的集成关系。
1. 从一份 PPT 说起:Docker 容器技术与 Docker-compose 到底解决了什么问题
很多人第一次接触容器,是在一台已经跑满服务的测试机上:装 MySQL 要挑版本,装 Redis 要改配置,装完发现端口冲突,删了重来又怕把系统库带崩。这份《Docker容器技术-安装Docker-compose.pptx》讲的就是把这类「装环境」的活从手工操作变成可复制的流程。它覆盖 Docker 引擎的安装、镜像与容器的基本操作,以及用 Docker-compose 把多个容器编排成一个可一键起停的应用栈。适合刚上手容器、需要在 Windows 或 Linux 上快速搭出可复现环境的后端、运维和测试同学。它不教你写业务代码,但能让你把「在我机器上能跑」这句话变成「在任何人机器上都能跑」。
2. Docker 引擎安装:Windows 与 Linux 两条路怎么选
Docker 的安装从来不是「下一步下一步」那么简单,选错路线后面全是坑。这一章先把两条主流路径讲清楚,再落到具体命令和验证方法。
2.1 先分清 Docker Desktop 和 Docker Engine
Windows 上大多数人装的是 Docker Desktop,它把 Docker Engine、CLI、Compose 和图形界面打包在一起,底层依赖 WSL2 或 Hyper-V 提供 Linux 内核。Linux 上装的通常是 Docker Engine,纯命令行,没有图形界面,资源占用更低。两者的镜像和容器行为基本一致,但网络模型和文件挂载路径差异明显。
选型上有个简单判断:开发机是 Windows 且需要频繁切换项目,用 Docker Desktop 省事;服务器是 Linux 且只跑固定服务,用 Docker Engine 更稳。常见做法是开发用 Desktop、部署用 Engine,镜像通过仓库或docker save/docker load搬运。
提示:Docker Desktop 在 Windows 家庭版上依赖 WSL2,需要先在「启用或关闭 Windows 功能」里打开「适用于 Linux 的 Windows 子系统」和「虚拟机平台」,否则安装后会卡在启动阶段。
2.2 Windows 安装 Docker Desktop 的完整步骤
先确认 BIOS 里虚拟化已开启,任务管理器「性能」页能看到「虚拟化:已启用」。然后到 Docker 官网下载安装包,双击运行,安装时勾选「Use WSL 2 instead of Hyper-V」。安装完成后重启,首次启动会提示接受服务条款。
# 安装完成后在 PowerShell 中验证 docker --version docker compose version docker run hello-worlddocker --version看引擎版本,docker compose version看 Compose 插件版本,docker run hello-world会拉取一个极小镜像并运行,输出「Hello from Docker!」说明引擎、网络、镜像拉取链路都通了。如果卡在拉取镜像,多半是网络问题,后面避坑章节会讲。
2.3 Linux(Ubuntu/CentOS)安装 Docker Engine
Linux 上不建议用系统自带的docker.io包,版本旧且 Compose 要单独装。官方推荐用仓库安装,以 Ubuntu 为例:
# 卸载旧版本,避免冲突 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg # 添加官方 GPG 密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # 添加仓库 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装引擎和 compose 插件 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动并设为开机自启 sudo systemctl enable --now docker # 把当前用户加入 docker 组,免 sudo sudo usermod -aG docker $USER最后一步执行完要重新登录终端才生效。docker-compose-plugin提供的是docker compose子命令,和老的独立docker-compose二进制不是一回事,但用法基本兼容。CentOS 把apt-get换成yum,仓库地址换成https://download.docker.com/linux/centos/docker-ce.repo即可。
2.4 验证安装与配置镜像加速
安装完先跑一遍基础验证:
docker info docker run --rm alpine echo "engine ok"docker info会输出引擎、存储驱动、Cgroup 版本等信息,重点看Server Version和Storage Driver。--rm表示容器退出后自动删除,适合一次性验证。
国内拉取镜像慢是常态,配置镜像加速能明显改善。编辑/etc/docker/daemon.json:
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }registry-mirrors是镜像加速地址,log-opts限制单个容器日志大小,避免日志把磁盘写满。改完执行sudo systemctl daemon-reload && sudo systemctl restart docker。注意加速地址会失效,用之前先确认可用性,别照抄一份过期配置就以为万事大吉。
3. Docker-compose 编排:把多容器应用写进一个 YAML
单个容器用docker run还能忍,一旦要同时起 MySQL、Redis、后端服务,命令行参数会长到没法维护。Docker-compose 的核心价值就是用一个 YAML 文件描述整个应用栈,一条命令起停。
3.1 Compose 文件结构与关键字段
一个典型的docker-compose.yml长这样:
services: mysql: image: mysql:8.0 container_name: demo-mysql environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: demo ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: demo-redis ports: - "6379:6379" app: build: ./app container_name: demo-app depends_on: mysql: condition: service_healthy redis: condition: service_started ports: - "8080:8080" environment: DB_HOST: mysql REDIS_HOST: redis volumes: mysql-data:services下每个键是一个服务名,服务名同时是容器间互相访问的主机名,所以app里连数据库写mysql而不是localhost。depends_on配合condition: service_healthy能等 MySQL 真正就绪再启动应用,避免应用启动时连不上库直接退出。volumes顶层声明命名卷,数据不会随容器删除而丢失。
3.2 常用命令与生命周期管理
# 后台启动全部服务 docker compose up -d # 查看服务状态和健康检查 docker compose ps # 查看某个服务日志,-f 持续输出 docker compose logs -f app # 重新构建镜像并启动(改了 Dockerfile 后) docker compose up -d --build # 停止并删除容器、网络,保留卷 docker compose down # 连卷一起删,慎用 docker compose down -vup -d是日常用得最多的,-d表示后台运行。logs -f排查启动失败时必用,能看到应用真实的报错。down -v会删掉命名卷,数据库数据一起没,生产环境执行前一定确认清楚。
3.3 用 Compose 部署一个 MySQL + Redis + 应用栈
把上面的 YAML 存成docker-compose.yml,在app目录放一个简单 Dockerfile:
FROM openjdk:17-slim WORKDIR /app COPY target/app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]然后执行:
docker compose up -d --build docker compose ps正常的话三个服务都是running,MySQL 显示healthy。用docker compose exec mysql mysql -uroot -proot123能进数据库,说明端口映射和认证都通了。应用连库失败时,先看docker compose logs app,再确认DB_HOST写的是服务名而不是 IP。
注意:MySQL 8.0 默认认证插件是
caching_sha2_password,老版本客户端可能连不上。如果应用报认证错误,在 MySQL 配置里加--default-authentication-plugin=mysql_native_password,或在初始化时改用户认证方式。
4. 避坑与排查:那些让容器起不来的常见问题
这一章全是血泪经验,每条按「现象 → 原因 → 解决」写,遇到问题直接对号入座。
4.1 Docker Desktop 启动报虚拟化未检测到
现象:安装完 Docker Desktop,启动时弹窗提示virtualization support not detected或failed to start because virtualisation support wasn't detected。
原因:BIOS 里 CPU 虚拟化没开,或者 Windows 的 Hyper-V/WSL2 功能没启用,也可能是和 VirtualBox、VMware 等虚拟化软件冲突。
解决:进 BIOS 打开 Intel VT-x 或 AMD-V;在「启用或关闭 Windows 功能」里勾选「虚拟机平台」和「适用于 Linux 的 Windows 子系统」;如果装了 VirtualBox,先关掉再启动 Docker Desktop。Windows 11 家庭版确认 WSL2 内核已更新到最新。
4.2 拉取镜像卡住或超时
现象:docker pull长时间无响应,最后报net/http: TLS handshake timeout或context deadline exceeded。
原因:默认从 Docker Hub 拉取,网络链路不稳定,或者配置的镜像加速地址已失效。
解决:在daemon.json里换可用的加速地址,改完重启 Docker 服务。也可以先用docker search确认镜像存在,再换docker pull重试。企业内网环境通常有私有仓库,直接配insecure-registries指向内网地址。
4.3 容器内服务无法被外部访问
现象:容器里服务明明起来了,宿主机curl localhost:端口却连不上。
原因:端口映射写错,或者服务在容器内只监听了127.0.0.1而不是0.0.0.0。
解决:检查ports映射格式是宿主机端口:容器端口,别写反。确认服务配置里绑定地址是0.0.0.0,比如 MySQL 的bind-address、Redis 的bind。用docker port 容器名看实际映射关系。
4.4 权限错误导致容器无法读写挂载目录
现象:容器启动后报Permission denied,日志里提示无法写入/var/lib/mysql或类似路径。
原因:宿主机挂载目录的属主和容器内进程用户不匹配,或者 SELinux 拦截。
解决:确认挂载目录属主,必要时chown成容器内用户 UID。CentOS 上如果开了 SELinux,挂载时加:z或:Z标签,如-v /data/mysql:/var/lib/mysql:z。用命名卷而不是绑定挂载能绕开大部分权限问题。
4.5 Compose 启动顺序导致应用连不上数据库
现象:docker compose up后应用容器反复重启,日志报连接数据库失败。
原因:depends_on默认只保证容器启动顺序,不保证服务就绪,MySQL 初始化要几十秒。
解决:给数据库服务加healthcheck,应用侧用depends_on的condition: service_healthy。应用自身也要有重试逻辑,别一启动连不上就退出。这是最常见的翻车点,加健康检查能省掉大量排查时间。
5. 进阶技巧:镜像瘦身、多阶段构建与 Compose 覆盖文件
装好只是开始,真正让这套东西好用,还得会几招进阶操作。这一章讲三个我日常用得最多的技巧。
5.1 多阶段构建把镜像从 800MB 压到 80MB
Java 应用直接基于openjdk打包,镜像动辄七八百兆。用多阶段构建,构建阶段用完整 JDK,运行阶段只留 JRE:
# 构建阶段 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=builder /build/target/app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]COPY --from=builder只把构建产物拷进运行镜像,Maven、源码、依赖缓存都不进最终镜像。alpine基础镜像体积小,但要注意 glibc 兼容性,纯 Java 应用一般没问题。实测一个 Spring Boot 应用从 780MB 降到 85MB 左右,推送和拉取都快很多。
5.2 用 override 文件区分开发和生产配置
开发环境要挂源码目录、开调试端口,生产环境不能这么干。Compose 支持覆盖文件,基础docker-compose.yml写通用配置,docker-compose.override.yml写开发覆盖,生产用docker-compose.prod.yml:
# 开发:自动加载 override 文件 docker compose up -d # 生产:显式指定文件,不加载 override docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d覆盖文件里可以改端口、换环境变量、加卷挂载。这样一套代码两种环境,不用维护两份几乎一样的 YAML。注意-f指定多个文件时,后面的覆盖前面的,合并规则是「标量覆盖、列表追加」,卷和端口列表会合并而不是替换,写的时候留意。
5.3 验证 Compose 配置与资源限制
改完 YAML 别急着up,先验证语法:
docker compose config它会解析并输出最终生效的配置,合并结果、变量替换、格式错误都能看出来。生产环境还要加资源限制,防止单个容器吃满宿主机:
services: app: deploy: resources: limits: cpus: "2.0" memory: 2G reservations: memory: 512Mlimits是硬上限,reservations是预留。注意deploy段在非 Swarm 模式下部分字段不生效,Compose V2 里cpus和memory是支持的,但replicas这类要 Swarm 才有意义。我一般会在压测前先docker stats看实际占用,再定限制值,拍脑袋设太小会导致容器被 OOM kill,日志里只留一个exit code 137,排查起来很费劲。
从那以后我每次改完 Compose 文件,都强制先跑一遍docker compose config再up,这个习惯帮我挡掉了至少一半的低级错误。希望帮到你。
本文还有配套的精品资源,点击获取