最近在帮团队搭建新的开发测试环境,发现很多同学在从零开始部署 Docker 服务时,总会在云服务器购买、系统配置和 Docker 安装这几个环节卡住。网上的资料要么只讲 Docker 命令,要么只讲云服务器操作,缺少一个从“买服务器”到“跑起容器”的完整闭环指南。
本文将以阿里云 ECS 为例,手把手带你走通从服务器选购、系统初始化、安全加固到 Docker 引擎安装配置的全过程。无论你是刚接触云服务的学生,还是需要快速搭建一套标准化环境的后端开发者,都能按照本文的步骤,在半小时内获得一个安全、可用的 Docker 运行环境。文中所有命令和配置都经过实测,你可以直接复制使用。
1. 背景与核心概念:为什么需要云服务器部署 Docker?
在深入实操之前,我们先理清几个关键概念,这能帮助你理解后续每一步操作的意义。
Docker是一种容器化技术。你可以把它理解为一个轻量级的“软件集装箱”。开发者将应用程序及其所有依赖(库、环境变量、配置文件)打包进一个标准的镜像(Image)里。这个镜像可以在任何安装了 Docker 引擎的机器上,快速、一致地运行成一个容器(Container)。它解决了“在我机器上能跑,到你那就出错”的经典难题,极大地提升了开发、测试和部署的效率。
阿里云服务器(ECS)是阿里云提供的弹性计算服务。简单说,它就是一台运行在云端的虚拟电脑,拥有独立的 CPU、内存、磁盘和公网 IP。我们可以在上面安装任何操作系统和软件,就像操作一台物理服务器一样。选择云服务器来部署 Docker,主要基于以下几点考虑:
- 环境一致性:云服务器的配置(CPU、内存、系统)是标准化的,避免了本地机器因系统版本、依赖库差异导致的问题。
- 资源隔离与弹性:Docker 容器本身提供应用层隔离,而云服务器则提供了硬件资源层的隔离。结合使用,可以更安全、灵活地分配资源。需要更多资源时,可以随时升级云服务器配置。
- 公网访问:云服务器自带公网 IP,方便我们将容器内运行的服务(如网站、API)暴露到互联网,供他人访问。
- 成本与便捷性:对于个人学习或中小项目,购买一台按量付费或包年包月的云服务器,远比维护一台物理服务器成本更低、更省心。
因此,“在阿里云服务器上部署 Docker”是一个典型的云原生应用基础架构场景。接下来,我们就从零开始,一步步完成这个目标。
2. 环境准备与版本说明
在开始购买和操作之前,请确保你已拥有一个实名认证的阿里云账号。这是使用所有阿里云服务的前提。
本文将使用以下环境进行演示,但核心步骤和思路适用于大多数情况:
- 云服务商:阿里云
- 服务器类型:弹性计算服务(ECS)
- 操作系统:CentOS 7.9(这是一个非常稳定且广泛使用的 Linux 发行版,适合生产环境。如果你偏好其他系统,如 Ubuntu 20.04/22.04,大部分命令也类似)。
- Docker 版本:Docker CE(社区版) 24.0.5。我们将使用官方仓库安装最新稳定版。
- 网络环境:服务器需能访问公网以下载安装包。
重要提示:云产品控制台界面和活动价格可能随时更新,但核心的购买流程、配置项和服务器管理逻辑是相通的。请以实际操作时的界面为准,理解每个配置选项的含义更为关键。
3. 阿里云 ECS 服务器购买与基础配置
这是整个流程的第一步,也是最容易让人困惑的一步。我们将重点关注那些影响后续 Docker 使用的关键配置。
3.1 登录控制台与创建实例
- 登录阿里云控制台:访问 阿里云官网 ,使用你的账号密码登录。
- 进入 ECS 控制台:在控制台首页,找到“产品”或“服务”,选择“弹性计算”下的“云服务器 ECS”,或者直接搜索“ECS”进入管理控制台。
- 创建实例:在 ECS 实例列表页面,点击“创建实例”或“购买实例”按钮,开始配置之旅。
3.2 关键配置项详解(避坑指南)
创建实例时,你会看到一连串的配置选项。我们逐一拆解,告诉你为什么这么选。
① 基础配置:计费模式与地域
- 计费模式:对于学习和测试,强烈推荐选择“按量付费”。它的优点是灵活,用多久付多久,不用了可以立即释放,没有长期绑定的压力。如果确定长期使用(半年以上),可以对比“包年包月”的价格。
- 地域:选择离你的目标用户或你自己地理位置最近的地域。例如,用户主要在华东,就选“华东1(杭州)”或“华东2(上海)”。这能降低网络延迟。注意:不同地域的 ECS 实例、磁盘、网络资源相互隔离,创建后不能更改。
② 实例规格:选择适合的“电脑配置”这是核心成本所在。对于运行 Docker,我们主要关注 CPU 和内存。
- 共享型 vs 计算型:个人学习或轻量应用,选择“共享计算型 n4”或“突发性能型 t6/t5”即可,性价比高。它们允许在一定基准性能上突发使用 CPU,适合负载不持续的场景。
- vCPU 和内存:如果只是跑几个简单的容器(如 Nginx、MySQL、Redis),选择1核2GB或2核4GB完全足够。如果想学习 Docker Compose 或部署微服务集群,建议从2核4GB起步。
- 架构:选择x86计算。ARM 架构(如“通用型 g8y”)可能在某些镜像兼容性上存在差异,初学者建议避开。
③ 镜像:安装什么样的“操作系统”镜像决定了你服务器的初始系统环境。
- 选择“公共镜像”。
- 操作系统:选择CentOS。
- 版本:选择7.9 64位。CentOS 7 拥有极广泛的社区支持和软件兼容性,教程也最多。避免选择即将停止维护的版本(如 CentOS 8)。
④ 存储:系统盘与数据盘
- 系统盘:默认的40GB ESSD PL0或高效云盘足够安装系统和 Docker。如果预算充足,ESSD 性能更好。
- 数据盘:初期可以不添加。以后如果 Docker 容器数据量很大(如数据库、日志),可以单独购买并挂载数据盘,方便管理和扩容。
⑤ 网络与安全组:服务器的“门”和“防火墙规则”这是安全的关键,也是后续访问 Docker 服务的通道。
- 专有网络 VPC:如果第一次使用,直接使用默认VPC和交换机即可。
- 公网 IP:务必勾选“分配公网 IPv4 地址”!这是你从外部 SSH 连接和管理服务器的唯一方式。带宽选择按固定带宽,1Mbps起步即可,学习够用,后续可升级。
- 安全组:可以把它看作服务器的虚拟防火墙。选择“新建安全组”,并添加以下两条入方向规则,这是为了后续能访问服务器上的服务:
授权策略 协议类型 端口范围 授权对象 说明 允许 SSH (22) 22/22 0.0.0.0/0 用于远程连接服务器(生产环境建议改为自己的IP) 允许 HTTP (80) 80/80 0.0.0.0/0 用于访问将来容器内运行的Web服务 允许 自定义 TCP 8080/8080 0.0.0.0/0 常用于其他应用服务端口
⑥ 系统配置:设置登录“钥匙”
- 登录凭证:选择“自定义密码”,然后为系统管理员
root用户设置一个高强度密码(包含大小写字母、数字、特殊符号)。请务必牢记此密码! - 实例名称:给服务器起个名字,如
my-docker-host,方便管理。
完成以上所有配置后,确认订单总价,阅读并同意服务条款,点击“创建实例”或“立即购买”。系统需要几分钟来创建并启动你的云服务器。
3.3 获取连接信息并登录服务器
实例状态变为“运行中”后,即可连接。
获取公网 IP:在 ECS 实例列表,找到你刚创建的实例,复制其“公网 IP”地址。
使用 SSH 客户端连接:
- Windows 用户:推荐使用
PuTTY或Xshell,也可以使用 Windows 10/11 自带的 PowerShell 或 CMD(需支持 OpenSSH)。 - macOS/Linux 用户:直接使用系统自带的终端(Terminal)。
连接命令如下(将
你的公网IP替换为实际IP):ssh root@你的公网IP首次连接会提示确认主机指纹,输入
yes。然后输入你之前设置的root密码。登录成功后,你会看到类似[root@iZbp1 ~]#的命令行提示符。- Windows 用户:推荐使用
4. 服务器系统初始化与安全加固
新服务器就像毛坯房,需要做一些基础装修才能安全、舒适地入住。这一步常被忽略,但对生产安全至关重要。
4.1 更新系统与安装基础工具
登录后,首先更新系统软件包到最新版本,并安装一些常用工具(如vim编辑器、wget下载工具)。
# 1. 更新本地Yum缓存 yum makecache fast # 2. 升级所有可更新的软件包 yum update -y # 3. 安装常用工具 yum install -y vim wget net-tools curl bash-completion4.2 创建普通用户并配置 sudo 权限(安全最佳实践)
长期使用root用户操作是危险的。我们应该创建一个普通用户,并赋予其sudo权限。
# 1. 创建新用户,例如名为 `dockeruser` adduser dockeruser # 2. 为新用户设置密码 passwd dockeruser # 根据提示输入两次强密码 # 3. 将新用户添加到 `wheel` 组,该组默认拥有sudo权限 usermod -aG wheel dockeruser4.3 配置 SSH 密钥登录并禁用密码登录(强烈推荐)
使用密钥对登录比密码更安全,且无需每次输入密码。
- 在本地生成密钥对(如果你没有的话):
- Windows (PowerShell/Git Bash):
ssh-keygen -t rsa -b 4096 - macOS/Linux:
ssh-keygen -t rsa -b 4096一路回车,默认保存在~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)。
- Windows (PowerShell/Git Bash):
- 将公钥上传到服务器。在本地执行:
如果系统没有ssh-copy-id dockeruser@你的公网IPssh-copy-id,可以手动操作:将本地~/.ssh/id_rsa.pub文件内容,复制到服务器的/home/dockeruser/.ssh/authorized_keys文件中(需创建.ssh目录并设置权限)。 - 测试密钥登录:
如果无需密码直接登录成功,说明密钥配置正确。ssh dockeruser@你的公网IP - 禁用 root 密码登录和密码认证(谨慎操作):
找到并修改以下两行:# 切换到 root 用户或使用 sudo sudo vim /etc/ssh/sshd_config
重要:在确认密钥登录绝对可用之前,不要将PermitRootLogin no # 禁止root直接登录 PasswordAuthentication no # 禁止使用密码认证PasswordAuthentication设为no!可以先设为yes,重启SSH服务测试密钥登录,确认无误后再改为no。# 重启SSH服务使配置生效 sudo systemctl restart sshd # 在另一个终端窗口测试密钥登录,确认成功后再关闭当前连接
4.4 配置防火墙(Firewalld)
CentOS 7 默认使用firewalld管理防火墙。我们需要放行必要的端口。
# 1. 启动firewalld并设置开机自启 sudo systemctl start firewalld sudo systemctl enable firewalld # 2. 放行我们之前安全组里规划的端口:SSH(22), HTTP(80), 自定义应用端口(8080) sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-port=8080/tcp # 3. 重新加载防火墙规则 sudo firewall-cmd --reload # 4. 查看当前放行的端口和服务 sudo firewall-cmd --list-all至此,你的云服务器已经是一个相对安全、基础环境完备的状态。接下来,我们开始安装主角——Docker。
5. Docker 引擎安装与配置
我们将使用 Docker 官方提供的 Yum 仓库进行安装,这是最推荐的方式,能保证获得最新的稳定版本和安全的更新。
5.1 卸载旧版本(如有)
如果你的系统上存在老旧的 Docker 版本(如docker或docker-engine),请先卸载。
sudo yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine5.2 设置 Docker 仓库
- 安装必要的依赖包:
yum-utils提供了yum-config-manager工具。sudo yum install -y yum-utils - 添加 Docker 官方 Yum 仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5.3 安装 Docker Engine
- 安装最新版本的 Docker CE、CLI 和 Containerd:
这里一并安装了sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker-compose-plugin,它是管理多容器应用的工具,后续会用到。
5.4 启动 Docker 并设置开机自启
# 启动Docker守护进程 sudo systemctl start docker # 设置Docker开机自动启动 sudo systemctl enable docker # 验证Docker是否安装成功 sudo docker --version如果安装成功,会输出类似Docker version 24.0.5, build 24.0.5-1.el7的信息。
5.5 配置 Docker 镜像加速器(国内必备)
从 Docker Hub 拉取镜像在国内可能很慢。我们需要配置一个国内镜像加速器,这里以阿里云容器镜像服务为例。
- 登录阿里云控制台,搜索“容器镜像服务”。
- 在“镜像工具” -> “镜像加速器”页面,选择你的系统(CentOS),你会看到一段配置命令。
- 在服务器上执行类似下面的命令(加速器地址每个阿里云账号独有,请使用控制台提供的):
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://你的专属加速器地址.mirror.aliyuncs.com"] } EOF - 重新加载配置并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
5.6 允许普通用户执行 Docker 命令(可选但方便)
默认情况下,只有root用户和docker组的用户才能运行 Docker 命令。为了避免每次都要加sudo,可以将你的普通用户加入docker组。
# 将当前用户(dockeruser)加入docker组 sudo usermod -aG docker $USER # 或者明确指定用户 # sudo usermod -aG docker dockeruser重要:执行此操作后,你需要完全退出当前 SSH 会话并重新登录,才能使组权限生效。之后,你就可以直接使用docker ps等命令,而无需sudo了。
6. Docker 实战:运行你的第一个容器
环境已经就绪,让我们通过几个经典示例来验证 Docker 是否工作正常,并熟悉基本操作。
6.1 示例一:运行一个 Nginx Web 服务器
Nginx 是一个高性能的 Web 服务器,它的 Docker 镜像非常流行。
# 1. 从镜像仓库拉取最新的 Nginx 镜像 docker pull nginx:latest # 2. 以后台模式运行一个 Nginx 容器,并将容器的80端口映射到宿主机的8080端口 docker run -d --name my-nginx -p 8080:80 nginx-d:后台运行。--name my-nginx:给容器起个名字,方便管理。-p 8080:80:端口映射,格式为宿主机端口:容器端口。这里将容器内的 80 端口映射到服务器的 8080 端口。
验证:
- 在服务器上运行
docker ps,应该能看到名为my-nginx的容器正在运行。 - 打开你的浏览器,访问
http://你的公网IP:8080。如果看到 “Welcome to nginx!” 的页面,恭喜你,第一个容器运行成功!
6.2 示例二:运行一个交互式的 Ubuntu 容器
这个例子演示如何进入一个容器的内部进行操作。
# 运行一个交互式的 Ubuntu 容器,并进入其bash终端 docker run -it --name my-ubuntu ubuntu:latest /bin/bash-it:-i保持标准输入打开,-t分配一个伪终端,两者结合可以让我们与容器交互。ubuntu:latest:Ubuntu 系统镜像。/bin/bash:容器启动后执行的命令,这里是启动 bash shell。
执行后,你的命令行前缀会变成类似root@容器ID:/#,表示你已经进入了容器内部。你可以尝试运行ls,cat /etc/os-release等命令。输入exit可以退出并停止容器。
6.3 示例三:使用 Docker Compose 启动多容器应用(WordPress)
Docker Compose 通过一个 YAML 文件来定义和运行多个容器。这里我们用它快速搭建一个 WordPress 博客(包含 WordPress 和 MySQL 两个容器)。
- 创建项目目录并编写
docker-compose.yml文件:mkdir ~/my-wordpress && cd ~/my-wordpress vim docker-compose.yml - 将以下内容粘贴到
docker-compose.yml文件中:
注意:请务必将version: '3.8' services: db: image: mysql:8.0 container_name: wp-db restart: always environment: MYSQL_ROOT_PASSWORD: your_strong_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: your_strong_wordpress_password volumes: - db_data:/var/lib/mysql wordpress: depends_on: - db image: wordpress:latest container_name: wp-app restart: always ports: - "8081:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: your_strong_wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html volumes: db_data: wp_data:your_strong_root_password和your_strong_wordpress_password替换成你自己的强密码! - 启动服务:
这个命令会拉取镜像并启动定义的所有服务(docker compose up -d-d表示后台运行)。 - 验证:
- 运行
docker ps会看到wp-db和wp-app两个容器。 - 访问
http://你的公网IP:8081,你应该会看到 WordPress 的安装界面。按照提示完成安装,你的博客就上线了!
- 运行
7. 常见问题与排查思路
在部署过程中,你可能会遇到以下问题。这里提供快速排查的思路。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| SSH 连接失败 | 1. 安全组未放行 22 端口。 2. 服务器未启动或 IP 错误。 3. 本地网络或防火墙限制。 | 1. 检查阿里云控制台安全组规则。 2. 在 ECS 控制台查看实例状态和公网 IP。 3. 尝试使用其他网络或关闭本地防火墙测试。 |
docker pull或docker run速度极慢 | 网络连接到 Docker Hub 不稳定。 | 确认已正确配置国内镜像加速器(/etc/docker/daemon.json)。重启 Docker 后重试。 |
docker run时报错port is already allocated | 宿主机上映射的端口(如 8080)已被其他进程占用。 | 1. 使用sudo netstat -tlnp | grep :8080查看占用进程。2. 停止占用进程,或修改 docker run -p参数,使用另一个空闲端口。 |
| 容器启动后立即退出 | 容器内主进程执行完毕或出错退出。 | 1. 使用docker logs <容器名>查看容器日志,寻找错误信息。2. 对于交互式命令(如 /bin/bash),确保使用了-it参数。 |
普通用户运行docker ps报权限错误 | 用户未加入docker组,或未重新登录会话。 | 1. 执行groups命令确认当前用户是否在docker组。2. 使用 sudo usermod -aG docker $USER添加后,必须完全退出 SSH 并重新登录。 |
| Docker 服务启动失败 | 1. 系统内核版本过低。 2. 与现有软件冲突。 3. 存储驱动问题。 | 1. 运行uname -r确认内核版本(CentOS 7 需 3.10+)。2. 查看日志 sudo journalctl -u docker.service。3. 检查 daemon.json配置格式是否正确(JSON 格式严格)。 |
| 无法访问容器内服务(如 Nginx) | 1. 安全组未放行对应端口。 2. 宿主机防火墙(firewalld)未放行。 3. 容器端口映射错误。 | 1. 检查阿里云安全组规则(如 8080, 8081)。 2. 检查 firewall-cmd --list-all。3. 检查 docker ps输出的PORTS列,确认映射关系。 |
8. 最佳实践与工程建议
将 Docker 用于实际项目时,遵循以下建议可以让你的工作更高效、更安全。
8.1 镜像与容器管理
- 使用特定版本标签:在
Dockerfile或docker run时,避免使用latest标签。应指定具体版本,如nginx:1.24-alpine,以保证环境一致性。 - 定期清理:定期清理无用的镜像和停止的容器,释放磁盘空间。
# 删除所有已停止的容器 docker container prune -f # 删除所有未被使用的镜像(谨慎,会删除所有未被容器引用的镜像) docker image prune -a -f - 使用
.dockerignore文件:在构建镜像时,创建.dockerignore文件来排除不必要的文件(如.git,node_modules, 日志文件),可以加速构建过程并减小镜像体积。
8.2 数据持久化与存储
- 使用命名卷(Named Volumes):对于需要持久化的数据(如数据库文件、应用配置),应使用 Docker 卷(Volumes)或绑定挂载(Bind Mounts)。在
docker-compose.yml中定义命名卷是首选,便于管理。volumes: mysql_data: # 声明一个命名卷 services: mysql: volumes: - mysql_data:/var/lib/mysql # 挂载到容器 - 避免在容器内存储数据:容器本身是易变的,重启或重建后,容器内部的文件更改会丢失。重要数据一定要挂载到宿主机或卷中。
8.3 安全与配置
- 非 root 用户运行容器:在
Dockerfile中,使用USER指令指定一个非 root 用户来运行应用进程,遵循最小权限原则。 - 扫描镜像漏洞:对于生产环境使用的镜像,可以使用
docker scan命令(需登录 Docker Hub)或集成其他安全工具来扫描已知漏洞。 - 备份
daemon.json和docker-compose.yml:将这些配置文件纳入版本控制(如 Git),方便迁移和恢复。
8.4 生产环境考量
- 资源限制:使用
-m(内存限制)、--cpus(CPU限制)等参数为容器设置资源上限,防止单个容器耗尽主机资源。docker run -d --name my-app -m 512m --cpus="1.5" my-image - 日志管理:配置 Docker 日志驱动和日志轮转策略,防止日志文件占满磁盘。可以在
/etc/docker/daemon.json中配置。{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - 监控与健康检查:使用
HEALTHCHECK指令或在docker-compose.yml中定义健康检查,让 Docker 能够感知应用状态。结合监控工具(如 Prometheus + cAdvisor)监控容器运行状态。
至此,你已经完成了一台阿里云服务器从购买、系统配置、安全加固到 Docker 引擎安装、实战演练的完整流程。这个环境可以作为你学习 Docker 和容器化技术的稳定沙箱,也可以作为小型应用的原型部署平台。
后续,你可以基于此环境,继续深入学习 Dockerfile 编写、Docker 网络、Docker Swarm 或 Kubernetes 等更高级的主题。记住,熟练使用 Docker 的最佳方式就是多动手实践,尝试将自己现有的应用容器化。如果在实践中遇到新的问题,善用docker --help、docker logs和搜索引擎,大部分问题都能找到解决方案。