本地用docker开发的php 程序如何部署到阿里云的ecs上

将本地用 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 配置保持一致。

相关推荐
脚踏实地的大梦想家8 小时前
【Docker】P5 Docker Compose 实战指南:一键部署 WordPress + MySQL
mysql·docker·容器
闲人编程8 小时前
现代Python开发环境搭建(VSCode + Dev Containers)
开发语言·vscode·python·容器·dev·codecapsule
醉卧雕龙舫 、9 小时前
一.docker基础概念
docker
TMT星球12 小时前
IDC报告:阿里云市场份额升至26.8%,连续5季度上涨
阿里云·云计算
云资源服务商16 小时前
阿里云智能计算灵骏:构建下一代AI算力新底座
阿里云·云计算·gpu算力
帅帅梓16 小时前
docker图形化管理
docker·容器·eureka
努力搬砖的咸鱼1 天前
容器之间怎么通信?Docker 网络全解析
网络·docker·云原生·容器
liming4951 天前
Ubuntu18.04部署k8s
云原生·容器·kubernetes
元直数字电路验证1 天前
ASP.NET Core Web APP(MVC)开发中无法全局配置 NuGet 包,该怎么解?
前端·javascript·ui·docker·asp.net·.net