Debian 上手 Docker:从安装到部署 Nginx、MySQL、Redis 一篇搞定
Debian Docker部署教程|零基础可学
Docker 是目前最流行的容器化技术之一。它可以把应用程序及其运行环境打包到一个独立的“容器”中,让应用在不同服务器、不同系统环境下都能稳定运行。对于刚接触 Linux 服务器的新手来说,Docker 能大大降低部署网站、数据库、面板、网盘、博客系统等服务的难度。
本文将以 Debian 系统 为例,从零开始讲解 Docker 的安装、配置、常用命令以及实际部署示例。即使你之前没有接触过 Docker,也可以按照本文一步一步完成部署。
一、Docker 是什么?
在正式安装之前,我们先简单理解一下 Docker。
传统部署一个应用时,通常需要安装运行环境,例如:
- 部署 PHP 网站,需要安装 Nginx、PHP、MySQL;
- 部署 Java 项目,需要安装 JDK、Tomcat;
- 部署 Python 项目,需要安装 Python、pip、依赖库;
- 部署数据库,需要配置用户、端口、数据目录等。
这些操作不仅繁琐,而且容易因为系统版本、依赖版本不同而出错。
Docker 的作用就是把应用和依赖环境打包成一个整体。你只需要运行一个镜像,就可以快速启动服务。
简单来说:
Docker 镜像类似“安装包”,Docker 容器类似“运行中的程序”。
例如你想运行一个 Nginx 网站,不需要手动安装 Nginx,只需要执行一条命令:
docker run -d -p 80:80 nginx
Docker 就会自动下载 Nginx 镜像并运行一个 Web 服务。
二、准备工作
在安装 Docker 之前,需要准备一台 Debian 系统的服务器或虚拟机。
本文适用于以下系统:
- Debian 10
- Debian 11
- Debian 12
建议使用 Debian 11 或 Debian 12。
1. 登录服务器
如果你使用的是云服务器,可以通过 SSH 登录:
ssh root@服务器IP
例如:
ssh root@192.168.1.100
如果系统提示确认连接,输入:
yes
然后输入服务器密码即可登录。
2. 检查系统版本
登录后,可以执行以下命令查看 Debian 版本:
cat /etc/debian_version
也可以查看更详细的信息:
cat /etc/os-release
3. 更新系统软件包
安装 Docker 之前,建议先更新系统软件源和软件包:
apt update
apt upgrade -y
其中:
apt update:更新软件源列表;apt upgrade -y:升级已安装的软件包;-y:自动确认安装。
三、安装 Docker
Debian 安装 Docker 有多种方式,本文推荐使用 Docker 官方仓库安装。这样安装的版本较新,也更加稳定。
1. 卸载旧版本 Docker
如果系统中曾经安装过旧版本 Docker,可以先执行以下命令卸载:
apt remove -y docker docker-engine docker.io containerd runc
如果提示没有安装相关软件,也不用担心,继续下一步即可。
2. 安装必要依赖
Docker 官方仓库需要一些基础工具支持:
apt install -y ca-certificates curl gnupg lsb-release
这些软件的作用如下:
ca-certificates:用于 HTTPS 证书验证;curl:用于下载文件;gnupg:用于验证软件源签名;lsb-release:用于识别系统版本信息。
3. 添加 Docker 官方 GPG 密钥
执行以下命令创建密钥目录:
install -m 0755 -d /etc/apt/keyrings
然后下载 Docker 官方 GPG 密钥:
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
4. 添加 Docker 软件源
执行以下命令添加 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 软件源添加成功。
5. 安装 Docker Engine
执行以下命令安装 Docker:
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:
systemctl start docker
设置开机自动启动:
systemctl enable docker
查看 Docker 运行状态:
systemctl status docker
如果看到类似以下内容,说明 Docker 正在运行:
Active: active (running)
五、验证 Docker 是否安装成功
可以通过查看版本验证:
docker version
也可以运行官方测试容器:
docker run hello-world
如果看到类似以下提示:
Hello from Docker!
This message shows that your installation appears to be working correctly.
说明 Docker 已经安装成功。
六、Docker 基础概念
学习 Docker 时,常见的几个概念一定要理解。
1. 镜像 Image
镜像是一个只读模板,里面包含应用程序和运行环境。
例如:
nginx镜像:包含 Nginx 服务;mysql镜像:包含 MySQL 数据库;redis镜像:包含 Redis 服务;ubuntu镜像:包含 Ubuntu 基础系统。
可以把镜像理解为“软件安装包”。
2. 容器 Container
容器是镜像运行后的实例。
例如你使用 nginx 镜像创建了一个容器,这个容器就是正在运行的 Nginx 服务。
可以把容器理解为“正在运行的软件”。
3. 仓库 Registry
仓库用于存放镜像。最常见的是 Docker Hub。
例如执行:
docker pull nginx
Docker 会从 Docker Hub 下载 Nginx 镜像。
4. 数据卷 Volume
容器本身可以删除、重建,因此如果重要数据直接放在容器内部,删除容器后数据可能会丢失。
数据卷用于持久化保存数据。
例如数据库数据、网站文件、配置文件,通常都应该挂载到宿主机目录或 Docker Volume 中。
七、Docker 常用命令
下面介绍一些新手必须掌握的 Docker 命令。
1. 查看 Docker 版本
docker version
查看更简洁的信息:
docker --version
2. 搜索镜像
docker search nginx
3. 下载镜像
docker pull nginx
指定版本下载:
docker pull nginx:stable
如果不指定版本,默认下载 latest 标签。
4. 查看本地镜像
docker images
或:
docker image ls
5. 运行容器
docker run -d --name my-nginx -p 80:80 nginx
参数说明:
-d:后台运行;--name my-nginx:容器名称为my-nginx;-p 80:80:端口映射,前面的 80 是服务器端口,后面的 80 是容器端口;nginx:使用的镜像名称。
6. 查看运行中的容器
docker ps
查看所有容器,包括停止的容器:
docker ps -a
7. 停止容器
docker stop my-nginx
也可以使用容器 ID:
docker stop 容器ID
8. 启动已停止的容器
docker start my-nginx
9. 重启容器
docker restart my-nginx
10. 删除容器
删除容器前需要先停止:
docker stop my-nginx
docker rm my-nginx
如果想强制删除:
docker rm -f my-nginx
11. 删除镜像
docker rmi nginx
如果镜像正在被容器使用,需要先删除对应容器。
12. 查看容器日志
docker logs my-nginx
实时查看日志:
docker logs -f my-nginx
13. 进入容器内部
docker exec -it my-nginx bash
如果容器内没有 bash,可以使用:
docker exec -it my-nginx sh
退出容器:
exit
八、实战:使用 Docker 部署 Nginx 网站
下面通过一个简单示例,演示如何使用 Docker 部署 Nginx 网站。
1. 创建网站目录
mkdir -p /docker/nginx/html
mkdir -p /docker/nginx/conf
创建一个测试网页:
cat > /docker/nginx/html/index.html << EOF
Docker Nginx
Debian Docker Nginx 部署成功!
EOF
2. 启动 Nginx 容器
执行以下命令:
docker run -d \
--name nginx-web \
-p 80:80 \
-v /docker/nginx/html:/usr/share/nginx/html \
--restart=always \
nginx
参数说明:
--name nginx-web:设置容器名称;-p 80:80:将服务器 80 端口映射到容器 80 端口;-v /docker/nginx/html:/usr/share/nginx/html:将宿主机网页目录挂载到容器网页目录;--restart=always:容器异常退出或服务器重启后自动启动;nginx:使用 Nginx 镜像。
3. 访问网站
在浏览器中访问:
http://服务器IP
如果看到页面显示:
Debian Docker Nginx 部署成功!
说明 Nginx 网站已经部署成功。
九、Docker Compose 部署方式
虽然 docker run 可以启动容器,但当服务越来越多时,命令会变得很长,不方便维护。
Docker Compose 可以通过一个 YAML 文件管理多个容器,非常适合部署网站、数据库、反向代理等服务。
新版 Docker 安装后一般自带 Compose 插件,可以查看版本:
docker compose version
注意新版命令是:
docker compose
而旧版是:
docker-compose
十、实战:使用 Docker Compose 部署 Nginx
1. 创建项目目录
mkdir -p /docker/compose-nginx/html
cd /docker/compose-nginx
创建网页文件:
cat > html/index.html << EOF
Docker Compose Nginx
Docker Compose 部署 Nginx 成功!
EOF
2. 编写 compose.yml 文件
nano compose.yml
写入以下内容:
services:
nginx:
image: nginx:latest
container_name: compose-nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: always
保存并退出。
如果使用 nano 编辑器:
- 按
Ctrl + O保存; - 按回车确认;
- 按
Ctrl + X退出。
3. 启动服务
在 /docker/compose-nginx 目录下执行:
docker compose up -d
查看容器:
docker ps
访问:
http://服务器IP:8080
如果页面正常显示,说明 Docker Compose 部署成功。
4. 停止服务
docker compose down
如果只是重启:
docker compose restart
查看日志:
docker compose logs
实时查看日志:
docker compose logs -f
十一、配置 Docker 镜像加速
在国内服务器上拉取 Docker Hub 镜像时,可能会出现速度慢或下载失败的问题。这时可以配置镜像加速器。
创建 Docker 配置目录:
mkdir -p /etc/docker
编辑配置文件:
nano /etc/docker/daemon.json
写入类似内容:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
]
}
保存后重启 Docker:
systemctl daemon-reload
systemctl restart docker
查看是否生效:
docker info
在输出内容中找到 Registry Mirrors,如果显示了镜像地址,说明配置成功。
提醒:镜像加速地址可能会随时间变化,如果不可用,可以更换为云服务商提供的最新地址。
十二、普通用户使用 Docker
默认情况下,Docker 命令通常需要 root 权限。如果你希望普通用户也能使用 Docker,可以将用户加入 docker 用户组。
假设用户名是 debian:
usermod -aG docker debian
然后退出 SSH,重新登录。
测试:
docker ps
如果不再提示权限不足,说明配置成功。
注意:加入 docker 组的用户几乎等同于拥有 root 权限,因此不要随意给不可信用户添加该权限。
十三、Docker 数据持久化
使用 Docker 时,数据持久化非常重要。
假设你部署 MySQL,如果不挂载数据目录,容器删除后数据库数据可能会丢失。因此推荐使用数据卷或宿主机目录挂载。
1. 使用宿主机目录挂载
示例:
docker run -d \
--name mysql-demo \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /docker/mysql/data:/var/lib/mysql \
mysql:8.0
这里:
-v /docker/mysql/data:/var/lib/mysql
表示将 MySQL 数据保存到宿主机 /docker/mysql/data 目录。
即使容器删除,只要这个目录不删除,数据仍然存在。
2. 使用 Docker Volume
创建数据卷:
docker volume create mysql-data
运行容器时挂载:
docker run -d \
--name mysql-volume-demo \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
查看数据卷:
docker volume ls
查看数据卷详情:
docker volume inspect mysql-data
十四、Docker 网络基础
Docker 容器之间可以通过网络通信。默认情况下,Docker 会创建一个 bridge 网络。
查看网络:
docker network ls
创建自定义网络:
docker network create mynet
运行容器时指定网络:
docker run -d --name nginx1 --network mynet nginx
如果多个容器在同一个自定义网络中,它们可以通过容器名互相访问。
例如:
docker run -d --name redis --network mynet redis
其他同网络容器可以通过 redis:6379 访问 Redis 服务。
十五、部署 MySQL 示例
下面演示一个 MySQL 容器部署示例。
1. 创建目录
mkdir -p /docker/mysql/data
2. 启动 MySQL
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=StrongPassword123 \
-v /docker/mysql/data:/var/lib/mysql \
--restart=always \
mysql:8.0
3. 查看运行状态
docker ps
查看日志:
docker logs mysql8
进入 MySQL:
docker exec -it mysql8 mysql -uroot -p
输入密码:
StrongPassword123
进入后可以执行:
SHOW DATABASES;
退出 MySQL:
exit;
安全建议:生产环境不要使用简单密码,也不要随意将数据库端口暴露到公网。
十六、部署 Redis 示例
1. 创建目录
mkdir -p /docker/redis/data
2. 启动 Redis
docker run -d \
--name redis \
-p 6379:6379 \
-v /docker/redis/data:/data \
--restart=always \
redis:latest \
redis-server --appendonly yes
参数说明:
--appendonly yes:开启 AOF 持久化;/data:Redis 数据目录;--restart=always:开机自动启动。
查看日志:
docker logs redis
进入 Redis:
docker exec -it redis redis-cli
测试:
ping
如果返回:
PONG
说明 Redis 正常运行。
十七、防火墙与端口开放
如果你部署的服务无法访问,除了检查 Docker 容器是否运行,还需要检查服务器防火墙和云服务商安全组。
1. 查看端口监听
ss -tulnp
2. Debian 使用 UFW 放行端口
如果安装了 UFW,可以执行:
ufw allow 80
ufw allow 443
ufw allow 8080
查看状态:
ufw status
3. 云服务器安全组
如果你使用的是阿里云、腾讯云、华为云、AWS 等云服务器,还需要到控制台安全组中放行对应端口。
例如:
- HTTP:80
- HTTPS:443
- MySQL:3306
- Redis:6379
- 自定义网站端口:8080
对数据库、Redis 等服务,不建议直接开放公网端口,除非你已经做好 IP 白名单、强密码和访问控制。
十八、Docker 日常维护
Docker 使用一段时间后,可能会产生无用镜像、停止的容器、构建缓存等,占用磁盘空间。
1. 查看磁盘占用
docker system df
2. 清理停止的容器
docker container prune
3. 清理无用镜像
docker image prune
清理所有未使用镜像:
docker image prune -a
4. 清理无用数据卷
docker volume prune
执行前请确认数据卷不再使用,否则可能删除重要数据。
5. 一键清理无用资源
docker system prune
清理更彻底:
docker system prune -a
注意:清理命令有风险,生产环境执行前一定要确认不会删除重要镜像、容器或数据。
十九、常见问题排查
1. Docker 启动失败怎么办?
查看状态:
systemctl status docker
查看详细日志:
journalctl -u docker -xe
常见原因包括:
/etc/docker/daemon.jsonJSON 格式错误;- 软件源安装不完整;
- 系统内核或依赖异常。
如果修改过 daemon.json,可以使用以下命令检查 JSON 格式:
cat /etc/docker/daemon.json
确保逗号、引号、括号没有错误。
2. 容器启动后访问不了?
可以按以下顺序排查:
- 查看容器是否运行:
docker ps
- 查看端口是否映射:
docker port 容器名
- 查看容器日志:
docker logs 容器名
- 查看服务器端口监听:
ss -tulnp
- 检查防火墙和云服务器安全组。
3. 拉取镜像失败怎么办?
可以尝试:
docker pull nginx
如果速度很慢或失败:
- 检查服务器网络;
- 配置镜像加速;
- 更换镜像标签;
- 使用云服务商提供的镜像源。
4. 端口被占用怎么办?
如果启动容器时报错类似:
Bind for 0.0.0.0:80 failed: port is already allocated
说明服务器的 80 端口已经被占用。
查看占用进程:
ss -tulnp | grep :80
解决方法:
- 停止占用端口的服务;
- 或修改 Docker 端口映射,例如使用
8080:80。
二十、Docker 安全建议
Docker 部署方便,但也需要注意安全。
1. 不要随便使用未知镜像
尽量使用官方镜像或可信镜像。例如:
nginx
mysql
redis
postgres
ubuntu
debian
如果使用第三方镜像,需要查看维护情况、文档说明和用户评价。
2. 不要使用弱密码
尤其是数据库、管理面板、后台系统等服务。密码应包含:
- 大写字母;
- 小写字母;
- 数字;
- 特殊符号;
- 足够长度。
3. 不要随意暴露数据库端口
MySQL、Redis、PostgreSQL 等服务尽量只允许内网访问。如果必须公网访问,应限制 IP 白名单。
4. 定期更新镜像
可以定期执行:
docker pull 镜像名
docker compose up -d
更新服务前建议备份数据。
5. 做好数据备份
Docker 容器可以随时重建,但数据不能丢。重要目录如:
- 网站文件;
- 数据库数据;
- 配置文件;
- 上传附件;
都应该定期备份。
二十一、推荐的 Docker 部署目录结构
为了方便管理,建议统一把 Docker 服务放在 /docker 目录下,例如:
/docker
├── nginx
│ ├── html
│ └── conf
├── mysql
│ └── data
├── redis
│ └── data
└── app
├── compose.yml
└── data
这样做的好处是:
- 服务目录清晰;
- 数据方便备份;
- 配置方便迁移;
- 排查问题更容易。
如果使用 Docker Compose,每个项目可以单独放一个目录:
/docker/project-name/compose.yml
进入对应目录后执行:
docker compose up -d
即可启动服务。
二十二、总结
本文以 Debian 系统为例,完整讲解了 Docker 的安装、启动、验证、基础概念、常用命令、Docker Compose 使用方法,以及 Nginx、MySQL、Redis 的实际部署示例。
对于零基础用户来说,建议按照以下学习路线掌握 Docker:
- 先学会安装 Docker;
- 理解镜像、容器、数据卷、端口映射;
- 熟悉
docker run、docker ps、docker logs、docker stop等常用命令; - 学会使用目录挂载保存数据;
- 学会使用 Docker Compose 管理服务;
- 注意防火墙、安全组和数据备份。
Docker 的优势在于部署快、迁移方便、环境一致。只要掌握基本命令和配置思路,就可以用它部署大多数常见服务。对于新手来说,不必一开始就追求复杂架构,先从 Nginx、MySQL、Redis 这些基础服务练习,逐步积累经验,就能熟练使用 Docker 管理自己的服务器。