上一篇 下一篇 分享链接 返回 返回顶部

Debian 生产环境安装 Docker:从部署到安全优化实战教程

发布人:慈云数据-客服中心 发布时间:14小时前 阅读量:4

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 常见防火墙工具包括 iptablesnftablesufw。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.json JSON 格式错误;
  • 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 真正成为稳定可靠的生产环境基础设施。

目录结构
全文