Debian 安装 Docker 完全指南:从零到生产环境
文章目录
💡 提示 :本指南适用于 Debian 10+ 及 Ubuntu 18.04+ 系统,使用官方最新稳定版 Docker。
⚠️ 注意 :在生产环境部署前,请务必完成所有安全配置章节的内容。
前言:为什么选择 Docker Docker 已经成为现代应用部署的标准工具。它通过容器化技术,让应用程序能够在任何环境中以相同的方式运行,彻底解决了”在我的机器上能运行”的难题。
Docker 的核心优势
环境一致性 :开发、测试、生产环境完全一致
快速部署 :秒级启动应用,大幅提升部署效率
资源隔离 :轻量级虚拟化,比传统虚拟机更节省资源
易于扩展 :支持水平扩展,轻松应对流量高峰
生态丰富 :Docker Hub 拥有数百万个官方镜像
在 Debian 上安装 Docker,符合 最简单、最快、最强 (即:官方最新版 + 自动配置源 + 集成 Docker Compose)的方法只有一种:
第 I 部分:快速安装 1. 官方一键安装脚本 不需要手动添加 GPG key,不需要手动写 apt 源,只需一行命令。
核心指令(最快方法) 打开终端,直接执行以下命令:
1 curl -fsSL https://get.docker.com | bash
原理说明 :这行命令会自动识别你的 Debian 版本,配置官方的稳定版源,安装最新的 Docker Engine、containerd 和 Docker Compose 插件。
安装过程详解 脚本执行时会自动完成以下步骤:
检测系统信息 :识别 Debian/Ubuntu 版本和架构
配置官方源 :自动添加 Docker 官方 APT 仓库
安装依赖包 :安装必要的系统依赖
安装 Docker :安装 Docker Engine、CLI、containerd
安装 Compose :安装 Docker Compose V2 插件
启动服务 :自动启动 Docker 服务
预期安装时间
国内网络 :5-15 分钟(取决于网络速度)
海外网络 :2-5 分钟
2. 验证安装结果 安装完成后,执行以下命令验证安装是否成功:
1 2 3 4 5 6 7 8 docker version docker compose version docker info
预期输出示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ docker version Client: Docker Engine - Community Version: 28.3.2 API version: 1.48 Go version: go1.23.3 Git commit: 578ccf6 Built: Mon Jan 6 14:22:01 2025 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 28.3.2 API version: 1.48 (minimum version 1.24) Go version: go1.23.3 Git commit: 578ccf6 Built: Mon Jan 6 14:22:01 2025 OS/Arch: linux/amd64 Experimental: false
如果看到版本号信息,说明安装成功!
第 II 部分:基础配置 1. 用户权限配置 默认情况下,只有 root 用户和 docker 组的成员才能执行 Docker 命令。每次都要加 sudo 很麻烦,我们可以将当前用户加入 docker 组。
添加用户到 docker 组 1 2 sudo usermod -aG docker $USER
验证组配置
输出中应该包含 docker。
⚠️ 重要提示:重新登录 执行完上述命令后,必须注销并重新登录 (或重启服务器)才能生效。
测试免 sudo 使用
如果成功输出欢迎信息,说明权限配置正确。
2. 服务自启配置 为了确保 Docker 服务在系统重启后自动启动,我们需要配置开机自启。
启用并启动 Docker 服务 1 2 3 4 5 sudo systemctl enable dockersudo systemctl start docker
检查服务状态 1 2 sudo systemctl status docker
预期输出 :
1 2 3 4 5 6 7 8 9 ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2025-12-14 21:30:00 CST; 5s ago Docs: https://docs.docker.com Main PID: 12345 (dockerd) Tasks: 8 Memory: 45.2M CGroup: /system.slice/docker.service └─12345 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
状态应该显示 enabled 和 active (running)。
3. 镜像加速配置 如果你身处中国大陆,直接从 Docker Hub 拉取镜像可能会很慢或超时。配置镜像加速器可以大幅提升下载速度。
方案 A:使用 DaoCloud 镜像加速(推荐) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : [ "https://docker.m.daocloud.io" , "https://huecker.io" , "https://dockerhub.timeweb.cloud" ], "log-driver" : "json-file" , "log-opts" : { "max-size" : "10m" , "max-file" : "3" } } EOF
方案 B:使用阿里云镜像加速 如果你有阿里云账号,可以使用阿里云提供的专属镜像加速器。
1 2 3 4 5 6 7 8 9 10 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : [ "https://YOUR_ACCELERATOR_ADDRESS.mirror.aliyuncs.com" ] } EOF
重启 Docker 服务 1 2 3 4 5 sudo systemctl daemon-reloadsudo systemctl restart docker
验证镜像加速 1 2 docker info | grep -A 10 "Registry Mirrors"
预期输出 :
1 2 3 4 Registry Mirrors: https://docker.m.daocloud.io/ https://huecker.io/ https://dockerhub.timeweb.cloud/
测试拉取速度 1 2 time docker pull nginx:alpine
第 III 部分:进阶优化 1. 生产环境配置 在生产环境中,我们需要对 Docker 进行更细致的配置,以确保性能、安全和稳定性。
完整的 daemon.json 配置示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : [ "https://docker.m.daocloud.io" , "https://huecker.io" ], "log-driver" : "json-file" , "log-opts" : { "max-size" : "10m" , "max-file" : "3" }, "storage-driver" : "overlay2" , "live-restore" : true , "max-concurrent-downloads" : 10, "max-concurrent-uploads" : 5, "default-ulimits" : { "nofile" : { "Name" : "nofile" , "Hard" : 64000, "Soft" : 64000 } }, "dns" : ["8.8.8.8" , "8.8.4.4" ], "ip-forward" : true , "iptables" : true , "userland-proxy" : false } EOF
配置参数说明
参数
说明
推荐值
registry-mirrors
镜像加速器地址
根据网络环境选择
log-driver
日志驱动
json-file
log-opts.max-size
单个日志文件最大大小
10m
log-opts.max-file
保留的日志文件数量
3
storage-driver
存储驱动
overlay2
live-restore
守护进程重启时保持容器运行
true
max-concurrent-downloads
最大并发下载数
10
max-concurrent-uploads
最大并发上传数
5
dns
DNS 服务器
8.8.8.8, 8.8.4.4
userland-proxy
禁用用户态代理
false
应用配置 1 2 3 4 5 sudo systemctl daemon-reloadsudo systemctl restart docker
2. 日志与存储管理 Docker 容器的日志和镜像会占用大量磁盘空间,需要定期清理和管理。
查看磁盘使用情况 1 2 3 4 5 docker system df docker system df -v
输出示例 :
1 2 3 4 5 TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 5 2.5GB 1.2GB (48%) Containers 5 3 500MB 200MB (40%) Local Volumes 3 1 1GB 800MB (80%) Build Cache 0 0 0B 0B
清理未使用的资源 1 2 3 4 5 6 7 8 docker system prune -a docker volume prune docker system prune -a --volumes
⚠️ 警告 :docker system prune -a 会删除所有停止的容器和未使用的镜像,请谨慎使用!
设置日志轮转 在 daemon.json 中已经配置了日志轮转,确保日志不会无限增长:
1 2 3 4 "log-opts" : { "max-size" : "10m" , "max-file" : "3" }
这表示每个容器的日志文件最大 10MB,最多保留 3 个文件。
3. 网络与安全配置 创建自定义网络 1 2 3 4 5 6 7 8 docker network create app-network docker network ls docker network inspect app-network
配置防火墙规则 1 2 3 4 sudo ufw allow 2375/tcp sudo ufw allow 2376/tcp sudo ufw reload
⚠️ 安全警告 :不要在公网开放 Docker API 端口(2375/2376),除非你配置了 TLS 认证!
限制容器资源 在运行容器时,可以限制 CPU 和内存使用:
1 2 3 4 5 docker run -d --name myapp \ --cpus="1.0" \ --memory="512m" \ nginx:alpine
第 IV 部分:实战演练 1. 运行第一个容器 让我们运行一个简单的 Nginx 容器来验证 Docker 是否正常工作。
运行 Nginx 容器 1 2 docker run -d --name my-nginx -p 8080:80 nginx:alpine
参数说明:
-d:后台运行
--name my-nginx:指定容器名称
-p 8080:80:端口映射,将容器的 80 端口映射到主机的 8080 端口
nginx:alpine:使用 Alpine 版本的 Nginx 镜像
查看容器状态 1 2 3 4 5 6 7 8 9 10 11 docker ps docker ps -a docker logs my-nginx docker inspect my-nginx
访问测试 1 2 3 4 5 curl http://localhost:8080
停止和删除容器 1 2 3 4 5 6 7 8 docker stop my-nginx docker rm my-nginx docker rm -f my-nginx
2. 使用 Docker Compose Docker Compose 让我们能够通过 YAML 文件定义和运行多容器应用。
创建项目目录 1 mkdir ~/docker-demo && cd ~/docker-demo
创建 docker-compose.yml 文件
编写 Compose 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 version: '3.8' services: web: image: nginx:alpine ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html restart: unless-stopped db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: myapp MYSQL_USER: myuser MYSQL_PASSWORD: mypassword volumes: - db-data:/var/lib/mysql restart: unless-stopped volumes: db-data:
创建测试页面 1 2 mkdir htmlecho "<h1>Hello from Docker Compose!</h1>" > html/index.html
启动服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker compose up -d docker compose ps docker compose logs -f docker compose down docker compose down -v
常见问题解决方案 问题 1:权限被拒绝 (Permission denied) 症状 :
1 2 $ docker ps permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
解决方案 :
将用户添加到 docker 组:
1 sudo usermod -aG docker $USER
重新登录或刷新用户组:
验证权限:
问题 2:无法连接到 Docker 守护进程 症状 :
1 2 $ docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方案 :
检查 Docker 服务状态:
1 sudo systemctl status docker
启动 Docker 服务:
1 sudo systemctl start docker
启用开机自启:
1 sudo systemctl enable docker
问题 3:镜像拉取失败或超时 症状 :
1 2 $ docker pull nginx Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
解决方案 :
配置镜像加速器(参考第 II 部分-3)
使用代理:
1 2 3 4 5 6 7 8 9 10 export HTTP_PROXY=http://proxy.example.com:8080export HTTPS_PROXY=http://proxy.example.com:8080docker pull nginx unset HTTP_PROXYunset HTTPS_PROXY
问题 4:磁盘空间不足 症状 :
1 2 $ docker run hello-world no space left on device
解决方案 :
查看磁盘使用情况:
清理未使用的资源:
1 docker system prune -a --volumes
更改 Docker 数据目录(需要修改 daemon.json):
1 2 3 4 5 6 7 sudo tee /etc/docker/daemon.json <<-'EOF' { "data-root" : "/mnt/docker-data" } EOF sudo systemctl restart docker
问题 5:容器无法访问外网 症状 :
1 2 $ docker run alpine ping -c 3 8.8.8.8 ping: bad address '8.8.8.8'
解决方案 :
检查防火墙规则:
检查 DNS 配置:
1 docker run alpine cat /etc/resolv.conf
在 daemon.json 中配置 DNS:
1 2 3 4 5 6 7 sudo tee /etc/docker/daemon.json <<-'EOF' { "dns" : ["8.8.8.8" , "8.8.4.4" ] } EOF sudo systemctl restart docker
问题 6:容器启动后立即退出 症状 :
1 2 3 4 $ docker run myapp $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc123 myapp "/bin/sh -c 'exit 1'" 5 seconds ago Exited (1) 4 seconds ago myapp
解决方案 :
查看容器日志:
交互式运行容器进行调试:
1 docker run -it myapp /bin/sh
检查容器入口点:
1 docker inspect myapp | grep -A 10 "Entrypoint"
总结与最佳实践 快速回顾 通过本文的学习,你已经掌握了:
✅ 使用官方一键脚本快速安装 Docker
✅ 配置用户权限和服务自启
✅ 配置镜像加速提升下载速度
✅ 运行和管理 Docker 容器
✅ 使用 Docker Compose 编排多容器应用
✅ 解决常见的 Docker 问题
生产环境最佳实践 1. 安全性
✅ 不要使用 root 用户运行容器
✅ 限制容器的资源使用(CPU、内存)
✅ 使用只读文件系统
✅ 定期更新镜像和容器
✅ 不要在容器中存储敏感信息
2. 性能优化
✅ 使用 Alpine 镜像减小镜像体积
✅ 合理使用多阶段构建
✅ 配置日志轮转避免日志膨胀
✅ 使用 Docker Compose 管理多容器应用
✅ 定期清理未使用的资源
3. 监控与维护
✅ 定期检查磁盘使用情况
✅ 监控容器资源使用情况
✅ 设置容器健康检查
✅ 配置日志收集和分析
✅ 定期备份重要数据卷
4. 开发工作流
✅ 使用 Dockerfile 定义镜像构建过程
✅ 使用 .dockerignore 排除不需要的文件
✅ 使用 Docker Compose 简化本地开发
✅ 使用多阶段构建优化镜像大小
✅ 使用标签管理镜像版本
下一步学习 如果你想深入学习 Docker,可以探索以下主题:
Dockerfile 最佳实践 :学习如何编写高效的 Dockerfile
Docker 网络 :深入了解 Docker 网络模式和配置
Docker 存储 :学习数据卷和存储驱动的使用
容器编排 :了解 Kubernetes 和 Docker Swarm
CI/CD 集成 :将 Docker 集成到持续集成流程中
参考资源
恭喜你! 你已经成功在 Debian 上安装并配置了 Docker,并掌握了从基础到进阶的使用方法。现在,你可以开始使用 Docker 来部署你的应用了!
如果你在实践过程中遇到任何问题,欢迎查阅本文的”常见问题解决方案”部分,或者参考 Docker 官方文档获取更多帮助。
祝你使用愉快!🎉