Debian 上手 Docker:从安装到部署服务,一篇就够了
Debian Docker部署教程|零基础可学
Docker 是当前最常用的容器化技术之一。无论你是想搭建网站、部署数据库、运行后台服务,还是学习 DevOps、云原生、微服务,Docker 都是绕不开的重要工具。相比传统部署方式,Docker 能够把应用程序及其运行环境打包到一个“容器”中,实现快速部署、环境隔离、便于迁移和统一管理。
本文将以 Debian 系统 为例,手把手讲解 Docker 的安装、配置、常用命令、容器运行、镜像管理、数据挂载、Docker Compose 使用以及常见问题处理。即使你是零基础,也可以按照本文一步一步完成 Docker 部署。
一、什么是 Docker?
在正式安装之前,我们先简单理解一下 Docker。
Docker 是一种容器化平台,它可以把应用和依赖环境打包成一个独立的运行单元,这个运行单元就叫 容器。容器运行在宿主机系统之上,但彼此之间相互隔离。
你可以把 Docker 理解成一种“轻量级虚拟机”,但它和传统虚拟机有明显区别:
| 对比项目 | Docker 容器 | 传统虚拟机 |
|---|---|---|
| 启动速度 | 秒级启动 | 通常需要几十秒甚至更久 |
| 资源占用 | 较少 | 较多 |
| 系统内核 | 共享宿主机内核 | 每台虚拟机都有完整系统 |
| 部署效率 | 高 | 相对较低 |
| 迁移能力 | 强 | 较复杂 |
举个例子,如果你想部署一个 Nginx 网站,传统方式需要手动安装 Nginx、配置环境、处理依赖。而使用 Docker,只需要运行一条命令即可启动一个 Nginx 容器。
二、为什么选择在 Debian 上部署 Docker?
Debian 是一个稳定、安全、广泛使用的 Linux 发行版,很多服务器环境都会选择 Debian 作为基础系统。它的优点包括:
- 稳定性强:Debian 以稳定著称,非常适合服务器长期运行。
- 软件生态成熟:支持大量开源软件,Docker 官方也支持 Debian。
- 资源占用较低:适合云服务器、VPS、家庭服务器等场景。
- 社区资料丰富:遇到问题时容易找到解决方案。
常见的 Debian 版本包括 Debian 10、Debian 11、Debian 12。本文主要以 Debian 11 / Debian 12 为例,其他版本大体类似。
三、安装 Docker 前的准备工作
在安装 Docker 之前,需要先确认服务器环境。
1. 确认系统版本
登录 Debian 服务器后,执行以下命令查看系统版本:
cat /etc/os-release
你可能会看到类似输出:
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
如果你的系统是 Debian 11 或 Debian 12,一般都可以按照本文步骤安装。
2. 更新系统软件包
安装软件之前,建议先更新软件源和系统包:
sudo apt update
sudo apt upgrade -y
如果你是 root 用户,可以省略 sudo:
apt update
apt upgrade -y
提示:如果服务器刚安装好系统,更新软件包是一个非常推荐的操作,可以减少后续安装过程中出现依赖问题。
3. 安装基础依赖
Docker 官方安装方式需要用到一些基础工具,例如 curl、gnupg、ca-certificates 等。
执行:
sudo apt install -y ca-certificates curl gnupg lsb-release
这些工具的作用如下:
ca-certificates:用于 HTTPS 证书校验;curl:用于下载文件;gnupg:用于验证软件源签名;lsb-release:用于识别系统发行版本信息。
四、在 Debian 上安装 Docker
Docker 有多种安装方式,例如使用系统自带仓库安装、使用官方仓库安装、使用脚本安装等。为了保证版本较新且稳定,推荐使用 Docker 官方软件源 安装。
1. 添加 Docker 官方 GPG 密钥
执行以下命令创建密钥目录:
sudo install -m 0755 -d /etc/apt/keyrings
然后下载 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置权限:
sudo chmod a+r /etc/apt/keyrings/docker.gpg
GPG 密钥用于验证下载的软件包是否来自 Docker 官方,避免安装到被篡改的软件。
2. 添加 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" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这条命令会根据你的 Debian 版本自动添加对应的软件源。例如 Debian 12 的代号是 bookworm,Debian 11 的代号是 bullseye。
添加完成后,更新软件包索引:
sudo apt update
3. 安装 Docker Engine
执行:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
这些组件分别代表:
| 组件 | 说明 |
|---|---|
docker-ce |
Docker 社区版引擎 |
docker-ce-cli |
Docker 命令行工具 |
containerd.io |
容器运行时 |
docker-buildx-plugin |
构建镜像插件 |
docker-compose-plugin |
Docker Compose 插件 |
安装完成后,查看 Docker 版本:
docker version
如果能看到 Docker Client 和 Docker Server 的版本信息,说明 Docker 已经安装成功。
五、启动并设置 Docker 开机自启
安装完成后,一般 Docker 服务会自动启动。你可以使用以下命令查看状态:
sudo systemctl status docker
如果看到 active (running),说明 Docker 正在运行。
如果没有运行,可以手动启动:
sudo systemctl start docker
设置开机自动启动:
sudo systemctl enable docker
如果你希望同时启动 containerd:
sudo systemctl enable containerd
六、运行第一个 Docker 容器
安装成功后,可以运行官方测试镜像:
sudo docker run hello-world
如果输出类似:
Hello from Docker!
This message shows that your installation appears to be working correctly.
说明 Docker 已经可以正常运行。
这条命令背后的流程是:
- Docker 检查本地是否存在
hello-world镜像; - 如果没有,就从 Docker Hub 下载;
- 下载完成后创建并启动容器;
- 容器输出测试信息后自动退出。
七、让普通用户无需 sudo 使用 Docker
默认情况下,普通用户执行 Docker 命令可能会提示权限不足,需要加 sudo。如果你不想每次都输入 sudo,可以把当前用户加入 docker 用户组。
执行:
sudo usermod -aG docker $USER
然后退出 SSH 重新登录,或者执行:
newgrp docker
再次测试:
docker ps
如果不报错,说明配置成功。
注意:加入 docker 组的用户基本等同于拥有较高系统权限,因此只建议给可信用户添加该权限。
八、Docker 常用基础命令
对于零基础用户来说,掌握以下命令就可以完成大部分日常操作。
1. 查看 Docker 信息
查看版本:
docker version
查看系统信息:
docker info
2. 查看镜像
docker images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest abc123456789 2 weeks ago 187MB
字段说明:
REPOSITORY:镜像名称;TAG:镜像标签,常见为latest;IMAGE ID:镜像 ID;CREATED:创建时间;SIZE:镜像大小。
3. 拉取镜像
以 Nginx 为例:
docker pull nginx
拉取指定版本:
docker pull nginx:1.25
如果不指定版本,默认拉取 latest 标签。
4. 运行容器
运行一个 Nginx 容器:
docker run -d --name my-nginx -p 8080:80 nginx
参数说明:
| 参数 | 说明 |
|---|---|
-d |
后台运行 |
--name my-nginx |
指定容器名称 |
-p 8080:80 |
端口映射,将宿主机 8080 映射到容器 80 |
nginx |
使用的镜像 |
运行后,在浏览器访问:
http://服务器IP:8080
如果看到 Nginx 欢迎页面,说明容器运行成功。
5. 查看正在运行的容器
docker ps
查看所有容器,包括已停止的:
docker ps -a
6. 停止容器
docker stop my-nginx
也可以使用容器 ID:
docker stop 容器ID
7. 启动已停止容器
docker start my-nginx
8. 重启容器
docker restart my-nginx
9. 删除容器
删除前需要先停止容器:
docker stop my-nginx
docker rm my-nginx
如果想强制删除:
docker rm -f my-nginx
10. 删除镜像
docker rmi nginx
如果镜像正在被容器使用,需要先删除相关容器。
九、Docker 端口映射详解
很多初学者在部署 Docker 服务时,最容易困惑的就是端口映射。
例如:
docker run -d --name web -p 8080:80 nginx
其中:
8080:80
含义是:
宿主机端口:容器内部端口
也就是说,用户访问服务器的 8080 端口时,请求会被转发到容器内部的 80 端口。
如果你希望通过服务器的 80 端口访问 Nginx,可以这样运行:
docker run -d --name web -p 80:80 nginx
但需要注意:
- 宿主机端口不能被其他程序占用;
- 低端口如 80、443 通常需要管理员权限;
- 云服务器安全组或防火墙需要放行对应端口。
十、Docker 数据挂载详解
Docker 容器本身是临时性的。如果删除容器,容器内部的数据通常也会丢失。因此在部署数据库、网站、配置文件时,一定要使用数据挂载。
Docker 常见的数据保存方式有两种:
- 目录挂载 Bind Mount
- 数据卷 Volume
1. 目录挂载
目录挂载可以把宿主机目录映射到容器内部。
例如运行 Nginx,并挂载网页目录:
mkdir -p /opt/nginx/html
echo "Hello Docker on Debian" > /opt/nginx/html/index.html
运行容器:
docker run -d \
--name nginx-html \
-p 8080:80 \
-v /opt/nginx/html:/usr/share/nginx/html \
nginx
访问:
http://服务器IP:8080
你会看到自定义的网页内容。
这里的:
/opt/nginx/html:/usr/share/nginx/html
含义是:
宿主机目录:容器内部目录
优点是直观,方便直接修改文件。
2. 数据卷 Volume
Docker Volume 是 Docker 官方推荐的数据持久化方式。
创建数据卷:
docker volume create nginx-data
查看数据卷:
docker volume ls
使用数据卷运行容器:
docker run -d \
--name nginx-volume \
-p 8081:80 \
-v nginx-data:/usr/share/nginx/html \
nginx
查看数据卷详情:
docker volume inspect nginx-data
Volume 更适合数据库、长期保存的数据等场景。
十一、进入容器内部操作
有时候需要进入容器内部查看文件或执行命令,可以使用:
docker exec -it 容器名称 bash
例如进入 Nginx 容器:
docker exec -it my-nginx bash
如果容器内没有 bash,可以尝试:
docker exec -it my-nginx sh
进入容器后,你可以像在 Linux 系统一样执行命令。退出容器:
exit
注意:不建议在容器内部长期手动修改配置,因为容器重建后修改可能丢失。更推荐通过挂载配置文件或构建自定义镜像来管理。
十二、查看容器日志
查看容器日志是排查问题的重要方法。
docker logs 容器名称
例如:
docker logs my-nginx
实时查看日志:
docker logs -f my-nginx
查看最近 100 行日志:
docker logs --tail=100 my-nginx
如果服务启动失败,第一步通常就是查看日志。
十三、Docker Compose 部署教程
当你只运行一个容器时,使用 docker run 很方便。但如果需要运行多个容器,例如网站 + 数据库 + Redis,命令会变得很长,而且不方便维护。
这时就可以使用 Docker Compose。
Docker Compose 可以通过一个 compose.yml 文件定义多个服务,然后一条命令启动全部容器。
1. 检查 Docker Compose 是否安装
前面我们安装了 docker-compose-plugin,可以执行:
docker compose version
注意这里是:
docker compose
中间有空格,而不是老版本的 docker-compose。
2. 使用 Docker Compose 部署 Nginx
创建项目目录:
mkdir -p /opt/docker-nginx
cd /opt/docker-nginx
创建网页目录:
mkdir html
echo "Hello Docker Compose" > html/index.html
创建 Compose 文件:
nano compose.yml
写入以下内容:
services:
nginx:
image: nginx:latest
container_name: compose-nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
参数说明:
| 配置 | 说明 |
|---|---|
services |
定义服务 |
nginx |
服务名称 |
image |
使用的镜像 |
container_name |
容器名称 |
ports |
端口映射 |
volumes |
数据挂载 |
restart |
重启策略 |
启动服务:
docker compose up -d
查看运行状态:
docker compose ps
查看日志:
docker compose logs -f
停止服务:
docker compose down
十四、Docker 容器重启策略
部署服务时,建议设置容器重启策略,避免服务器重启或容器异常退出后服务无法恢复。
常见重启策略:
| 策略 | 说明 |
|---|---|
no |
默认,不自动重启 |
always |
总是自动重启 |
unless-stopped |
除非手动停止,否则自动重启 |
on-failure |
失败时重启 |
使用 docker run 时:
docker run -d \
--name my-nginx \
--restart unless-stopped \
-p 8080:80 \
nginx
在 Compose 中:
restart: unless-stopped
日常部署推荐使用:
unless-stopped
因为它既能保证服务异常退出后自动恢复,又不会在你手动停止后自动启动。
十五、配置 Docker 镜像加速
如果你在国内服务器上使用 Docker,拉取镜像可能会比较慢,甚至出现超时。可以配置镜像加速器。
创建或编辑 Docker 配置文件:
sudo nano /etc/docker/daemon.json
写入类似内容:
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
保存后重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
查看是否生效:
docker info
在输出中找到 Registry Mirrors,如果能看到配置的地址,说明生效。
注意:镜像加速地址可能会随时间变化,建议选择可信赖的镜像源,并关注其可用性。
十六、防火墙与安全组设置
如果容器运行正常,但浏览器无法访问服务,常见原因不是 Docker 问题,而是端口没有放行。
1. 检查容器是否运行
docker ps
确认端口是否映射,例如:
0.0.0.0:8080->80/tcp
2. 检查 Debian 防火墙
如果你使用了 ufw,查看状态:
sudo ufw status
放行 8080 端口:
sudo ufw allow 8080/tcp
重新加载:
sudo ufw reload
3. 检查云服务器安全组
如果你使用的是阿里云、腾讯云、华为云、AWS、Azure 等云服务器,还需要在控制台安全组中放行对应端口,例如:
- 80
- 443
- 8080
- 3306
- 6379
建议只开放必要端口。数据库端口如 MySQL 的 3306、Redis 的 6379 不建议直接暴露到公网。
十七、部署一个 MySQL 容器示例
下面演示如何使用 Docker 部署 MySQL,并持久化数据。
创建目录:
mkdir -p /opt/mysql/data
运行 MySQL:
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=StrongPassword123! \
-v /opt/mysql/data:/var/lib/mysql \
--restart unless-stopped \
mysql:8.0
参数说明:
| 参数 | 说明 |
|---|---|
-e MYSQL_ROOT_PASSWORD=... |
设置 root 密码 |
-v /opt/mysql/data:/var/lib/mysql |
持久化数据库数据 |
--restart unless-stopped |
自动重启策略 |
mysql:8.0 |
使用 MySQL 8.0 镜像 |
查看日志:
docker logs -f mysql8
进入 MySQL:
docker exec -it mysql8 mysql -uroot -p
输入密码即可进入。
安全提醒:如果只是本机应用访问 MySQL,不建议将
3306暴露到公网。可以不写-p 3306:3306,让其他 Docker 容器通过 Docker 网络访问。
十八、部署一个网站服务示例
假设你想部署一个简单静态网站,可以使用 Nginx。
创建目录:
mkdir -p /opt/site/html
创建首页文件:
cat > /opt/site/html/index.html <
Docker Site
我的 Debian Docker 网站部署成功!
EOF
运行 Nginx:
docker run -d \
--name site-nginx \
-p 80:80 \
-v /opt/site/html:/usr/share/nginx/html \
--restart unless-stopped \
nginx
访问:
http://服务器IP
如果看到网页内容,说明部署成功。
十九、Docker 网络基础
Docker 默认会创建一些网络,可以查看:
docker network ls
常见网络类型:
| 网络 | 说明 |
|---|---|
bridge |
默认桥接网络 |
host |
使用宿主机网络 |
none |
无网络 |
| 自定义网络 | 推荐用于多个容器互联 |
创建自定义网络:
docker network create app-net
运行容器加入网络:
docker run -d --name app1 --network app-net nginx
如果多个容器在同一个自定义网络中,它们可以通过容器名互相访问。比如一个 Web 容器可以通过 mysql8:3306 访问数据库容器。
这比把数据库端口暴露到公网更安全。
二十、Docker 清理空间
Docker 使用一段时间后,可能会积累很多无用镜像、停止的容器和缓存。
查看 Docker 占用空间:
docker system df
删除停止的容器:
docker container prune
删除无用镜像:
docker image prune
删除无用网络:
docker network prune
一键清理未使用资源:
docker system prune
如果想连未使用的数据卷也清理:
docker system prune -a --volumes
注意:清理数据卷可能导致重要数据丢失,执行前一定要确认。
二十一、Docker 常见问题与解决方法
1. 执行 docker 命令提示权限不足
错误示例:
permission denied while trying to connect to the Docker daemon socket
解决方法:
sudo usermod -aG docker $USER
newgrp docker
或者使用:
sudo docker ps
2. Docker 服务未启动
查看状态:
sudo systemctl status docker
启动服务:
sudo systemctl start docker
3. 镜像下载速度慢
可以配置镜像加速器,或者更换网络环境。配置完成后重启 Docker:
sudo systemctl restart docker
4. 端口访问不了
排查顺序:
- 容器是否运行:
docker ps - 端口是否映射正确;
- Debian 防火墙是否放行;
- 云服务器安全组是否放行;
- 应用本身是否监听正确端口。
5. 容器启动后马上退出
查看日志:
docker logs 容器名称
常见原因包括:
- 环境变量缺失;
- 配置文件错误;
- 端口冲突;
- 数据目录权限不正确;
- 镜像版本不兼容。
二十二、Docker 部署安全建议
Docker 使用方便,但安全问题也不能忽视。
1. 不要随便使用未知镜像
尽量使用官方镜像或可信镜像。比如:
nginx
mysql
redis
postgres
不要随意运行来源不明的镜像。
2. 不要把敏感端口暴露公网
例如:
- MySQL:3306
- Redis:6379
- PostgreSQL:5432
- MongoDB:27017
如果必须开放,建议限制访问 IP,并设置强密码。
3. 使用强密码
数据库、后台管理系统、面板程序都应使用强密码,不要使用:
123456
admin
password
root
4. 定期更新镜像
拉取新镜像:
docker pull nginx
重新创建容器后即可使用新版镜像。
如果使用 Compose:
docker compose pull
docker compose up -d
5. 备份重要数据
对于数据库、网站文件等重要数据,务必定期备份。不要认为 Docker 挂载目录就等于备份。
可以使用:
tar -czvf backup.tar.gz /opt/mysql/data
也可以使用专业备份工具或云服务器快照。
二十三、推荐的 Docker 项目目录结构
为了方便管理,建议把 Docker 项目统一放在 /opt 或 /srv 目录下。
例如:
/opt/docker/
├── nginx/
│ ├── compose.yml
│ └── html/
├── mysql/
│ ├── compose.yml
│ └── data/
├── redis/
│ └── compose.yml
└── app/
├── compose.yml
├── config/
└── data/
这样做的好处:
- 项目结构清晰;
- 方便备份;
- 方便迁移;
- 方便排查问题;
- 不同服务互不干扰。
二十四、Docker 卸载方法
如果你想卸载 Docker,可以执行:
sudo apt remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果想删除 Docker 数据:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
注意:删除
/var/lib/docker会清空所有镜像、容器、数据卷等内容,请谨慎操作。
二十五、总结
本文从零开始介绍了如何在 Debian 系统上部署 Docker,包括系统准备、安装 Docker、启动服务、运行第一个容器、常用命令、端口映射、数据挂载、Docker Compose、网络、防火墙、安全建议以及常见问题处理。
对于新手来说,学习 Docker 可以按照以下顺序:
- 先理解镜像和容器的概念;
- 学会安装 Docker;
- 掌握
docker run、docker ps、docker logs、docker stop等基础命令; - 学会端口映射和数据挂载;
- 学会使用 Docker Compose 管理服务;
- 最后再学习网络、安全、镜像构建等进阶内容。
如果你只是想快速部署服务,Docker 可以极大简化流程;如果你想深入学习运维、后端、云原生,Docker 更是必备技能。按照本文步骤操作,你已经可以在 Debian 上完成 Docker 的基础部署,并具备继续学习和实践的能力。