Docker Engine 与 Compose
组件地图
| 组件 | 作用 |
|---|---|
dockerd / Docker Engine | 创建和管理镜像、容器、网络、卷的 daemon |
docker CLI | 向 daemon 发送命令 |
containerd | Docker 使用的底层容器运行时 |
| Buildx | 扩展镜像构建能力 |
| Compose plugin | 用 docker compose管理多容器应用 |
安装 Docker 不等于部署应用。只有创建并启动容器后,才出现应用工作负载。
先检查现状
[REMOTE: VPS]
command -v docker || true
docker --version || true
docker compose version || true
dpkg -l | grep -E 'docker|containerd' || true
如果已有受支持且正常工作的 Docker,不要重复安装或混用来源。本系列使用 Docker 官方 apt 仓库,不首选 Ubuntu 的 docker.io包。
配置官方 apt 仓库
[REMOTE: VPS]
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
/etc/apt/sources.list.d/docker.sources
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: <UBUNTU_CODENAME>
Components: stable
Architectures: <DPKG_ARCHITECTURE>
Signed-By: /etc/apt/keyrings/docker.asc
用系统实际值生成代号和架构,不照抄别的 Ubuntu 版本:
[REMOTE: VPS]
. /etc/os-release
printf '%s\n' "${UBUNTU_CODENAME:-$VERSION_CODENAME}"
dpkg --print-architecture
sudo apt update
apt-cache policy docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
若官方仓库没有当前系统的候选包,应停止,而不是把源代号伪装成另一个版本。
安装前模拟,安装后验收
[REMOTE: VPS]
sudo apt-get -s install \
docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
确认摘要没有移除关键包,再安装:
[REMOTE: VPS]
sudo apt install -y \
docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
systemctl is-enabled docker
systemctl is-active docker
docker --version
docker compose version
非 root 使用与安全含义
[REMOTE: VPS]
sudo usermod -aG docker "$VPS_USER"
补充组只在新登录会话中刷新,所以应退出并通过 Tailscale 重新 SSH,再运行 id。不要用:
sudo chmod 666 /var/run/docker.sock
docker组本身就授予接近 root 的能力,因为成员可以让 daemon 挂载主机路径或启动高权限容器。只把可信管理员加入该组。
功能测试
[REMOTE: fresh login as VPS_USER]
id
docker info --format \
'ServerVersion={{.ServerVersion}} Driver={{.Driver}} CgroupDriver={{.CgroupDriver}}'
docker run --rm hello-world
docker ps -a
hello-world流程是:CLI 联系 daemon、daemon 拉取镜像、创建容器、运行并输出结果。--rm在容器退出后删除容器,但镜像通常仍保留在本地缓存中。
镜像、容器、卷不要混为一谈
- 删除容器不会自动删除镜像。
- 重建容器不会保留容器可写层中的重要数据。
- 需要持久化的数据应放入命名卷或明确的主机目录。
/var/lib/docker是 Docker 内部状态,不应当作手工编辑区。- Compose 文件描述期望状态,但本基础阶段不创建任何应用 Compose 文件。
防火墙提醒
Docker 发布的容器端口可能绕过 UFW 的常规规则。每次未来 部署都应同时审查 Compose 的 ports、实际监听地址以及 Docker/iptables 规则。将服务只绑定到 127.0.0.1、Tailscale 地址或反向代理网络,含义完全不同,必须有意识地选择。