php神灯 2021-07-06 17:39:26 1640次浏览 0条评论 0 0 0

若要观看视频演示,请移步到微信公众号:

截图_选择区域_20210706174534.png

1、概述

Yii的源码中其实已经提供了一种快速搭建开发环境的方式,包括php/apache/mysql,不过需要事先安装好docker环境。优点如下:

  • 一键安装,快速方便;

  • 不需要分心安装php/apache/mysql这些软件,已有默认的配置可以跑应用;

  • 便于升级,如果想升级php版本,只要改变一下Dockerfile的基础镜像就可以;

2、安装步骤

2.1 下载源码

  • 从Github拉取

    git clone -b 2.0.42 https://github.com/yiisoft/yii2-app-advanced.git advanced
    

    github是国外的网站,有些同学因为网络原因,导致无法访问,或者拉取数据缓慢,因此我在gitee上同步了这个项目,建议使用下面的方式拉取代码,非常快。

  • 从Gitee拉取

    git clone -b 2.0.42 https://gitee.com/lvzmen_github/yii2-app-advanced.git advanced
    

2.2 源码分析

源代码中提供了三个容器编排文件,如下所示:

chenzhiwei:advanced$ tree -L 2
.
├── docker-compose.yml
├── backend
│   └── Dockerfile
└── frontend
    └── Dockerfile

我们看一下docker-compose.yml:

version: '3.2'

services:

  frontend:
    build: frontend
    ports:
      - 20080:80
    volumes:
      # Re-use local composer cache via host-volume
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      # Mount source-code for development
      - ./:/app

  backend:
    build: backend
    ports:
      - 21080:80
    volumes:
      # Re-use local composer cache via host-volume
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      # Mount source-code for development
      - ./:/app

  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=verysecret
      - MYSQL_DATABASE=yii2advanced
      - MYSQL_USER=yii2advanced
      - MYSQL_PASSWORD=secret

从上述源码可以分析可知:

  • frontend.build => frontend

    这表示使用frontend目录下的Dockerfile文件来生成需要使用的镜像,backend同理。这么做是为了避免管理中间镜像,让整个编排都处于源码可编辑的状态;

  • frontend.ports => 21080:80

    这个表示容器内的服务端口号是21080,并和宿主机的80端口绑定,目的是当宿主机的80端口有http请求时,会自动转发到容器内的21080端口;

  • frontend.volumes => ./:/app

    表示把当前的目录映射到宿主机的/app目录下,实现代码共享,便于开发人员开发。

  • mysql

    mysql容器会读取这四个环境变量,并将配置应用于数据库。

    ==注意:由于mysql并没有volumes将数据库映射到宿主机,因此删除容器后,数据库也会被删除!==

接下来我们看一下frontend/Dockerfile:

FROM yiisoftware/yii2-php:7.4-apache

# Change document root for Apache
RUN sed -i -e 's|/app/web|/app/frontend/web|g' /etc/apache2/sites-available/000-default.conf

从上述文件我们可知:

  • 使用的基础镜像是:yiisoftware/yii2-php:7.4-apache
  • 使用的apache配置文件是:/etc/apache2/sites-available/000-default.conf

2.3 安装docker-compose工具

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果发现太慢下不了,则可以到我的网盘中下载:

链接: https://pan.baidu.com/s/1gMSInCDo60Li2TEdwipMHg 提取码: 2ij6

==注意:要配置可执行权限。==

2.4 一键部署

进入到advanced目录,执行如下命令:

chenzhiwei:advanced$ sudo docker-compose up -d
Creating network "advanced_default" with the default driver
Creating advanced_frontend_1 ... done
Creating advanced_mysql_1    ... done
Creating advanced_backend_1  ... done

-d 表示后台安装,不会把安装时的日志打印出来,因此报错也不知道,如果第一次安装的话,可以去掉。

如果docker ps后可以看到下面的内容,表示容器正常运行,环境部署成功:

chenzhiwei:advanced$ docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}"
CONTAINER ID        NAMES                 IMAGE
ad3cc7dcf763        advanced_backend_1    advanced_backend
aecb968efedd        advanced_mysql_1      mysql:5.7
abdd6c885b2b        advanced_frontend_1   advanced_frontend

2.5 初始化项目

容器部署已经完成,但是对于新的项目,尚未初始化,compose依赖也没有拉取,因此无法正常工作,下面就来初始化项目。

  • 进入frontend容器:

    chenzhiwei:advanced$ docker exec -it advanced_frontend_1 /bin/bash
            _ _  __                                             _
           (_|_)/ _|                                           | |
      _   _ _ _| |_ _ __ __ _ _ __ ___   _____      _____  _ __| | __
     | | | | | |  _| '__/ _` | '_ ` _ \ / _ \ \ /\ / / _ \| '__| |/ /
     | |_| | | | | | | | (_| | | | | | |  __/\ V  V / (_) | |  |   <
      \__, |_|_|_| |_|  \__,_|_| |_| |_|\___| \_/\_/ \___/|_|  |_|\_\
       __/ |
      |___/
      
    PHP version: 7.4.21
    root@abdd6c885b2b:/app# 
    
  • 执行init初始化命令:

    root@abdd6c885b2b:/app# init
    Yii Application Initialization Tool v1.0
      
    Which environment do you want the application to be initialized in?
      
      [0] Development
      [1] Production
      
      Your choice [0-1, or "q" to quit] 0
      
      Initialize the application under 'Development' environment? [yes|no] yes
      
      Start initialization ...
      
       generate yii_test.bat
       generate frontend/web/robots.txt
       generate frontend/web/index-test.php
       generate frontend/web/index.php
       generate frontend/config/params-local.php
       generate frontend/config/codeception-local.php
       generate frontend/config/main-local.php
       generate frontend/config/test-local.php
       generate backend/web/robots.txt
       generate backend/web/index-test.php
       generate backend/web/index.php
       generate backend/config/params-local.php
       generate backend/config/codeception-local.php
       generate backend/config/main-local.php
       generate backend/config/test-local.php
       generate yii_test
       generate console/config/params-local.php
       generate console/config/main-local.php
       generate console/config/test-local.php
       generate yii
       generate common/config/params-local.php
       generate common/config/codeception-local.php
       generate common/config/main-local.php
       generate common/config/test-local.php
       generate cookie validation key in backend/config/main-local.php
       generate cookie validation key in common/config/codeception-local.php
       generate cookie validation key in frontend/config/main-local.php
          chmod 0777 backend/runtime
          chmod 0777 backend/web/assets
          chmod 0777 console/runtime
          chmod 0777 frontend/runtime
          chmod 0777 frontend/web/assets
          chmod 0755 yii
          chmod 0755 yii_test
      
      ... initialization completed.
    
  • 拉取依赖

    容器中已经存在composer工具,因此只要执行如下命令就可以拉取依赖:

    root@abdd6c885b2b:/app# composer update
    Loading composer repositories with package information
    ... ...
    

3 大功告成

要想访问容器内的服务,需要知道容器的ip,下面是获取容器ip的两个方法:

  • 宿主机上执行如下命令

    chenzhiwei:advanced$ docker inspect advanced_frontend_1 | grep IPAddress
                "SecondaryIPAddresses": null,
                "IPAddress": "",
                        "IPAddress": "172.22.0.2",
    
  • 容器内部可查看/etc/hosts文件

    root@abdd6c885b2b:/app# cat /etc/hosts
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.22.0.2      abdd6c885b2b,
    

通过ip直接访问即可,前台:
image-20210706152749773.png

后台:
image-20210706152815399.png

    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册