# 安装 Docker：选对软件源并验证容器

Docker 的安装方式应匹配发行版及受支持版本。新部署不再沿用 Ubuntu 16.04 或 CentOS 7 的旧安装脚本。

更新日期：2026-09-16

规范地址：https://stock.iftalking.com/guides/docker/

## 1. 确认系统、架构和已有容器环境

本文以受支持的 Ubuntu Server 为例安装 Docker Engine。先查看系统版本和架构，再按 Docker 官方安装页选择对应发行版；Debian、Rocky 等系统应使用各自的安装说明，不能直接添加 Ubuntu 软件源。

```bash
cat /etc/os-release
dpkg --print-architecture
command -v docker
systemctl status docker
```

已有 Docker、Podman 或 containerd 业务时，先列出容器、卷和依赖，不要直接执行“删除冲突包”的批量命令。新服务器可按下一步安装；旧服务器迁移容器引擎需要单独维护计划。

## 2. 添加官方软件源

打开文末 Docker 官方 Ubuntu 安装页，使用当前的 apt repository 方法。主要过程是安装证书和 curl、保存 Docker 签名密钥，再创建与本机发行版代号和架构匹配的源文件。

```bash
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
```

接着创建源文件。以下代码从本机读取 Ubuntu 代号和架构，发现已有配置时会停止，适用于尚未配置 Docker 软件源的新服务器。

```bash
sudo sh -eu <<'DOCKER_SOURCE'
if [ -e /etc/apt/sources.list.d/docker.sources ] || [ -e /etc/apt/sources.list.d/docker.list ]; then
  echo '已有 Docker 软件源，请先核对现有配置。' >&2
  exit 1
fi
. /etc/os-release
[ "$ID" = ubuntu ] || { echo '此示例只适用于 Ubuntu。' >&2; exit 1; }
docker_codename=${UBUNTU_CODENAME:-$VERSION_CODENAME}
docker_arch=$(dpkg --print-architecture)
cat > /etc/apt/sources.list.d/docker.sources <<SOURCE_CONFIG
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $docker_codename
Components: stable
Architectures: $docker_arch
Signed-By: /etc/apt/keyrings/docker.asc
SOURCE_CONFIG
apt update
DOCKER_SOURCE
```

确认更新输出没有软件源或签名错误，再继续安装。不要从博客复制其他系统的代号，也不要因为签名失败就关闭验证。

## 3. 安装引擎与 Compose 插件

```bash
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world
```

看到客户端和服务端版本，并且 hello-world 输出正常后退出，说明基本运行链路成立。它不应该一直保持 Running，因为这个测试容器本来就是一次性程序。

普通用户执行 Docker 命令提示权限不足时，可继续使用 sudo。加入 docker 组等同于授予很高的主机控制能力，不应为了方便把所有用户都加入。

## 4. 发布端口前确认暴露范围

容器内部监听端口，与主机公开端口是两层配置。下面把 Nginx 容器的 80 端口仅映射到主机回环地址 8080，适合通过现有反向代理接入。

```bash
sudo docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx:stable-alpine
curl -I http://127.0.0.1:8080/
sudo docker logs --tail 30 web-demo
```

这是测试容器，镜像标签应在正式部署时固定到确认过的版本或摘要。使用 `-p 8080:80` 可能对所有接口开放；Docker 发布端口与 UFW/firewalld 的规则存在交互，不能只看 UFW 状态就判断端口没有暴露。

## 5. 保存数据并建立更新方式

容器可以替换，数据库和上传文件必须放到明确的卷或绑定目录中。删除容器前先查看 Mounts，确认数据存放位置。不要把 `docker system prune --volumes` 当成常规清理按钮。

```bash
sudo docker ps -a
sudo docker inspect web-demo
sudo docker system df
```

测试完成后可停止并删除自己创建的 `web-demo`；上线应用使用[Compose 管理](https://stock.iftalking.com/guides/compose-management/)，并补齐[备份](https://stock.iftalking.com/guides/backup-restore/)、HTTPS、日志轮转和健康检查。


## 完成后检查

不要把生产数据只放在容器可写层；删除或重建容器前确认卷与备份。

## 参考资料

- [Docker 官方文档](https://docs.docker.com/engine/install/ubuntu/)
