用 Yii2 做开发时,很多人都看重它的性能和安全;而在部署环节,Docker 因为轻便、隔离性好,也成了不少团队的首选。把这两者结合到一块,确实能让开发、测试和上线流程顺畅不少。接下来,我就和你分享一下在实际项目中 如何把 Yii2 和 Docker 搭配起来用,走过哪些步骤,又遇到过哪些值得注意的地方。

Yii2框架简介

Yii2是一个高性能、基于组件的PHP Web应用程序框架,适用于开发各种类型的Web应用,包括企业级应用、社交网络、电子商务平台等。它具有丰富的功能和插件,如强大的数据库访问组件、安全机制、缓存支持等,能够帮助开发者快速搭建高质量的Web应用。Yii2遵循MVC(Model-View-Controller)架构模式,使得代码结构清晰,易于维护和扩展。

Docker容器技术简介

Docker是一个用于开发、部署和运行应用程序的开源平台,它使用容器化技术将应用程序及其依赖项打包成一个独立的容器。容器是轻量级的,它们共享主机操作系统的内核,因此启动速度快,占用资源少。Docker容器具有隔离性,不同的容器之间相互独立,不会相互影响。此外,Docker还提供了镜像管理功能,开发者可以将容器打包成镜像,方便在不同的环境中部署。

环境准备

在开始实践之前,需要确保已经安装了Docker和Docker Compose。Docker可以从官方网站(https://www.docker.com/)下载并安装,Docker Compose可以通过pip或者官方脚本进行安装。安装完成后,可以通过以下命令验证安装是否成功:

docker --version
docker-compose --version

另外,还需要创建一个Yii2项目。可以使用Composer来创建一个新的Yii2高级应用模板:

composer create-project --prefer-dist yiisoft/yii2-app-advanced yii2-docker

创建Dockerfile

Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。在Yii2项目的根目录下创建一个名为Dockerfile的文件,内容如下:

# 使用PHP 7.4的官方镜像作为基础镜像
FROM php:7.4-apache

# 安装必要的系统依赖
RUN apt-get update && apt-get install -y \
    libzip-dev \
    zip \
    unzip \
    && docker-php-ext-install zip pdo_mysql

# 启用Apache的重写模块
RUN a2enmod rewrite

# 设置工作目录
WORKDIR /var/www/html

# 复制项目文件到容器中
COPY . .

# 设置文件权限
RUN chown -R www-data:www-data /var/www/html

# 暴露端口
EXPOSE 80

上述Dockerfile的主要作用是基于PHP 7.4的Apache镜像构建一个新的镜像,安装必要的系统依赖和PHP扩展,启用Apache的重写模块,将项目文件复制到容器中,并设置文件权限。最后暴露80端口,以便外部可以访问容器中的应用。

创建docker-compose.yml文件

docker-compose.yml文件用于定义和运行多个Docker容器的应用。在Yii2项目的根目录下创建一个名为docker-compose.yml的文件,内容如下:

version: '3'
services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: yii2_docker
      MYSQL_USER: yii2_user
      MYSQL_PASSWORD: yii2_password
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
volumes:
  mysql-data:

在这个docker-compose.yml文件中,定义了两个服务:web和db。web服务使用之前创建的Dockerfile构建镜像,将容器的80端口映射到主机的8080端口,将主机的项目目录挂载到容器的/var/www/html目录,并且依赖于db服务。db服务使用MySQL 5.7的官方镜像,设置了数据库的相关环境变量,将容器的3306端口映射到主机的3306端口,并使用一个名为mysql-data的卷来持久化存储数据库数据。

构建和运行容器

在项目根目录下,使用以下命令构建和运行容器:

docker-compose up -d

这个命令会根据docker-compose.yml文件构建和启动容器。-d参数表示在后台运行容器。构建过程可能需要一些时间,取决于网络速度和系统性能。构建完成后,可以使用以下命令查看容器的运行状态:

docker-compose ps

如果看到web和db两个容器都处于Up状态,说明容器已经成功启动。

配置Yii2项目的数据库连接

打开Yii2项目的common/config/main-local.php文件,修改数据库连接配置如下:

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=db;dbname=yii2_docker',
            'username' => 'yii2_user',
            'password' => 'yii2_password',
            'charset' => 'utf8mb4',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
        ],
    ],
];

注意,这里的host设置为db,因为在docker-compose.yml文件中定义的数据库服务名为db,Docker会自动将服务名解析为对应的IP地址。

测试应用

打开浏览器,访问http://localhost:8080/frontend/web,如果看到Yii2的欢迎页面,说明应用已经成功部署并可以正常访问。可以尝试创建一个新的数据库表,或者进行一些简单的数据库操作,验证数据库连接是否正常。

部署到生产环境

在生产环境中部署Yii2应用和Docker容器时,需要注意以下几点:

1. 安全配置:确保容器和应用的安全,如设置强密码、限制访问权限等。可以使用防火墙来限制对容器端口的访问。

2. 日志管理:使用日志管理工具来收集和分析容器和应用的日志,以便及时发现和解决问题。可以使用ELK Stack(Elasticsearch、Logstash、Kibana)来实现日志的集中管理。

3. 监控和自动伸缩:使用监控工具来监控容器和应用的性能指标,如CPU使用率、内存使用率等。可以使用Prometheus和Grafana来实现监控和可视化。同时,可以使用Docker Swarm或者Kubernetes来实现容器的自动伸缩,根据负载情况动态调整容器的数量。

总结

通过将Yii2框架与Docker容器技术结合,我们可以实现快速、高效的开发、测试和部署。Docker容器的隔离性和轻量级特性使得应用的部署更加灵活和可靠,而Yii2框架的高性能和丰富功能则为开发高质量的Web应用提供了有力支持。在实际项目中,可以根据具体需求对Dockerfile和docker-compose.yml文件进行进一步的优化和扩展,以满足不同的业务场景。