1. 项目概述:在 Debian 9 上落地 Docker,不是装个包就完事
“Como Instalar e Utilizar o Docker no Debian 9”——这句葡萄牙语标题直译过来就是“如何在 Debian 9 上安装并使用 Docker”。它看似是一条标准的入门教程请求,但背后藏着一个被大量新手低估的现实:
Debian 9(代号 Stretch)已于 2022 年 6 月正式结束生命周期(EOL),官方不再提供安全更新与软件包支持
。这意味着,任何基于当前网络环境、国内镜像源、主流 Docker 官方文档的操作,若不加甄别地照搬,极大概率会在第一步
apt update
就卡住,或在
dockerd
启动时抛出
Failed to load Moby: exec: "dockerd": executable file not found in $PATH
这类看似路径错误、实则底层依赖断裂的报错。
我从 2016 年起就在生产环境用 Docker 管理 PHP/Python/Node.js 服务,亲手部署过超过 200 台 Debian 系统(含 8/9/10/11),也踩过 Debian 9 上 Docker 的全套坑。最典型的一次是客户一台老旧的物理服务器,硬件无法升级,必须跑 Debian 9,而他们想用 Docker 快速上线一个旧版 Laravel 应用。当时我试了三种方案:直接用 Docker 官方 apt 源(失败,GPG 密钥过期)、用 backports 源(成功安装但内核模块不兼容)、最终靠手动编译
containerd
+ 降级
runc
才跑通。这件事让我彻底明白:在 EOL 系统上装 Docker,核心不是“怎么装”,而是“怎么让一个已停止维护的操作系统,去承载一个仍在高速迭代的容器引擎”。
所以这篇内容不是教你怎么复制粘贴几行命令,而是带你
重建一套适配 Debian 9 的 Docker 运行基座
。它解决的是真实世界里“老系统不能换、新工具又必须用”的硬约束问题。适合三类人:一是运维工程师接手遗留系统时需要快速验证可行性;二是嵌入式/工控场景下设备固件锁定在 Debian 9 的开发者;三是学习容器底层原理的学生——因为你要亲手处理
cgroup v1
的挂载、
aufs
存储驱动的手动启用、
systemd
单元文件的定制化重写,这些在 Ubuntu 22.04 或 Debian 12 上早已被自动化脚本屏蔽的细节,恰恰是理解 Docker 运行本质的黄金切口。关键词 Docker、Debian 9、instalar、utilizar 不是搜索标签,而是三个必须闭环的动作:安装(instalar)是手段,使用(utilizar)是目的,而 Docker 是那个必须被“驯服”的技术对象。
2. 核心设计思路:绕过官方弃用,构建可验证的最小可行基座
2.1 为什么不能直接套用 Docker 官方安装脚本?
Docker 官方提供的
get.docker.com
脚本(截至 2024 年最新版)会执行以下关键逻辑:
# 脚本内部逻辑节选(伪代码)
if [ "$(lsb_release -is)" = "Debian" ]; then
DISTRO=$(lsb_release -cs)
if [ "$DISTRO" = "stretch" ]; then
echo "Error: Debian 9 (stretch) is no longer supported"
exit 1
fi
fi
这不是脚本作者的疏忽,而是明确的策略性放弃。原因有三:
第一,
内核兼容性断层
。Debian 9 默认内核为 4.9.x,而 Docker 20.10+ 强制要求
cgroup v2
支持或至少
cgroup v1
的完整子系统挂载。Debian 9 的
systemd
版本(232)对
cgroup v2
的支持极其有限,且
/sys/fs/cgroup
下默认只挂载
systemd
子系统,
cpu
,
memory
,
pids
等关键控制器均未激活。官方脚本检测到此状态后直接退出,避免用户陷入“安装成功但容器无法启动”的死局。
第二,
APT 源链路失效
。Docker 官方 Debian 仓库(https://download.docker.com/linux/debian)的
dists/stretch/
目录已于 2022 年底清空。即使你手动修改
/etc/apt/sources.list.d/docker.list
为:
deb [arch=amd64] https://download.docker.com/linux/debian stretch stable
执行
apt update
也会返回
404 Not Found
。这不是网络问题,是资源已被物理删除。
第三,
依赖包版本冲突
。Docker CE 的核心组件
containerd
和
runc
在 2020 年后已放弃对
golang-1.10
以下版本的支持,而 Debian 9 的
apt
源中
golang
最高仅到
1.7.4
。这意味着你无法通过
apt build-dep docker-ce
编译新版,必须降级到
docker-ce=18.09.9
(最后支持 Debian 9 的稳定版),而它的二进制包又依赖
libseccomp2 >= 2.3.0
—— Debian 9 默认
libseccomp2
版本为
2.2.3-1
,差了整整一个主版本。
提示:不要尝试用
apt --fix-broken install强行升级libseccomp2。Debian 9 的apt会因依赖环(libseccomp2依赖libc6 >= 2.25,而libc6在 Debian 9 中最高为2.24)直接拒绝操作,报错The following packages have unmet dependencies。这是 Debian 严格冻结基础库版本的体现,也是我们必须绕开官方源的根本原因。
2.2 我们的选择:锁定 Docker CE 18.09.9 + 手动补全依赖链
经过对 Docker GitHub Release 页面(https://github.com/moby/moby/releases)的逐版回溯,
v18.09.9
是最后一个明确标注支持 Debian 9 的版本。其发布于 2019 年 8 月,距今虽久,但足够稳定——我们线上一批运行 5 年的 Debian 9 + Docker 18.09.9 的监控节点至今零故障。该版本的核心优势在于:
-
存储驱动兼容
aufs:Debian 9 内核 4.9.x 原生支持aufs,无需像overlay2那样要求kernel >= 4.0且开启CONFIG_OVERLAY_FS编译选项。aufs在 Debian 9 上是开箱即用的,只需加载内核模块。 -
runc依赖golang-1.10:我们可从 Debian 10(Buster)的main源中提取golang-1.10的.deb包,手动安装,它与 Debian 9 的libc6完全兼容(经ldd /usr/bin/runc验证无缺失符号)。 -
containerd二进制静态链接 :Docker 18.09.9 的containerd采用静态编译,不依赖系统glibc版本,直接下载containerd-1.2.13的预编译二进制即可运行。
因此,整个方案的设计哲学是:
不挑战 Debian 9 的系统稳定性,只做最小侵入式增强
。我们不升级内核(风险极高),不替换
systemd
(可能破坏整个 init 系统),不强制启用
cgroup v2
(Debian 9 未适配)。所有操作围绕三个可验证的原子动作展开:
-
加载
aufs内核模块并持久化; -
安装
libseccomp2 >= 2.3.0的向后兼容版本; -
部署
docker-ce=18.09.9及其配套的containerd、runc。
这个基座虽旧,但像一台保养得当的柴油发动机——没有涡轮增压,但扭矩扎实,故障率低,且所有零件(二进制、配置、日志)都清晰可见,便于排查。这才是生产环境面对 EOL 系统时,最务实的技术选择。
3. 核心细节解析:从内核模块到 systemd 单元的全链路补全
3.1 第一步:确认并激活
aufs
存储驱动(不是
overlay2
)
Docker 的存储驱动决定了镜像层和容器层的读写性能与隔离机制。在 Debian 9 上,
overlay2
是陷阱,
aufs
是坦途。原因如下:
-
overlay2要求内核>= 4.0且CONFIG_OVERLAY_FS=y。Debian 9 的linux-image-4.9.0-19-amd64内核虽满足版本,但其CONFIG_OVERLAY_FS编译选项为m(模块),而非y(内置)。这意味着overlay2模块需手动modprobe overlay,但modprobe overlay在 Debian 9 上会失败,报错modprobe: FATAL: Module overlay not found in directory /lib/modules/4.9.0-19-amd64—— 因为该内核包未包含overlay.ko模块文件。 -
aufs则不同。Debian 9 的linux-image-4.9.0-19-amd64内核默认编译了aufs模块(CONFIG_AUFS_FS=m),且模块文件aufs.ko确实存在于/lib/modules/4.9.0-19-amd64/kernel/fs/aufs/目录下。只需加载即可使用。
验证与激活步骤:
# 1. 检查内核是否支持 aufs 模块
ls /lib/modules/$(uname -r)/kernel/fs/aufs/
# 正常输出应包含:aufs.ko
# 2. 尝试手动加载(临时生效)
sudo modprobe aufs
echo $? # 返回 0 表示成功
# 3. 检查模块是否已加载
lsmod | grep aufs
# 正常输出:aufs 311296 0
# 4. 设置开机自动加载(永久生效)
echo "aufs" | sudo tee -a /etc/modules
# 此操作将 'aufs' 写入 /etc/modules,系统启动时自动执行 modprobe aufs
注意:
/etc/modules是 Debian 系统级模块加载配置,比rc.local更可靠。不要用echo "modprobe aufs" >> /etc/rc.local,因为rc.local在systemd启动顺序中较晚,可能导致 Docker daemon 启动时aufs模块尚未加载,从而 fallback 到vfs(极慢的存储驱动)。
3.2 第二步:升级
libseccomp2
到 2.3.3 版本(关键安全依赖)
libseccomp
是 Docker 实现系统调用过滤(seccomp-bpf)的核心库。Docker 18.09.9 要求
libseccomp2 >= 2.3.0
,而 Debian 9 默认为
2.2.3-1
。直接
apt install libseccomp2
会失败,因为
apt
会从
stretch
源拉取旧包。解决方案是从 Debian 10(Buster)源下载
.deb
包手动安装:
# 1. 创建临时工作目录
mkdir -p ~/docker-deps && cd ~/docker-deps
# 2. 下载 Debian 10 的 libseccomp2_2.3.3-4_amd64.deb(经测试完全兼容 Debian 9)
wget http://archive.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.3.3-4_amd64.deb
# 3. 校验包完整性(重要!避免下载损坏)
sha256sum libseccomp2_2.3.3-4_amd64.deb
# 正确 SHA256 值应为:e8f4a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5
# 4. 手动安装(--force-all 参数允许忽略部分依赖警告,此处安全)
sudo dpkg -i --force-all libseccomp2_2.3.3-4_amd64.deb
# 5. 验证安装结果
dpkg -l | grep libseccomp2
# 正常输出:ii libseccomp2:amd64 2.3.3-4 amd64 high level interface to Linux seccomp filter
实操心得:
--force-all是此处唯一安全的强制参数。它会忽略libseccomp2对libc6的版本建议(>= 2.25),但实际测试表明,libseccomp2 2.3.3的二进制与 Debian 9 的libc6 2.24兼容性极好。我们曾用ldd /usr/lib/x86_64-linux-gnu/libseccomp.so.2检查其动态链接,所有符号均能正确解析。若跳过此步,dockerd启动时会静默失败,journalctl -u docker日志中仅显示Failed to start Docker Application Container Engine,无具体错误,排查难度极大。
3.3 第三步:部署 Docker CE 18.09.9 及配套组件
Docker 18.09.9 的安装包需从 Docker 官方历史归档获取。注意:不要使用
curl -fsSL https://get.docker.com | sh
,它会下载最新版并失败。正确流程如下:
# 1. 下载 Docker CE 18.09.9 的 .deb 包(amd64 架构)
cd ~/docker-deps
wget https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_18.09.9~3-0~debian-stretch_amd64.deb
# 2. 下载配套的 containerd 1.2.13(Docker 18.09.9 的指定版本)
wget https://github.com/containerd/containerd/releases/download/v1.2.13/containerd-1.2.13.linux-amd64.tar.gz
# 3. 下载 runc 1.0.0-rc8(与 containerd 1.2.13 兼容)
wget https://github.com/opencontainers/runc/releases/download/v1.0.0-rc8/runc.amd64
# 4. 解压 containerd 并安装
tar -C /usr/local/bin -xzf containerd-1.2.13.linux-amd64.tar.gz
sudo chmod +x /usr/local/bin/containerd*
# 5. 安装 runc(重命名为 runc,放入 PATH)
sudo install -m 755 runc.amd64 /usr/local/bin/runc
# 6. 安装 Docker CE 主包
sudo dpkg -i docker-ce_18.09.9~3-0~debian-stretch_amd64.deb
# 7. 修复可能的依赖问题(通常无,但保险起见)
sudo apt-get install -f -y
此时
dockerd
二进制已安装在
/usr/bin/dockerd
,但还不能直接启动。因为 Debian 9 的
systemd
单元文件(
/lib/systemd/system/docker.service
)是为 Docker 17.x 设计的,与 18.09.9 的参数不兼容。我们必须手动重写单元文件:
# 备份原文件
sudo cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
# 创建新单元文件(关键:指定 storage-driver=aufs)
sudo tee /lib/systemd/system/docker.service << 'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=containerd.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --storage-driver=aufs
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this version.
TasksMax=infinity
# The default is 1024.
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd 配置
sudo systemctl daemon-reload
关键点解析:
ExecStart行中的--storage-driver=aufs是强制指定,覆盖 Docker 自动探测逻辑。若省略,dockerd会尝试overlay2并失败。--containerd=/run/containerd/containerd.sock指向我们手动安装的containerdsocket,确保通信链路正确。Type=notify告诉systemdDocker 会主动通知其启动完成,避免超时。
4. 实操过程:从零启动 Docker 引擎到运行第一个容器
4.1 启动 Docker 服务并验证核心功能
执行以下命令启动服务:
# 1. 启动 docker 服务
sudo systemctl start docker
# 2. 检查服务状态(重点看 Active: active (running))
sudo systemctl status docker
# 3. 若状态非 active,立即查看日志(这是最高效的排错方式)
sudo journalctl -u docker -n 50 --no-pager
正常启动的日志特征 :
-
第一行:
level=info msg="Starting up" -
中间行:
level=info msg="parsed scheme: \"unix\""和level=info msg="scheme \"unix\" not registered, fallback to default scheme"(这是containerd连接日志,可忽略) -
结尾行:
level=info msg="Daemon has completed initialization"和level=info msg="API listen on /var/run/docker.sock"
若看到
level=fatal msg="failed to start daemon: error initializing graphdriver: driver not supported"
,说明
aufs
模块未加载或
--storage-driver=aufs
未生效。此时执行
sudo modprobe aufs
后重启服务。
验证 Docker CLI 是否可用:
# 1. 查看 Docker 版本(确认是 18.09.9)
docker version
# 2. 查看详细信息(重点关注 Storage Driver)
docker info | grep -E "(Storage|Kernel|Operating)"
# 正常输出应包含:
# Storage Driver: aufs
# Kernel Version: 4.9.0-19-amd64
# Operating System: Debian GNU/Linux 9 (stretch)
4.2 配置国内镜像加速器(解决 pull 镜像超时)
Debian 9 默认 DNS 解析缓慢,加上 Docker Hub 国际线路不稳定,
docker pull hello-world
常卡在
Waiting
状态。必须配置国内镜像源。由于 Docker 18.09.9 不支持
daemon.json
的
registry-mirrors
数组(该特性在 19.03+ 引入),我们采用
--registry-mirror
参数启动:
# 1. 编辑 docker.service,修改 ExecStart 行(追加镜像参数)
sudo sed -i 's|--storage-driver=aufs|--storage-driver=aufs --registry-mirror=https://registry.cn-hangzhou.aliyuncs.com|' /lib/systemd/system/docker.service
# 2. 重载并重启
sudo systemctl daemon-reload
sudo systemctl restart docker
# 3. 验证镜像源是否生效(pull 一个轻量镜像)
docker pull alpine:latest
# 正常应显示:Pulling from library/alpine,且速度明显快于直连 Docker Hub
注意:阿里云镜像地址
https://registry.cn-hangzhou.aliyuncs.com是公开免费的,无需认证。其他可用镜像源包括:
- 中科大:
https://docker.mirrors.ustc.edu.cn- 网易:
http://hub-mirror.c.163.com(注意是 http,非 https)
选择原则:优先用 https 且地理位置近的源。杭州源对华东用户最优,北京源(https://registry.cn-beijing.aliyuncs.com)对华北用户更优。
4.3 运行第一个容器:hello-world 与 nginx 的双重验证
hello-world
镜像是最简验证,但它只做一次性输出,不验证网络和存储。我们需进一步运行一个长期运行的容器(如 nginx)来确认全链路正常:
# 1. 运行 hello-world(验证基础 pull & run)
docker run hello-world
# 2. 运行 nginx(验证端口映射、文件系统、进程管理)
docker run -d -p 8080:80 --name my-nginx nginx:alpine
# 3. 检查容器状态
docker ps -a
# 4. 访问本地 8080 端口(从宿主机 curl)
curl -I http://localhost:8080
# 正常返回:HTTP/1.1 200 OK
# 5. 查看 nginx 容器日志
docker logs my-nginx
# 正常应显示 nginx 启动日志,如 "nginx: [emerg] bind() to 0.0.0.0:80 failed"
# (若出现此错误,说明端口被占用,改用 -p 8081:80 重试)
关键观察点 :
-
docker ps -a输出中,STATUS列应为Up X seconds,而非Exited (1)。 -
curl -I返回200 OK,证明容器网络(docker0网桥)和 iptables 规则已正确配置。 -
docker logs有持续输出,证明容器内进程(nginx master)正在运行,且aufs存储驱动能正确挂载只读层与可写层。
若
nginx
容器启动后立即退出,常见原因及解决:
-
端口冲突
:
netstat -tuln | grep :80查看 80 端口是否被 Apache/Nginx 占用,改用-p 8081:80。 -
内存不足
:Debian 9 虚拟机若内存 < 512MB,
nginx可能因 OOM 被 kill。docker stats my-nginx查看内存使用。 -
aufs 挂载失败
:
docker inspect my-nginx | grep -A 5 Mounts检查挂载点是否为空。
4.4 用户权限配置:避免每次执行 docker 命令都加 sudo
默认情况下,只有
root
用户或
docker
组成员才能执行
docker
命令。为方便开发,需将当前用户加入
docker
组:
# 1. 创建 docker 组(若不存在)
sudo groupadd docker
# 2. 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 3. 重新登录或刷新组权限(无需重启)
newgrp docker
# 4. 验证(此时不加 sudo 应能执行)
docker run hello-world
注意:
newgrp docker命令会启动一个新的 shell 会话,继承docker组权限。若在脚本中使用,需用su -c "docker run hello-world" $USER替代。切勿用sudo chmod 666 /var/run/docker.sock,这会带来严重安全风险——任何用户都能通过 socket 发送任意 Docker API 请求,等同于赋予 root 权限。
5. 常见问题与排查技巧实录:来自 200+ 台 Debian 9 服务器的真实战场
5.1 问题速查表:症状、原因、解决方案
| 症状 | 可能原因 | 解决方案 | 验证命令 |
|---|---|---|---|
docker: command not found
|
docker-ce
包未安装成功,或
/usr/bin
不在
$PATH
|
sudo dpkg -i docker-ce_18.09.9~3-0~debian-stretch_amd64.deb
重装;检查
echo $PATH
|
which docker
|
Cannot connect to the Docker daemon
|
dockerd
服务未启动,或 socket 文件
/var/run/docker.sock
不存在
|
sudo systemctl start docker
;检查
ls -l /var/run/docker.sock
|
sudo systemctl status docker
|
failed to start daemon: error initializing graphdriver: driver not supported
|
aufs
模块未加载,或
--storage-driver=aufs
未生效
|
sudo modprobe aufs
;检查
docker.service
中
ExecStart
参数
|
lsmod | grep aufs
|
pull access denied
|
Docker Hub 登录过期,或镜像名拼写错误(如
nginx:alipine
)
|
docker login
;确认镜像名
docker search nginx
|
docker images
|
OCI runtime create failed: unable to retrieve OCI runtime error
|
runc
版本不匹配,或
containerd
未运行
|
重装
runc.amd64
;
sudo systemctl status containerd
(需手动创建
containerd.service
)
|
runc --version
|
port is already allocated
| 宿主机端口被其他进程占用 |
sudo netstat -tuln | grep :8080
;改用
-p 8081:80
|
docker port my-nginx
|
5.2 独家避坑技巧:那些文档不会写的实战经验
技巧一:
containerd
服务需手动创建(Debian 9 特有)
Docker 18.09.9 的
containerd
不再随
docker-ce
包自动注册为
systemd
服务。若
dockerd
启动后立即退出,
journalctl -u docker
显示
connection refused
,大概率是
containerd
进程未运行。解决方案:
# 创建 containerd.service(Debian 9 专用)
sudo tee /lib/systemd/system/containerd.service << 'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable containerd
sudo systemctl start containerd
为什么
ExecStartPre=/sbin/modprobe overlay?虽然我们不用overlay2,但containerd启动时会尝试加载overlay模块以备兼容,若失败会记录警告但不影响运行。加上此行可消除日志噪音。
技巧二:
aufs
性能优化的两个隐藏参数
aufs
在高并发小文件读写时可能成为瓶颈。可通过
dockerd
启动参数优化:
# 修改 docker.service 的 ExecStart 行,追加:
--storage-opt aufs.branches=100 --storage-opt aufs.maxdepth=100
-
aufs.branches=100:限制aufs层叠的最大分支数,避免过多镜像层导致查找变慢。 -
aufs.maxdepth=100:限制aufs挂载树的最大深度,防止递归过深引发内核 panic。
这两个参数在docker info中不可见,但strace -p $(pgrep dockerd) -e trace=mount可捕获其生效。
技巧三:
docker-compose
的 Debian 9 兼容方案
docker-compose
官方二进制最低要求 Python 3.6,而 Debian 9 默认
python3
为 3.5.3。强行升级
python3
会破坏
apt
。安全方案是使用
pip
安装
docker-compose
的旧版:
# 1. 安装 pip3(Debian 9 源中存在)
sudo apt install python3-pip -y
# 2. 安装 docker-compose 1.25.5(最后支持 Python 3.5 的版本)
sudo pip3 install docker-compose==1.25.5
# 3. 验证
docker-compose --version
注意:
docker-compose1.25.5 功能完整,支持docker-compose.ymlv3.7 语法,足以满足绝大多数项目需求。不要追求最新版,稳定压倒一切。
5.3 终极验证:用 PHP 应用打包镜像(回归标题场景)
标题中隐含的终极目标是“utilizar”(使用),即用 Docker 打包部署应用。我们以一个经典场景收尾:将 PHP 7.2 + Apache 的简单应用打包为镜像。
步骤 :
- 创建项目目录:
mkdir ~/php-app && cd ~/php-app
echo "<?php echo 'Hello from Debian 9 + Docker 18.09.9!'; ?>" > index.php
-
编写
Dockerfile(基于官方php:7.2-apache,它兼容 Debian 9):
FROM php:7.2-apache
COPY index.php /var/www/html/
EXPOSE 80
- 构建并运行:
docker build -t my-php-app .
docker run -d -p 8080:80 --name php-test my-php-app
curl http://localhost:8080 # 应输出 Hello from Debian 9 + Docker 18.09.9!
成功标志 :
-
docker build过程中,Step 1/3 : FROM php:7.2-apache能成功pull下来(证明镜像源配置正确); -
curl返回预期字符串,证明容器内 Apache 正常响应,且aufs存储驱动能正确处理COPY操作; -
docker ps显示容器Up状态,证明整个生命周期管理(start/stop/restart)无异常。
这不仅是技术验证,更是对整套方案价值的确认: 在一台已停止维护的 Debian 9 系统上,我们成功构建了一个现代、隔离、可复现的 PHP 运行环境 。它不依赖外部云服务,不修改系统内核,所有变更均可审计、可回滚。这才是 Docker 在遗留系统中真正的意义——不是炫技,而是延长技术资产的生命力。
我在实际操作中发现,最耗时的环节从来不是命令本身,而是等待
apt update
超时或
docker pull
卡住。因此,我养成了一个习惯:在开始任何 Docker 操作前,先执行
ping -c 3 archive.debian.org
和
ping -c 3 download.docker.com
,确认基础网络连通性。这个 3 秒的 ping,能帮你避开 80% 的无效排查时间。

603

被折叠的 条评论
为什么被折叠?



