Debian 生产环境安装 Docker:从部署到安全优化实战教程
Debian Docker部署教程|生产环境实测
在生产环境中部署 Docker,看似只是执行几条安装命令,但真正落地时往往会涉及系统版本选择、软件源配置、存储驱动、日志管理、服务自启动、防火墙、安全加固、镜像加速、数据持久化、故障排查等多个环节。如果只是按照网上零散命令安装,很容易出现后期运行不稳定、磁盘被日志打满、容器重启后数据丢失、Docker 服务异常无法恢复等问题。
本文基于 Debian 生产环境实测经验,从系统准备到 Docker 安装,再到 Docker Compose、容器部署、日志与安全优化,完整讲解如何在 Debian 服务器上部署 Docker,并给出适合生产环境使用的配置建议。
一、环境说明
本文测试环境如下:
| 项目 | 配置 |
|---|---|
| 操作系统 | Debian 12 / Debian 11 |
| 架构 | x86_64 |
| 用户权限 | root 或具备 sudo 权限的普通用户 |
| Docker 版本 | Docker CE 最新稳定版 |
| 部署场景 | Web 服务、数据库、中间件、反向代理等生产环境 |
本文命令默认以 root 用户执行。如果你使用普通用户,请在命令前添加 sudo。
查看当前系统版本:
cat /etc/debian_version
lsb_release -a
如果系统没有安装 lsb_release,可以先执行:
apt update
apt install -y lsb-release
二、部署前准备
1. 更新系统软件包
生产环境部署前,建议先更新软件包索引,并升级已有组件:
apt update
apt upgrade -y
如果服务器运行着重要业务,不建议直接在高峰期执行全量升级,尤其是内核、安全组件、数据库相关依赖可能需要重启服务。可以选择维护窗口操作。
2. 安装必要依赖
Docker 官方源需要使用 HTTPS,并依赖一些基础工具:
apt install -y ca-certificates curl gnupg lsb-release apt-transport-https
这些依赖的作用如下:
ca-certificates:用于校验证书;curl:用于下载 Docker GPG 密钥;gnupg:用于处理软件源签名;lsb-release:用于识别系统发行版本;apt-transport-https:支持 HTTPS 软件源。
三、卸载旧版本 Docker
如果服务器之前安装过 Docker,建议先清理旧版本,避免包冲突:
apt remove -y docker docker-engine docker.io containerd runc
该命令不会删除 /var/lib/docker 中已有的数据。如果你是重新部署并确定不需要旧数据,可以谨慎清理:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
注意:
/var/lib/docker中通常包含镜像、容器、卷、网络等数据,生产环境不要随意删除。
四、配置 Docker 官方软件源
1. 添加 Docker GPG 密钥
执行以下命令:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
2. 添加 Docker APT 源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" \
> /etc/apt/sources.list.d/docker.list
更新软件源:
apt update
如果更新时没有报错,说明 Docker 官方源配置成功。
五、安装 Docker Engine
执行安装命令:
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成后,查看 Docker 版本:
docker version
查看 Docker 服务状态:
systemctl status docker
如果 Docker 未启动,可以执行:
systemctl start docker
设置开机自启动:
systemctl enable docker
六、验证 Docker 是否安装成功
运行官方测试容器:
docker run hello-world
如果看到类似输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
说明 Docker 已经安装成功。
查看当前 Docker 信息:
docker info
常用检查项包括:
Server Version:Docker 服务端版本;Storage Driver:存储驱动,通常为overlay2;Cgroup Driver:生产环境建议与系统保持一致;Docker Root Dir:默认数据目录为/var/lib/docker;Logging Driver:默认日志驱动通常为json-file。
七、配置国内镜像加速
在国内服务器上,拉取 Docker Hub 镜像可能较慢,甚至失败。可以通过配置镜像加速改善体验。
创建或编辑 Docker 配置文件:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
写入如下内容:
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
保存后重启 Docker:
systemctl daemon-reload
systemctl restart docker
验证配置是否生效:
docker info
在输出中查找:
Registry Mirrors
如果显示配置的镜像地址,则说明生效。
说明:镜像加速地址可能会变化,生产环境建议根据实际网络情况选择稳定服务商。
八、生产环境日志配置
Docker 默认使用 json-file 作为日志驱动。如果不限制日志大小,容器长时间运行后,日志文件可能占满磁盘。
容器日志通常位于:
/var/lib/docker/containers/
查看 Docker 占用空间:
docker system df
生产环境建议在 /etc/docker/daemon.json 中设置日志限制:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
配置含义:
max-size:单个日志文件最大大小;max-file:最多保留几个日志文件。
修改后重启 Docker:
systemctl restart docker
注意:该配置对新创建的容器生效,已存在容器可能需要重新创建。
九、Docker 数据目录规划
Docker 默认数据目录是:
/var/lib/docker
如果系统盘空间较小,生产环境建议将 Docker 数据目录迁移到数据盘,例如 /data/docker。
1. 停止 Docker 服务
systemctl stop docker
systemctl stop containerd
2. 创建新目录
mkdir -p /data/docker
3. 同步旧数据
rsync -avx /var/lib/docker/ /data/docker/
如果没有安装 rsync:
apt install -y rsync
4. 修改 Docker 配置
编辑:
vim /etc/docker/daemon.json
加入:
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
如果已有其他配置,需要保证 JSON 格式正确,不能出现多个根对象。
5. 启动 Docker
systemctl start containerd
systemctl start docker
查看是否生效:
docker info | grep "Docker Root Dir"
确认输出为:
Docker Root Dir: /data/docker
确认无误后,可以备份并删除旧目录:
mv /var/lib/docker /var/lib/docker.bak
观察一段时间没有问题后再删除:
rm -rf /var/lib/docker.bak
十、安装与使用 Docker Compose
从 Docker 官方源安装时,已经安装了 Compose 插件:
docker compose version
注意,现在推荐使用:
docker compose
而不是旧版的:
docker-compose
如果业务脚本依赖 docker-compose 命令,可以创建软链接,但更建议更新脚本。
十一、使用 Docker Compose 部署 Nginx 示例
下面以 Nginx 为例,演示生产环境中较规范的 Compose 部署方式。
创建项目目录:
mkdir -p /opt/docker/nginx
cd /opt/docker/nginx
创建 docker-compose.yml:
services:
nginx:
image: nginx:1.26-alpine
container_name: nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
environment:
- TZ=Asia/Shanghai
创建目录:
mkdir -p conf.d html logs
创建测试页面:
echo "Hello Docker on Debian" > html/index.html
创建 Nginx 配置文件:
vim conf.d/default.conf
写入:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
启动服务:
docker compose up -d
查看容器状态:
docker ps
访问服务器 IP:
http://服务器IP
如果页面显示 Hello Docker on Debian,说明部署成功。
查看日志:
docker logs nginx
停止服务:
docker compose down
重启服务:
docker compose restart
十二、生产环境常用 Docker 命令
1. 容器管理
查看运行中的容器:
docker ps
查看所有容器:
docker ps -a
启动容器:
docker start 容器名
停止容器:
docker stop 容器名
重启容器:
docker restart 容器名
删除容器:
docker rm 容器名
强制删除运行中的容器:
docker rm -f 容器名
2. 镜像管理
查看镜像:
docker images
拉取镜像:
docker pull nginx:1.26-alpine
删除镜像:
docker rmi 镜像ID
清理无用镜像:
docker image prune
清理所有未使用资源:
docker system prune
如果需要清理未使用镜像、容器、网络和构建缓存:
docker system prune -a
注意:生产环境执行清理命令前一定要确认业务是否仍依赖相关镜像。
3. 日志查看
查看容器日志:
docker logs 容器名
实时查看日志:
docker logs -f 容器名
查看最近 100 行:
docker logs --tail=100 容器名
按时间查看:
docker logs --since="2024-01-01T00:00:00" 容器名
十三、防火墙与端口放行
Debian 常见防火墙工具包括 iptables、nftables、ufw。Docker 会自动创建一些网络规则,因此在生产环境中需要谨慎配置。
如果使用 ufw,安装命令:
apt install -y ufw
允许 SSH:
ufw allow 22/tcp
允许 HTTP 和 HTTPS:
ufw allow 80/tcp
ufw allow 443/tcp
启用防火墙:
ufw enable
查看状态:
ufw status
重要提醒:远程服务器启用防火墙前,务必确认 SSH 端口已放行,否则可能导致无法登录服务器。
对于 Docker 生产环境,如果安全要求较高,建议结合云厂商安全组、主机防火墙、反向代理访问控制一起使用,而不是只依赖 Docker 端口映射。
十四、容器自启动策略
生产环境中容器必须具备异常退出自动恢复能力。Docker 常用重启策略如下:
| 策略 | 说明 |
|---|---|
no |
默认策略,不自动重启 |
always |
容器退出后总是自动重启 |
unless-stopped |
除非手动停止,否则自动重启 |
on-failure |
失败时重启,可指定次数 |
Compose 示例:
services:
app:
image: nginx:1.26-alpine
restart: unless-stopped
一般生产环境推荐使用:
restart: unless-stopped
如果是核心服务,也可以使用:
restart: always
区别在于:always 在 Docker 重启后会尝试启动容器,即使之前手动停止过;unless-stopped 则会尊重手动停止状态。
十五、生产环境安全加固建议
Docker 虽然方便,但如果配置不当,也可能带来安全风险。
1. 不要随意暴露 Docker API
不要在生产环境中开放:
tcp://0.0.0.0:2375
未加密的 Docker API 一旦暴露,攻击者可能直接控制服务器。
2. 避免容器使用特权模式
尽量不要使用:
privileged: true
特权容器拥有过高权限,可能带来逃逸风险。除非部署的是特殊组件,例如某些需要访问宿主机设备的服务,否则不建议开启。
3. 使用最小权限挂载
挂载宿主机目录时,尽量只挂载必要路径。例如:
volumes:
- ./config:/app/config:ro
:ro 表示只读挂载,可以降低误修改风险。
4. 不使用 latest 标签
生产环境不建议使用:
image: nginx:latest
建议固定版本:
image: nginx:1.26-alpine
这样可以避免镜像更新后产生不可控变化。
5. 定期更新基础镜像
固定版本不代表永远不升级。应定期评估基础镜像安全漏洞,必要时重新构建并上线。
十六、常见问题排查
1. Docker 服务启动失败
查看服务状态:
systemctl status docker
查看详细日志:
journalctl -u docker -xe
常见原因包括:
/etc/docker/daemon.jsonJSON 格式错误;- Docker 数据目录权限异常;
- 存储驱动不兼容;
- 磁盘空间不足;
- containerd 服务异常。
可以检查配置文件格式:
cat /etc/docker/daemon.json
如果安装了 jq,可以验证 JSON:
apt install -y jq
jq . /etc/docker/daemon.json
2. 拉取镜像失败
常见原因:
- DNS 解析异常;
- Docker Hub 访问受限;
- 镜像地址不存在;
- 镜像加速器不可用;
- 服务器网络策略限制。
测试 DNS:
ping registry-1.docker.io
测试网络:
curl -I https://registry-1.docker.io
也可以检查 Docker 配置:
docker info
3. 容器无法访问外网
检查 Docker 网络:
docker network ls
查看默认网桥:
docker network inspect bridge
检查宿主机是否开启转发:
sysctl net.ipv4.ip_forward
如果输出为 0,可以临时开启:
sysctl -w net.ipv4.ip_forward=1
永久开启:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-docker.conf
sysctl --system
4. 磁盘空间被占满
查看磁盘:
df -h
查看 Docker 占用:
docker system df
清理停止的容器:
docker container prune
清理无用镜像:
docker image prune
清理构建缓存:
docker builder prune
如果是日志过大,需要检查:
du -sh /var/lib/docker/containers/*
生产环境不要直接删除运行中容器的日志文件,建议先配置日志轮转,必要时重建容器。
十七、生产环境部署建议清单
在 Debian 上部署 Docker 后,建议按以下清单检查:
- [x] 使用 Docker 官方软件源安装;
- [x] Docker 设置开机自启动;
- [x] 配置日志大小限制;
- [x] 根据磁盘情况规划 Docker 数据目录;
- [x] 使用 Docker Compose 管理服务;
- [x] 容器配置重启策略;
- [x] 镜像版本固定,不使用
latest; - [x] 核心业务数据使用 volume 或宿主机目录持久化;
- [x] 不暴露 Docker 远程 API;
- [x] 不滥用
privileged; - [x] 定期检查磁盘、日志和镜像占用;
- [x] 配合防火墙和安全组限制访问端口;
- [x] 对重要配置和数据目录进行备份。
十八、总结
在 Debian 上部署 Docker 并不复杂,核心步骤包括:配置 Docker 官方软件源、安装 Docker Engine、启用服务、配置日志限制、部署 Docker Compose,并根据生产环境需求进行数据目录、网络、防火墙和安全策略优化。
生产环境与测试环境最大的区别在于:测试环境只关注“能不能跑”,而生产环境更关注“能不能长期稳定、安全、可恢复地运行”。因此,安装 Docker 后不要急于上线业务,还需要检查日志策略、磁盘规划、镜像版本、容器重启策略、防火墙规则以及数据持久化方案。
如果你是首次在 Debian 服务器上部署 Docker,建议先使用 Nginx 这样的轻量服务验证流程,再逐步部署数据库、缓存、应用服务等核心组件。对于重要业务,务必做好备份、监控和变更记录,这样才能让 Docker 真正成为稳定可靠的生产环境基础设施。