Debian 服务器安装 Docker 全流程:从环境配置到 Compose 部署示例
Debian Docker部署教程|附配置文件
Docker 是目前最常用的容器化部署工具之一,它可以将应用程序及其依赖环境打包到容器中运行,从而解决“在我电脑上能跑,到了服务器就不行”的问题。对于个人开发者、中小型团队以及生产环境运维来说,Docker 都是非常重要的基础工具。
本文将以 Debian 系统 为例,详细介绍 Docker 的安装、配置、常用命令、Docker Compose 部署方式,并附带常见配置文件示例,方便你在服务器上快速完成 Docker 环境搭建。
一、环境说明
本文使用的环境如下:
| 项目 | 说明 |
|---|---|
| 操作系统 | Debian 11 / Debian 12 |
| 用户权限 | root 用户或具备 sudo 权限的普通用户 |
| Docker 版本 | Docker CE 最新稳定版 |
| Compose 版本 | Docker Compose Plugin |
| 服务器架构 | x86_64 / amd64 |
如果你的系统是 Debian 10,也可以参考本文步骤,但建议优先使用 Debian 11 或 Debian 12,以获得更好的软件兼容性和安全更新支持。
二、安装前准备
在安装 Docker 之前,建议先更新系统软件包,并安装一些必要工具。
如果你当前使用的是 root 用户,命令可以直接执行:
apt update
apt upgrade -y
如果你使用的是普通用户,请加上 sudo:
sudo apt update
sudo apt upgrade -y
安装常用依赖:
apt install -y ca-certificates curl gnupg lsb-release apt-transport-https software-properties-common
这些软件包的作用如下:
| 软件包 | 作用 |
|---|---|
| ca-certificates | 用于 HTTPS 证书校验 |
| curl | 用于下载远程文件 |
| gnupg | 用于导入 GPG 密钥 |
| lsb-release | 用于识别系统发行版本 |
| apt-transport-https | 允许 APT 使用 HTTPS 源 |
| software-properties-common | 提供软件源管理工具 |
三、卸载旧版本 Docker
如果你的服务器之前安装过 Docker,建议先卸载旧版本,避免软件包冲突。
apt remove -y docker docker-engine docker.io containerd runc
如果提示某些软件包不存在,可以忽略。这只是为了清理旧版本,不影响后续安装。
如果你想彻底清理旧 Docker 数据,可以执行:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
注意:以上命令会删除已有 Docker 镜像、容器、卷数据,请谨慎操作。如果服务器上已经运行了业务容器,不要直接删除。
四、添加 Docker 官方软件源
Debian 默认软件源中的 Docker 版本可能较旧,因此建议使用 Docker 官方源安装。
1. 创建密钥目录
install -m 0755 -d /etc/apt/keyrings
2. 下载 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3. 设置密钥权限
chmod a+r /etc/apt/keyrings/docker.gpg
4. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
更新软件包索引:
apt update
如果没有报错,说明 Docker 官方源添加成功。
五、安装 Docker Engine
执行以下命令安装 Docker:
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成后,查看 Docker 版本:
docker version
查看 Docker Compose 版本:
docker compose version
如果能正常输出版本信息,说明安装成功。
六、启动并设置开机自启
安装 Docker 后,通常服务会自动启动。你可以手动检查状态:
systemctl status docker
如果 Docker 没有运行,可以启动它:
systemctl start docker
设置开机自启:
systemctl enable docker
重启 Docker:
systemctl restart docker
七、运行测试容器
为了验证 Docker 是否可以正常使用,可以运行官方测试镜像:
docker run hello-world
如果输出类似以下内容,说明 Docker 已成功运行:
Hello from Docker!
This message shows that your installation appears to be working correctly.
这个命令会从 Docker Hub 拉取 hello-world 镜像,并创建一个临时容器运行。
八、配置普通用户使用 Docker
默认情况下,只有 root 用户可以直接执行 Docker 命令。如果你希望普通用户无需每次输入 sudo,可以将该用户加入 docker 用户组。
假设用户名为 debian:
usermod -aG docker debian
然后退出当前 SSH 会话,重新登录后执行:
docker ps
如果没有权限错误,说明配置成功。
注意:加入 docker 组的用户拥有接近 root 的权限,因为其可以通过 Docker 挂载宿主机目录。因此生产环境中应谨慎授权。
九、Docker 国内镜像加速配置
在国内服务器上拉取 Docker Hub 镜像时,可能会遇到速度慢、超时等问题。可以配置镜像加速地址。
Docker 的配置文件路径为:
/etc/docker/daemon.json
如果文件不存在,可以新建。
示例配置如下:
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
保存后重启 Docker:
systemctl daemon-reload
systemctl restart docker
查看配置是否生效:
docker info
在输出结果中查找:
Registry Mirrors
如果能看到配置的镜像地址,说明镜像加速已生效。
十、daemon.json 配置文件详解
下面对常用参数进行说明。
1. registry-mirrors
用于配置镜像加速地址:
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
当拉取 Docker Hub 镜像时,Docker 会优先使用镜像加速服务。
2. log-driver
用于设置容器日志驱动:
"log-driver": "json-file"
默认情况下 Docker 使用 json-file 保存日志。
3. log-opts
用于限制容器日志大小:
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
表示单个日志文件最大 100MB,最多保留 3 个日志文件。这样可以防止容器日志无限增长导致磁盘被占满。
4. storage-driver
用于设置存储驱动:
"storage-driver": "overlay2"
overlay2 是目前 Linux 上推荐使用的 Docker 存储驱动,性能和稳定性较好。
十一、常用 Docker 命令
1. 查看 Docker 信息
docker info
2. 查看镜像列表
docker images
3. 拉取镜像
docker pull nginx:latest
4. 运行容器
docker run -d --name nginx-test -p 8080:80 nginx:latest
参数说明:
| 参数 | 说明 |
|---|---|
| -d | 后台运行 |
| --name | 指定容器名称 |
| -p | 端口映射 |
| nginx:latest | 使用的镜像 |
访问:
http://服务器IP:8080
如果可以看到 Nginx 默认页面,说明容器运行正常。
5. 查看运行中的容器
docker ps
6. 查看所有容器
docker ps -a
7. 停止容器
docker stop nginx-test
8. 启动容器
docker start nginx-test
9. 删除容器
docker rm nginx-test
如果容器正在运行,需要先停止,或者使用强制删除:
docker rm -f nginx-test
10. 删除镜像
docker rmi nginx:latest
11. 查看容器日志
docker logs nginx-test
实时查看日志:
docker logs -f nginx-test
12. 进入容器
docker exec -it nginx-test bash
如果容器内没有 bash,可以使用 sh:
docker exec -it nginx-test sh
十二、使用 Docker Compose 部署服务
Docker Compose 适合用于管理多容器应用。比如一个 Web 应用可能包含 Nginx、MySQL、Redis 等多个服务,使用 Compose 可以通过一个 docker-compose.yml 文件统一管理。
从新版 Docker 开始,推荐使用:
docker compose
而不是旧版:
docker-compose
十三、Docker Compose 部署 Nginx 示例
创建项目目录:
mkdir -p /opt/docker/nginx
cd /opt/docker/nginx
创建配置目录:
mkdir -p html conf logs
创建首页文件:
cat > html/index.html << EOF
Docker Nginx
Nginx is running in Docker!
这是通过 Docker Compose 部署的 Nginx 服务。
EOF
创建 Nginx 配置文件:
cat > conf/default.conf << EOF
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files \$uri \$uri/ =404;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
EOF
创建 docker-compose.yml:
services:
nginx:
image: nginx:latest
container_name: nginx-demo
restart: always
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
- ./conf/default.conf:/etc/nginx/conf.d/default.conf
- ./logs:/var/log/nginx
启动服务:
docker compose up -d
查看容器状态:
docker compose ps
查看日志:
docker compose logs -f
停止服务:
docker compose down
十四、Docker Compose 部署 MySQL 示例
创建目录:
mkdir -p /opt/docker/mysql
cd /opt/docker/mysql
mkdir -p data conf logs
创建 MySQL 配置文件:
cat > conf/my.cnf << EOF
[mysqld]
default-time-zone = '+8:00'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections = 500
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
EOF
创建 docker-compose.yml:
services:
mysql:
image: mysql:8.0
container_name: mysql-demo
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "YourStrongPassword123!"
MYSQL_DATABASE: "demo"
MYSQL_USER: "demo_user"
MYSQL_PASSWORD: "DemoPassword123!"
TZ: "Asia/Shanghai"
volumes:
- ./data:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
- ./logs:/var/log/mysql
启动 MySQL:
docker compose up -d
进入 MySQL 容器:
docker exec -it mysql-demo mysql -uroot -p
输入 MYSQL_ROOT_PASSWORD 中配置的密码即可登录。
生产环境中不建议直接将数据库端口
3306暴露到公网。如果必须开放,请配合防火墙、安全组、强密码、白名单等安全策略。
十五、Docker Compose 部署 Redis 示例
创建目录:
mkdir -p /opt/docker/redis
cd /opt/docker/redis
mkdir -p data conf
创建 Redis 配置文件:
cat > conf/redis.conf << EOF
bind 0.0.0.0
port 6379
requirepass YourRedisPassword123
appendonly yes
appendfilename "appendonly.aof"
dir /data
protected-mode yes
timeout 300
tcp-keepalive 60
EOF
创建 docker-compose.yml:
services:
redis:
image: redis:7
container_name: redis-demo
restart: always
ports:
- "6379:6379"
command: redis-server /etc/redis/redis.conf
volumes:
- ./data:/data
- ./conf/redis.conf:/etc/redis/redis.conf
启动 Redis:
docker compose up -d
进入 Redis:
docker exec -it redis-demo redis-cli
认证:
AUTH YourRedisPassword123
测试:
PING
如果返回:
PONG
说明 Redis 正常运行。
十六、配置 Docker 自动清理
Docker 使用时间久了以后,会产生大量无用镜像、停止的容器、构建缓存等,占用磁盘空间。
查看 Docker 占用空间:
docker system df
清理未使用资源:
docker system prune -f
清理未使用镜像:
docker image prune -a -f
清理构建缓存:
docker builder prune -f
如果需要定期清理,可以添加计划任务:
crontab -e
添加如下内容:
0 3 * * 0 docker system prune -f >/dev/null 2>&1
表示每周日凌晨 3 点自动清理未使用的 Docker 资源。
不建议在生产环境中频繁执行
docker system prune -a,因为它可能删除暂时未使用但后续仍需要的镜像。
十七、防火墙与端口开放
如果你的 Debian 启用了 UFW 防火墙,需要开放对应端口。例如开放 Nginx 的 8080 端口:
ufw allow 8080/tcp
开放 SSH:
ufw allow 22/tcp
启用 UFW:
ufw enable
查看状态:
ufw status
如果你使用的是云服务器,还需要在云平台安全组中放行对应端口,例如 80、443、8080、3306 等。
十八、生产环境部署建议
在生产环境中使用 Docker,除了能运行服务,还应关注安全性、稳定性和可维护性。
1. 不要随意使用 latest 标签
例如:
image: nginx:latest
虽然方便,但不利于版本控制。生产环境建议指定明确版本:
image: nginx:1.26
这样可以避免镜像自动升级导致兼容性问题。
2. 对外暴露端口要谨慎
数据库、Redis、管理后台等服务不建议直接暴露公网。如果必须暴露,应配合防火墙、访问白名单、强密码和 TLS 加密。
3. 重要数据必须挂载到宿主机
例如 MySQL 数据目录:
volumes:
- ./data:/var/lib/mysql
否则容器删除后,数据可能丢失。
4. 配置日志大小限制
建议在 /etc/docker/daemon.json 中配置日志限制,避免日志撑满磁盘。
5. 定期备份数据
Docker 并不等于备份。数据库、配置文件、上传文件等仍然需要定期备份,可以结合 rsync、对象存储、快照等方式实现。
十九、常见问题排查
1. Docker 服务启动失败
查看服务状态:
systemctl status docker
查看详细日志:
journalctl -u docker -xe
常见原因包括:
daemon.json格式错误;- 存储驱动配置不兼容;
- 磁盘空间不足;
- 旧版本 Docker 残留冲突。
可以使用以下命令检查 JSON 格式:
python3 -m json.tool /etc/docker/daemon.json
2. 拉取镜像失败
常见原因:
- 网络无法访问 Docker Hub;
- DNS 配置异常;
- 镜像名称写错;
- 镜像加速器不可用。
可以尝试测试网络:
curl -I https://registry-1.docker.io
也可以更换镜像加速地址后重启 Docker。
3. 容器端口无法访问
检查容器是否运行:
docker ps
检查端口映射:
docker port 容器名
检查防火墙:
ufw status
检查云服务器安全组是否放行端口。
4. 容器日志过大
查看容器日志文件位置:
docker inspect 容器名 | grep LogPath
建议通过 daemon.json 统一限制日志大小,而不是手动删除日志文件。
二十、一键安装脚本示例
如果你希望快速安装 Docker,可以使用下面的脚本。建议先阅读脚本内容,再执行。
创建脚本:
vim install-docker.sh
写入以下内容:
#!/bin/bash
set -e
echo "更新系统软件包..."
apt update
apt install -y ca-certificates curl gnupg lsb-release apt-transport-https software-properties-common
echo "卸载旧版本 Docker..."
apt remove -y docker docker-engine docker.io containerd runc || true
echo "添加 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
echo "添加 Docker 官方软件源..."
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
echo "安装 Docker..."
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "写入 Docker 配置..."
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
echo "启动 Docker..."
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
echo "Docker 安装完成!"
docker version
docker compose version
授权执行:
chmod +x install-docker.sh
运行脚本:
./install-docker.sh
二十一、完整目录结构示例
如果你准备在服务器上统一管理 Docker 服务,建议使用如下目录结构:
/opt/docker/
├── nginx/
│ ├── docker-compose.yml
│ ├── html/
│ ├── conf/
│ └── logs/
├── mysql/
│ ├── docker-compose.yml
│ ├── data/
│ ├── conf/
│ └── logs/
└── redis/
├── docker-compose.yml
├── data/
└── conf/
这种结构的优点是:
- 服务之间相互独立;
- 配置文件清晰;
- 便于备份和迁移;
- 方便使用 Docker Compose 管理;
- 出问题时更容易排查。
二十二、总结
本文以 Debian 系统为例,介绍了 Docker 的完整部署流程,包括系统准备、卸载旧版本、添加 Docker 官方源、安装 Docker Engine、配置开机自启、设置镜像加速、编写 daemon.json 配置文件,以及使用 Docker Compose 部署 Nginx、MySQL、Redis 等常见服务。
对于日常使用来说,掌握以下几个重点即可:
- 使用 Docker 官方源安装,避免版本过旧;
- 配置
/etc/docker/daemon.json,限制日志大小并设置镜像加速; - 使用 Docker Compose 管理服务,而不是手动运行大量
docker run命令; - 生产环境不要滥用
latest标签; - 数据库、配置文件、上传目录必须挂载到宿主机;
- 定期备份数据,定期检查磁盘空间;
- 不要轻易暴露数据库、Redis 等敏感服务端口到公网。
通过本文的配置和示例,你可以在 Debian 服务器上快速搭建稳定、清晰、易维护的 Docker 运行环境,为后续部署网站、数据库、中间件和业务系统打下基础。