Docker 部署 Docker 与 Nginx:从安装到跑通首个服务
这篇文章分成两部分:先完成 Ubuntu、CentOS/RHEL/Fedora、Windows 和 macOS 的 Docker 安装,并掌握镜像、容器、卷、网络和 Compose 的基本操作;再把 Nginx 作为一个使用 Demo,分别演示临时运行和可维护的 Compose 初始化部署。Linux 新用户先使用 Docker 官方安装脚本,Windows/macOS 使用 Docker Desktop;需要审计、固定版本或精细排障时,再使用后面的 apt/dnf 手工路径。
本文按 2026-08-26 的官方文档入口整理。Windows 官方安装页可在线读取,CentOS/RHEL、macOS 页面在当前网络中无法完整读取;本文没有在这些系统上启动 Docker,因此文中的“验证结果”是读者执行命令后应看到的结果,不是跨平台实测结论。
部署结论
| 项目 | 本文采用的值 |
|---|---|
| 项目地址 | Docker Engine 官方文档 |
| 官方镜像 | nginx |
| Engine/Desktop 版本 | Linux 使用 Docker 官方 stable 软件源;Windows/macOS 使用当前 Docker Desktop 安装包;均未写死版本 |
| Linux 推荐安装 | Docker 官方 get.docker.com 安装脚本;生产或审计环境改用下方手工仓库路径 |
| Docker 基础路径 | 安装 Docker Engine/Desktop,验证 docker version、Compose 和 hello-world |
| Nginx Demo 正式部署 | Docker Compose plugin(docker compose) |
| 快速体验 | Nginx Demo 支持 docker run,仅用于临时体验 |
| 适用范围 | 单机自托管基线;Linux 使用 Docker Engine,Windows/macOS 使用 Docker Desktop;不是高可用方案 |
| 主机架构 | 以对应 Docker 官方安装页列出的受支持架构为准;本文未在线复核完整清单 |
| 最低资源 | 本次环境未核对出官方统一最低值 |
| 对外端口 | 8080:80,仅用于示例 |
| 持久化位置 | ./html -> /usr/share/nginx/html:ro |
| 依赖服务 | 无;示例只有一个 Nginx 容器 |
| 验证范围 | 命令和 Compose 文件静态审阅;未执行在线拉取或运行时验收 |
| 资料核对日期 | 2026-08-26 |
Docker 基础命令用于理解和检查运行时状态;Nginx Demo 的 Compose 文件则把镜像、端口、挂载和重启策略保存下来,适合后续升级、备份和回滚。临时 docker run 不挂载网页目录,容器删除后容器内修改不会作为项目数据保留。
1. 准备主机
先确认系统版本、架构和端口。Linux 执行:
cat /etc/os-release
dpkg --print-architecture
ss -ltn | grep ':8080 ' || trueWindows 和 macOS 使用 Docker Desktop,它包含 Engine、CLI 和 Compose;不要把 Linux 的 apt/dnf 命令照搬到 Desktop。NAS 则优先使用设备厂商提供的 Docker 应用或 SSH 文档。
2. 各平台安装 Docker
2.1 Linux 一键安装脚本(推荐入门)
对于第一次安装 Docker 的 Linux 用户,优先使用 Docker 官方提供的安装脚本。它会根据系统环境配置 Docker 软件源并安装 Engine、containerd、Buildx 和 Compose 插件,省去手动判断发行版、导入密钥和安装依赖的步骤。
最短安装命令:
curl -fsSL https://get.docker.com | sudo sh安装完成后验证:
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world这条路径适合个人开发机、测试机和希望快速完成首次安装的用户。脚本只适用于 Linux Docker Engine,不适用于 Windows/macOS Docker Desktop,也不等于已经完成生产环境加固。
执行边界
这是远程脚本下载后立即执行。脚本会修改软件源并安装系统组件;生产主机、受审计环境或需要固定版本的环境,应先下载并审阅脚本,或直接使用下面的 Ubuntu/RPM 手工安装路径。
需要审阅脚本时,拆成下载、检查、执行三步:
curl -fsSL https://get.docker.com -o get-docker.sh
less get-docker.sh
sudo sh get-docker.sh脚本执行后保留 get-docker.sh 便于审计;确认不再需要时再由管理员按主机清理策略删除。脚本没有替代版本锁定、仓库审计、权限收紧、备份和监控。
2.2 Ubuntu 安装 Docker Engine
下面是 Docker 官方 Ubuntu 仓库路线。它会移除可能与官方 Engine 冲突的旧发行版包,然后添加签名密钥和 stable 软件源。
安装边界
apt-get remove 和写入 /etc/apt/sources.list.d/ 会改变系统软件配置;先记录现有 Docker、containerd 和 Compose 版本,并安排维护窗口。
2.2.1 添加官方仓库
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y "$pkg"; done
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update2.2.2 安装 Engine、Buildx 和 Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
sudo docker version
sudo docker compose version可选的非 root 使用方式:
sudo usermod -aG docker "$USER"
newgrp docker
docker run --rm hello-worlddocker 用户组通常拥有近似 root 的主机控制能力。权限边界严格时,保留 sudo docker ...,或研究 Docker Rootless mode。
2.3 Windows 安装 Docker Desktop
Windows 采用 Docker Desktop 的 Linux 容器模式,默认推荐 WSL 2 后端。先在 Docker Desktop for Windows 官方安装页核对当前 Windows 版本、WSL 2、虚拟化和磁盘要求,再下载对应安装程序。
图形安装流程:
- 在 PowerShell 中检查 WSL;如果尚未安装或版本过旧,再以管理员身份执行:
wsl --status
wsl --install
wsl --updatewsl --install 可能安装默认 Linux 发行版并要求重启;已有可用 WSL 2 的主机不需要重复执行。 2. 安装或更新 WSL 2,并重启系统(如果官方检查提示需要)。 3. 运行 Docker Desktop 安装程序,选择 WSL 2 based engine;安装程序完成后启动 Docker Desktop。 4. 在 Docker Desktop 中确认当前使用 Linux containers;Windows containers 是另一套运行时,不能直接套用本文的 Linux 镜像假设。 5. 在 PowerShell 中验证:
docker version
docker compose version
docker run --rm hello-world需要自动化安装时,官方安装程序支持 PowerShell 的 Start-Process 参数;安装器参数和权限模式会随 Docker Desktop 版本变化,先以官方页面为准,再执行类似命令:
Start-Process 'Docker Desktop Installer.exe' -Wait -ArgumentList 'install','--backend=wsl-2'Windows 容器、Hyper-V 后端、无管理员安装和企业策略属于不同分支;不要把它们与 WSL 2 的默认 Linux 容器路径混在一条命令中。
2.4 macOS 安装 Docker Desktop
在 Docker Desktop for Mac 官方安装页按芯片架构下载安装包:Apple silicon(M 系列)和 Intel 使用不同构建。安装步骤为:打开下载的 .dmg,将 Docker 拖入 Applications,启动 Docker,并按首次启动提示授予所需权限。
启动后在 Terminal 验证:
docker version
docker compose version
docker run --rm hello-worldApple silicon 上运行只提供 amd64 镜像的应用可能触发仿真或兼容性提示;不要把架构不匹配当成 Compose 配置错误。生产部署前应确认目标镜像同时提供 arm64,或明确接受仿真开销。
2.5 CentOS、RHEL、Fedora 和兼容 RPM 发行版
RPM 系统使用 Docker 官方仓库。发行版、主版本和架构必须先在 Docker Engine 安装总览以及对应的 CentOS 安装页或 RHEL 安装页中确认。CentOS Linux 的旧版本已进入生命周期末期时,不要继续使用旧仓库地址;优先选择官方文档列出的 CentOS Stream、RHEL 或兼容发行版。
CentOS Stream 使用 CentOS 仓库:
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
sudo docker version
sudo docker compose versionRHEL 主机使用 Docker 官方 RHEL 仓库,并按官方页面处理订阅、模块流和冲突包:
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repoFedora 使用 Fedora 仓库:
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo如果系统仍使用 yum,可使用发行版提供的 yum-utils 和 yum-config-manager 完成同一仓库配置;不要在未确认发行版版本的情况下混用 CentOS、RHEL 和 Fedora 仓库。安装后用 docker run --rm hello-world 做基础检查,Compose 部署步骤与 Ubuntu 相同。
3. Docker 基础使用
Docker 的对象关系可以先按四层理解:镜像是只读模板,容器是镜像的运行实例,卷或绑定挂载保存容器外的数据,网络负责容器之间和宿主机之间的通信;Compose 用一个 YAML 文件描述一组服务及其关系。后面的 Nginx Demo 会把这些对象串起来。
常用命令按用途分组如下。基础命令使用独立的 my-container 示例;下一节的 Nginx 快速体验会使用另一个临时容器名,避免两条路径互相干扰。
| 用途 | 命令 | 作用 |
|---|---|---|
| 拉取镜像 | docker pull nginx:stable | 从镜像仓库下载镜像 |
| 查看镜像 | docker image ls | 查看本机已有镜像 |
| 查看容器 | docker ps -a | 查看运行中和已停止的容器 |
| 创建并启动 | docker run --name my-container -d nginx:stable | 用镜像创建并后台运行容器 |
| 查看日志 | docker logs my-container | 读取容器标准输出和错误输出 |
| 停止/启动 | docker stop my-container / docker start my-container | 控制已有容器生命周期 |
| 进入容器 | docker exec -it my-container sh | 在运行中的容器内执行命令 |
| 查看详情 | docker inspect my-container | 查看容器、网络和挂载等低层配置 |
| 删除容器 | docker rm my-container | 删除已停止的容器,不删除镜像 |
| 查看卷 | docker volume ls | 查看 Docker 管理的持久化卷 |
| 查看网络 | docker network ls | 查看 Docker 网络及 Compose 项目网络 |
| 查看 Compose | docker compose version | 确认 Compose 插件可用 |
docker rm 只删除容器;docker rmi 才是删除镜像,清理前应确认没有其他容器依赖。不要把 docker system prune、docker volume prune 等全局清理命令当作日常操作,它们可能影响其他项目的数据。
4. Nginx Demo:Docker 快速体验
该命令只验证镜像拉取、容器启动和端口访问,不挂载项目目录;使用 --rm 停止后清理容器,不作为正式部署方案。
docker run --rm --name nginx-trial -p 8080:80 nginx:stable另开终端检查:
curl -I http://127.0.0.1:8080看到成功的 HTTP 响应后按 Ctrl-C 停止;后台运行时使用 docker stop nginx-trial。
5. Nginx Demo:Compose 正式部署
5.1 创建目录和首页
mkdir -p "$HOME/docker/nginx/html"
cd "$HOME/docker/nginx"
printf '%s\n' '<!doctype html><meta charset="utf-8"><title>Docker Nginx</title><h1>Docker Compose 已部署</h1>' > html/index.html5.2 写入 compose.yaml
services:
web:
image: nginx:stable
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stoppedstable 会跟随官方稳定线,长期运行建议在变更窗口前固定到已核验版本或 digest。html/ 只读挂载到 Nginx 默认网页目录,容器重建不会丢失宿主机文件。
5.3 拉取并启动
docker compose pull
docker compose config
docker compose up -d
docker compose psconfig 不应报 YAML 错误,ps 中 web 应处于 Up 状态。
6. Nginx Demo:验证部署结果
docker compose ps
curl -fsS http://127.0.0.1:8080
docker compose logs --tail=50 web页面应包含 Docker Compose 已部署,日志不应持续报错。验证持久化:
printf '%s\n' 'persistent-check' >> html/index.html
docker compose up -d --force-recreate
curl -fsS http://127.0.0.1:8080 | grep -F persistent-check命中 persistent-check 表示文件来自宿主机绑定挂载;这不等于已经完成备份恢复演练。
7. Nginx Demo:日常运维、备份与升级
docker compose restart web
docker compose logs --tail=100 web
cd "$HOME/docker/nginx"
tar -czf "nginx-backup-$(date +%F).tgz" compose.yaml html
docker image inspect nginx:stable > "nginx-image-$(date +%F).json"本示例只有静态文件,备份可用文件归档;包含 PostgreSQL、MySQL、SQLite 或上传目录的项目必须采用对应数据库的原生备份,并单独保存配置和上传文件。恢复时先停服务,解压到确认过的目录,再运行 docker compose config、up -d 和 HTTP 检查。
回滚只能回到保留的镜像标签或 digest。包含数据库迁移的应用,必须先确认迁移是否可逆,不能把 docker compose down 当成数据库回滚工具。
8. 常见问题(Nginx Demo)
permission denied while trying to connect to the Docker daemon socket
先用 sudo docker ... 判断是否为当前用户权限问题;使用 docker 用户组时,执行 usermod 后重新登录。不要把 /var/run/docker.sock 暴露给不可信用户或容器。
address already in use
ss -ltnp | grep ':8080 '将 Compose 中的宿主机端口改成 18080:80,容器内端口仍为 80,再执行 docker compose up -d。
all predefined address pools have been fully subnetted
这是 Docker 创建项目网络时的地址池耗尽或网段重叠问题,不是 Nginx 配置错误。先执行 docker network ls、docker network inspect bridge 和 ip route,不要直接执行全局 docker network prune 或修改 /etc/docker/daemon.json。完整诊断见 docker-network-address-pool-exhaustion-guide。
9. 生产部署前的最低加固(Nginx Demo)
- 固定镜像版本或 digest,升级前保存当前镜像和配置。
- 只开放必要端口;公网访问应在反向代理后配置 TLS,不要暴露 Docker daemon API。
- 将 Compose 文件、网页文件、日志和备份纳入主机备份策略,并定期恢复演练。
- 不把密码、令牌或私钥写进 Compose 文件、Shell 历史和日志。
- 监控磁盘、容器状态和证书有效期,并限制日志增长。
部署完成后
本地或内网使用可以保留 8080;需要公网访问时,再增加域名、TLS 和反向代理,并把公网端口限制在代理服务。下一次升级前固定新镜像、备份项目目录,先完成配置和 HTTP 验收,再清理旧镜像。
总结
本文先用 Docker 官方安装脚本或 Docker Desktop 完成跨平台安装,再用基础命令建立镜像、容器、卷、网络和 Compose 的操作概念。Nginx 只作为 Demo:docker run 用于临时体验,Compose 用于初始化一个可维护的单机服务;正式配置把网页目录绑定到宿主机,因此容器重建不会丢失网页文件。
本文只覆盖单机、单容器静态站点;没有在线拉取镜像,也没有验证公网 TLS、数据库备份或跨主机高可用。用于其他应用时,必须以应用自己的镜像、端口、环境变量、数据路径和迁移文档替换 Nginx 示例。
参考资料
- Docker Engine 安装总览 - 核对日期:2026-08-26;当前网络不可达,未做在线快照。
- Docker 官方安装脚本 - 核对日期:2026-08-26;用于 Linux 快速安装入口;脚本内容和当前网络状态未在本机执行核验。
- Ubuntu 安装 Docker Engine - 核对日期:2026-08-26;用于 apt 仓库和软件包命令。
- CentOS 安装 Docker Engine - 核对日期:2026-08-26;用于 CentOS/RPM 仓库路径,当前网络未能读取正文。
- RHEL 安装 Docker Engine - 核对日期:2026-08-26;用于 RHEL 仓库路径,订阅和模块流以当前系统为准。
- Docker Desktop for Windows 安装 - 页面更新时间:2026-08-13;用于 WSL 2、安装器参数和 Windows 容器边界。
- Docker Desktop for Mac 安装 - 核对日期:2026-08-26;用于 Intel/Apple silicon 下载和图形安装路径,当前网络未能读取正文。
- Docker Compose 安装 - 核对日期:2026-08-26;用于 Compose 插件边界。
- Linux 安装后配置 - 核对日期:2026-08-26;用于 docker 用户组和 daemon 权限警告。
- Docker Compose 文件参考 - 核对日期:2026-08-26;用于
services、ports、volumes和restart语法。 - Nginx 官方镜像 - 核对日期:2026-08-26;用于镜像名称、默认 HTTP 端口和网页目录约定;当前网络不可达,未在线核对标签列表。