Docker 在 VPS 上:完整安装和使用指南
目录
Docker 是什么以及为什么在 VPS 上使用 Docker
Docker 是一种容器化技术,允许您将应用程序及其所有依赖项、库和配置打包到一个称为容器的标准化单元中。与应用程序直接在操作系统上运行的传统部署不同,Docker 容器提供隔离的环境,每个应用程序独立运行,不会相互干扰。
在 VPS 上使用 Docker 为现代开发和部署工作流程带来了重大优势:
- 隔离和稳定性:每个容器在自己的隔离环境中运行。如果一个应用程序出现故障或问题,不会影响其他容器或主机系统。
- 资源效率:容器比虚拟机轻得多,通常只使用几 MB 的 RAM,而虚拟机使用数百 MB 或 GB。这意味着您可以在单个 VPS 上运行许多应用程序。
- 环境间的一致性:Docker 镜像确保您的应用程序在本地机器、暂存服务器和生产 VPS 上的运行方式完全相同。这消除了「但它在我的机器上运行」的问题。
- 可扩展性:Docker 使通过运行多个容器实例和使用负载均衡来轻松扩展应用程序。
- 更快的部署:Docker 镜像可以在几秒内启动,支持快速部署和更新。
Docker 与虚拟机有根本区别。虽然虚拟机需要为每个实例运行完整的操作系统,消耗数 GB 的存储和大量的 CPU 资源,但 Docker 容器共享主机 OS 内核。这使得 Docker 在单个 VPS 上运行多个应用程序时效率和成本效益都大大提高。
Docker 的 VPS 要求和系统规格
成功运行 Docker 需要 VPS 具有足够的系统资源和正确的配置。具体要求取决于您计划运行多少容器以及它们的资源需求,但这是基本建议:
- CPU:建议最少 2 个 CPU 核心用于基本 Docker 工作负载。对于包含多个容器的生产环境,4+ 核心提供更好的性能。Docker 容器可以共享 CPU 资源,因此核心总数限制了可以同时运行的容器数量。
- RAM:主机 OS 和 Docker 守护程序至少需要 2 GB RAM,加上容器所需的额外 RAM。对于运行单个小型应用程序,总共 2 GB 可能就足够了,但 4 GB 更舒服,生产设置建议 8+ GB。
- 存储:Docker 镜像和容器数据需要磁盘空间。强烈建议为 Docker 工作负载使用 SSD 存储,因为它可以显著改善镜像拉取和容器启动时间。至少需要 20 GB,但 50+ GB 更适合存储多个镜像和持久数据卷。
- 操作系统:Docker 在现代 Linux 发行版上工作效果最好。Ubuntu 20.04 LTS、22.04 LTS 和更新版本是理想的。CentOS 7+ 和 Debian 10+ 也支持 Docker。Windows VPS 可以运行 Docker,但由于 Hyper-V 的资源开销更高。
- Linux 内核:Docker 需要 Linux 内核 3.10 或更新版本(建议使用 5.10+ 以获得更好的性能)。使用命令
uname -r检查内核版本。 - 网络:用于从注册表拉取 Docker 镜像的稳定互联网连接。确保您的 VPS 具有良好的带宽,特别是在部署期间下载大型镜像。
如果您计划仅运行一个或两个轻量级容器,具有 2 GB RAM 和 2 个 CPU 核心的 VPS 可能就足够了。但是,对于生产使用或多个服务,投资于具有 4+ GB RAM、4+ CPU 核心和 100+ GB SSD 存储的 VPS 可以提供更好的稳定性和增长空间。
在 Ubuntu 上逐步安装 Docker Engine
使用官方 Docker 存储库在 Ubuntu 上安装 Docker 非常简单。按照以下步骤在您的 VPS 上启动并运行 Docker:
第 1 步:更新系统包
首先更新您的系统以确保所有包都是最新的:
sudo apt-get update
sudo apt-get upgrade -y
第 2 步:安装前置条件
安装 Docker 需要的必需包:
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
第 3 步:添加 Docker GPG 密钥和存储库
添加 Docker 官方 GPG 密钥和存储库:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第 4 步:安装 Docker Engine
更新包索引并安装 Docker:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
第 5 步:验证安装并运行第一个容器
通过运行 hello-world 镜像来测试 Docker 安装:
sudo docker run hello-world
要在不使用 sudo 的情况下管理 Docker,请将您的用户添加到 docker 组(可选但推荐):
sudo usermod -aG docker $USER
newgrp docker
通过检查其状态来验证 Docker 是否正在运行:
sudo systemctl status docker
启用 Docker 以在系统启动时自动启动:
sudo systemctl enable docker
Docker Compose:管理多容器应用程序
Docker Compose 是一个工具,可以简化运行多个相互连接的 Docker 容器作为单个应用程序的过程。Docker Compose 不是单独管理每个容器,而是使用 YAML 配置文件 (docker-compose.yml) 在一个地方定义所有服务、网络和卷。
安装 Docker Compose
使用 pip 安装 Docker Compose 或直接下载二进制文件:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
创建 docker-compose.yml 文件
包含数据库的 Web 应用程序的典型 docker-compose.yml 可能如下所示:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动和管理服务
启动在编写文件中定义的所有服务:
docker-compose up -d
查看正在运行的服务:
docker-compose ps
查看特定服务的日志:
docker-compose logs web
停止所有服务:
docker-compose down
Docker Compose 自动创建连接所有服务的网络,因此容器可以通过服务名称相互通信。这消除了手动管理网络的需要,使多容器设置更容易维护。
管理 Docker 容器、镜像和持久数据卷
有效的容器管理包括了解如何使用镜像、容器和数据卷。这些是在生产环境中运行 Docker 的基本概念。
Docker 镜像和容器
Docker 镜像是包含运行应用程序所需的一切的只读蓝图。容器是镜像的运行实例。您可以将镜像视为类,将容器视为编程中的对象。
docker images - 列出系统上的所有镜像docker ps -a - 列出所有容器(运行和已停止)docker run -d --name mycontainer nginx:latest - 创建并启动容器
使用卷进行数据持久化
容器默认是短暂的;停止时,其中的所有数据都会丢失。卷提供持久存储,在容器重启后仍然存在,并且可以在容器之间共享:
docker volume create mydata - 创建命名卷docker run -v mydata:/app/data nginx:latest - 将卷挂载到容器docker volume ls - 列出所有卷
容器生命周期管理
- 启动和停止:
docker start container_id和docker stop container_id可以正常关闭容器。 - 重启:
docker restart container_id停止并重启容器。 - 删除:
docker rm container_id删除已停止的容器。使用-f标志强制删除运行中的容器。 - 查看日志:
docker logs container_id显示容器输出用于调试。 - 资源限制:
docker run -m 512m --cpus=0.5 image_name限制内存和 CPU 使用率。
清理未使用的资源
Docker 会随着时间的推移积累未使用的镜像和容器。清理方法:
docker system prune -a - 删除所有未使用的容器、镜像和卷docker image prune - 删除悬空镜像docker volume prune - 删除未使用的卷
将 Nginx 用作 Docker 容器的反向代理
在 Docker 容器前运行 Nginx 作为反向代理,可以提供负载均衡、SSL/TLS 终止和将流量路由到正确容器等优势。这是生产部署中的常见模式。
设置 Nginx 反向代理
为反向代理到 Docker 容器创建 Nginx 配置文件:
upstream backend {
server web1:3000;
server web2:3000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Docker 网络
容器通过 Docker 网络通信。使用 Docker Compose 时,服务会自动添加到网络中,可以通过服务名称相互到达。对于手动 Docker 网络:
docker network create mynetwork - 创建自定义网络docker run --network mynetwork --name web nginx:latest - 将容器连接到网络
具有 Nginx 的 Docker Compose 设置
在 docker-compose.yml 中,将 Nginx 服务与同一网络上的其他容器一起定义:
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web1
- web2
web1:
image: myapp:latest
web2:
image: myapp:latest
健康检查和负载均衡
配置健康检查以确保流量仅流向健康的容器:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
Nginx 自动处理多个后端服务器之间的负载均衡,均匀分配请求并跳过不健康的服务器。
Docker 安全最佳实践和加固
在生产环境中运行 Docker 时,安全应该是首要考虑事项。容器安全涉及保护主机系统、镜像、容器和网络通信。以下是基本安全实践:
以非 Root 用户身份运行容器
永远不要以 root 身份运行容器。在 Dockerfile 中创建用户:
RUN useradd -m -s /bin/bash appuser
USER appuser
这限制了容器被攻击的损害。
资源限制和安全约束
设置资源限制以防止容器消耗过多系统资源并影响其他容器或主机:
docker run -m 512m --memory-swap 1g --cpus 1 image_name
使用 --cap-drop 标志删除容器不需要进行操作的不必要 Linux 功能。
镜像安全和扫描
- 使用来自官方注册表和可信来源的镜像,如 Docker Hub 官方镜像。
- 扫描镜像以查找漏洞:
docker scan image_name - 保持基础镜像最新,定期使用最新补丁重建容器。
- 通过使用较小的基础镜像(如 Alpine Linux)来最小化镜像大小。
- 避免在镜像中存储机密(密码、API 密钥);改为使用环境变量和机密管理工具。
网络安全
使用自定义 Docker 网络而不是主机网络模式来隔离容器。在 VPS 上定义防火墙规则以将流量限制为仅必要端口。对所有外部通信使用 HTTPS 和反向代理上的 SSL/TLS 证书。
容器注册表安全
如果使用私人注册表,确保使用强身份验证进行保护。使用镜像签名和验证来防止未授权镜像运行。定期审核使用中的镜像并删除不必要的镜像。
定期更新和监控
定期使用最新的安全补丁更新 Docker Engine、Docker Compose 和主机 OS。监控容器活动以查找可疑行为,并实施日志记录以跟踪容器操作。考虑使用 AsiaGB.com 进行 VPS 托管,它提供具有 SSD 存储、DirectAdmin 控制面板、99% 正常运行时间可靠性和 24 小时泰语支持的安全基础架构,以帮助保护您的 Docker 部署。
为泰国的 Docker 托管选择合适的 VPS
选择合适的 VPS 对于成功的 Docker 部署至关重要。合适的 VPS 提供商应提供充足的资源、可靠的性能和良好的支持。以下是为 Docker 选择 VPS 时要考虑的因素:
Docker VPS 的关键要求
- SSD 存储:这是必需的。与传统 HDD 存储相比,SSD 可以显著改善 Docker 镜像拉取、容器启动时间和整体应用程序性能。
- CPU 和 RAM:选择具有足够资源的计划来支持您的容器。对于任何严肃的 Docker 工作负载,至少需要 4 个 CPU 核心和 4 GB RAM。
- 正常运行时间保证:可靠的托管,正常运行时间达到 99% 或更高,确保您的 Docker 容器保持在线。
- 控制面板:DirectAdmin 提供用户友好的界面来管理您的 VPS,使配置 Docker 和管理应用程序变得更容易。
- 支持质量:24 小时以您当地语言提供的支持在出现问题时非常宝贵。
为什么 AsiaGB.com 适合 Docker 托管
AsiaGB.com 是在泰国和东南亚托管 Docker 应用程序的绝佳选择。他们的 VPS 计划配备 SSD 存储以获得最佳容器性能,DirectAdmin 控制面板便于管理,并且可靠的 99% 正常运行时间保证。所有服务器都位于泰国和新加坡,提供 24 小时泰语支持,确保您在需要时获得帮助。他们的基础架构旨在实现高性能,在该地区具有出色的网络连接。
比较注意事项
评估 VPS 提供商时,不仅要比较价格,还要比较硬件质量、网络基础设施、备份选项和支持响应速度。对于 Docker 工作负载,来自可靠提供商的稍微更昂贵的计划比存在性能问题或支持不良的更便宜选项要好。
从中等计划开始,随着应用程序的增长而扩展。大多数提供商允许轻松升级,因此您可以从 4 GB RAM 和 4 个 CPU 核心开始,然后在需要时转移到更大的配置。