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

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

发布人:慈云数据-客服中心 发布时间:14小时前 阅读量:4

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 官方安装方式需要用到一些基础工具,例如 curlgnupgca-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 rundocker psdocker logsdocker stop 等基础命令;
  4. 学会端口映射和数据挂载;
  5. 学会使用 Docker Compose 管理服务;
  6. 最后再学习网络、安全、镜像构建等进阶内容。

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

目录结构
全文