用 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文件进行进一步的优化和扩展,以满足不同的业务场景。
