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

相关推荐
optimistic_chen7 分钟前
【Docker入门】容器技术
linux·运维·服务器·docker·容器
小明_GLC8 分钟前
理解Docker、镜像Images、容器Container
docker·容器
努力搬砖的咸鱼8 分钟前
用 Docker 部署你的第一个微服务
docker·微服务·云原生·容器
水上冰石13 分钟前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins
oMcLin17 分钟前
如何在 CentOS 7.9 上配置并调优 Docker Swarm 集群,确保跨多个节点的高效服务发现与负载均衡?
docker·centos·服务发现
鱼跃鹰飞18 分钟前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes
江湖有缘20 分钟前
Fenrus + Docker 实战:构建简洁高效的浏览器新标签页
运维·docker·容器
CodeCaptain43 分钟前
阿里云ECS上配置Nginx的反向代理
nginx·阿里云·云计算
Zsr10231 小时前
K8s核心组件pod:进阶篇
云原生·容器·kubernetes·pod
mr_orange_klj1 小时前
k8s StorageClass和Provisoner的AI问答(豆包)
人工智能·容器·kubernetes