将本地用 Docker 开发的 PHP 程序部署到阿里云 ECS,有多种方法,我会从简单到复杂为您详细介绍三种主流方案。

方案一:通过镜像仓库上传拉取(最推荐)
这种方式最符合 Docker 的理念,将应用及其环境整体打包成镜像进行分发。
步骤 1:在本地准备镜像
1、确保本地项目有 Dockerfile
一个典型的 PHP 项目 Dockerfile 示例:
bash
# 使用官方 PHP 镜像带 Apache
FROM php:8.1-apache
# 设置工作目录
WORKDIR /var/www/html
# 安装必要的 PHP 扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql
# 将本地源代码复制到容器中
COPY . /var/www/html/
# 如果需要,修改文件权限
RUN chown -R www-data:www-data /var/www/html
2、构建本地镜像
bash
cd /path/to/your/php-project
docker build -t my-php-app:latest .
3、测试本地镜像
bash
docker run -d -p 8080:80 --name my-php-app-local my-php-app:latest
访问 http://localhost:8080 确认应用正常运行。
步骤 2:推送镜像到仓库
1、选择镜像仓库
- 阿里云容器镜像服务(ACR):与 ECS 同生态,推荐
- Docker Hub:全球通用
2、以 ACR 为例推送镜像
bash
# 登录阿里云ACR(需要先开通容器镜像服务)
docker login --username=your_aliyun_username registry.cn-hangzhou.aliyuncs.com
# 给本地镜像打上ACR的标签
docker tag my-php-app:latest registry.cn-hangzhou.aliyuncs.com/your-namespace/my-php-app:latest
# 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/my-php-app:latest
步骤 3:在阿里云 ECS 上运行
1、登录 ECS 实例
bash
ssh root@your-ecs-ip
2、安装 Docker(如果尚未安装)
bash
# CentOS 示例
yum install -y docker
systemctl start docker
systemctl enable docker
3、从 ACR 拉取并运行镜像
bash
# 登录ACR(同样需要先登录)
docker login --username=your_aliyun_username registry.cn-hangzhou.aliyuncs.com
# 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/your-namespace/my-php-app:latest
# 运行容器
docker run -d \
--name my-php-app \
-p 80:80 \
-v /path/on/ecs/uploads:/var/www/html/uploads \
registry.cn-hangzhou.aliyuncs.com/your-namespace/my-php-app:latest
优点 :环境完全一致,部署快速,回滚方便(只需拉取旧版镜像)。
缺点:镜像文件较大,上传下载需要时间。
方案二:同步代码 + 在 ECS 上构建(灵活性强)
这种方式只上传代码和 Dockerfile,在服务器上执行构建。
步骤 1:准备项目文件
确保项目包含:
-
所有 PHP 源代码
-
Dockerfile -
.dockerignore(忽略 node_modules、.git 等不必要文件) -
如果需要,准备
docker-compose.yml
步骤 2:上传文件到 ECS
1、使用 rsync 同步(推荐)
bash
# 在本地执行
rsync -avz --delete \
-e "ssh -i /path/to/your/ecs-key.pem" \
./your-php-project/ \
root@your-ecs-ip:/home/php-project/
2、或使用宝塔面板
-
在 ECS 上安装宝塔面板
-
通过宝塔的「文件」管理器直接上传项目 ZIP 包并解压
步骤 3:在 ECS 上构建和运行
1、SSH 登录 ECS
bash
ssh -i /path/to/your/ecs-key.pem root@your-ecs-ip
2、进入项目目录并构建
bash
cd /home/php-project
docker build -t my-php-app-ecs .
3、运行容器
bash
docker run -d \
--name my-php-app \
-p 80:80 \
-v $(pwd)/uploads:/var/www/html/uploads \
my-php-app-ecs
优点 :传输文件小,适合频繁的代码更新。
缺点:ECS 需要安装构建环境,构建过程可能消耗资源。
方案三:使用 Docker Compose(适合复杂应用)
如果您的应用还包含 MySQL、Redis 等服务,这是最佳方案。
步骤 1:准备 docker-compose.yml
bash
version: '3.8'
services:
app:
build: .
ports:
- "80:80"
volumes:
- ./uploads:/var/www/html/uploads
- ./logs:/var/log/apache2
depends_on:
- db
environment:
- DB_HOST=db
- DB_USER=app_user
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: app_password
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:alpine
volumes:
db_data:
步骤 2:上传文件到 ECS
同方案二,将整个项目目录(包含 docker-compose.yml)上传到 ECS。
步骤 3:在 ECS 上启动服务
bash
# 在ECS上
cd /home/php-project
# 安装 Docker Compose(如果未安装)
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 启动所有服务
docker-compose up -d
部署后的重要操作
1、配置域名和 SSL
-
在阿里云控制台解析域名到 ECS IP
-
使用 Nginx 反代或直接在容器内配置 SSL
2、数据持久化
bash
# 确保重要数据卷映射到主机目录
-v /ecs/data/uploads:/var/www/html/uploads
-v /ecs/data/mysql:/var/lib/mysql
3、设置自动启动
bash
# 使用 --restart=always
docker run -d --restart=always --name my-app ...
# 或在 docker-compose.yml 中配置
restart: always
4、日志管理
bash
# 查看日志
docker logs my-php-app
# 或配置日志驱动,将日志发送到阿里云日志服务
方案选择建议
-
新手/简单项目 :从方案二开始,最容易理解和调试
-
生产环境/微服务 :使用方案一,最规范,易于CI/CD集成
-
多服务应用 :使用方案三,管理依赖最方便
无论选择哪种方案,核心都是确保生产环境与本地开发环境的 Docker 配置保持一致。