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

Debian 上手 Docker:从安装到部署服务,一篇就够了

发布人:慈云数据-客服中心 发布时间:2026-06-06 12:20 阅读量:431

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 作为基础系统。它的优点包括:

  1. 稳定性强:Debian 以稳定著称,非常适合服务器长期运行。
  2. 软件生态成熟:支持大量开源软件,Docker 官方也支持 Debian。
  3. 资源占用较低:适合云服务器、VPS、家庭服务器等场景。
  4. 社区资料丰富:遇到问题时容易找到解决方案。

常见的 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 已经可以正常运行。

这条命令背后的流程是:

  1. Docker 检查本地是否存在 hello-world 镜像;
  2. 如果没有,就从 Docker Hub 下载;
  3. 下载完成后创建并启动容器;
  4. 容器输出测试信息后自动退出。

七、让普通用户无需 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

但需要注意:

  1. 宿主机端口不能被其他程序占用;
  2. 低端口如 80、443 通常需要管理员权限;
  3. 云服务器安全组或防火墙需要放行对应端口。

十、Docker 数据挂载详解

Docker 容器本身是临时性的。如果删除容器,容器内部的数据通常也会丢失。因此在部署数据库、网站、配置文件时,一定要使用数据挂载。

Docker 常见的数据保存方式有两种:

  1. 目录挂载 Bind Mount
  2. 数据卷 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. 端口访问不了

排查顺序:

  1. 容器是否运行:docker ps
  2. 端口是否映射正确;
  3. Debian 防火墙是否放行;
  4. 云服务器安全组是否放行;
  5. 应用本身是否监听正确端口。

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/

这样做的好处:

  1. 项目结构清晰;
  2. 方便备份;
  3. 方便迁移;
  4. 方便排查问题;
  5. 不同服务互不干扰。

二十四、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 可以按照以下顺序:

  1. 先理解镜像和容器的概念;
  2. 学会安装 Docker;
  3. 掌握 docker run、docker ps、docker logs、docker stop 等基础命令;
  4. 学会端口映射和数据挂载;
  5. 学会使用 Docker Compose 管理服务;
  6. 最后再学习网络、安全、镜像构建等进阶内容。

如果你只是想快速部署服务,Docker 可以极大简化流程;如果你想深入学习运维、后端、云原生,Docker 更是必备技能。按照本文步骤操作,你已经可以在 Debian 上完成 Docker 的基础部署,并具备继续学习和实践的能力。

目录结构
全文