by Devin Yang

建立于: 1年前 ( 更新: 1年前 )

没时间拍介绍影片,我就来随便抓些画面介绍我使用的容器环境deviny/phpenv。

https://github.com/DevinY/phpenv

phpenv算是我之前D-Laravel开源项目的进化版本,概念上延用了很多D-Laravel的操作方式跟目录结构。
容器的更新上偏向使用者去自行控制,Build出自己的image,所以我也不太会去更动版号了,
其实D-Laravel的php版号,我好像也很久没动啦:p

之前D-Laravel的架构采用子域名导向,所以要有域名去连结不同的项目,
若要开放外部使用,需要去调整nginx设置是比较不容易的,
而新版本的phpenv采用是连接埠导向,随便的一台NAS或Router做反向代理,就能让服务对外公开了。
我本身搭配HAProxy,证书更新超快超方便,要多少SSL证书就有多少,设置上方便很多,秒架主机。

在phpenv透过独有的.env创建不同的容器环境,phpenv数据夹可以放在Laravel的项目内单独运行,
也能是放在项目外一次运行一个或多个Laravel项目。

phpenv对Linux环境的支持较好,可以调整不同的使用者,别跟我说您的权限是用777全开放的,phpenv可以精准指定php及nginx的运行权限。
在Linux环境中,大概就是数据库第一次启动时会失败,您要手动的方式去设置正确的目录owner 999。
当然使用phpenv对docker您也要更多深入的理解。

说这么多就来让我们来看看phpenv有那些功能,但绝对不止下方提的这些,
我先随便想了一下😛

一、多环境选择

devin@CCC:/volume1/docker/phpenv$ ./link
Type number to select your project environment:
1) ccc	     3) demo	  5) phpenv    7) tn_env
2) chat	     4) material  6) test
#?

二、显示目前环境
还能定义运行的USER_ID及GROUP_ID

devin@CCC:/volume1/docker/phpenv$ ./info
DotEnv Settings
SERVICES="ssh_db mariadb_ssh redis "
PROJECT=ccc
APP_URL=http://127.0.0.1:1056
FOLDER=/volume1/docker/ccc
NETWORK_MOD=host
HTTP_PORT=1056
SSH_PORT=2256
DB_PORT=3356
USER_ID=1026
GROUP_ID=100

三、可以依项目需求,透过DEFAULT参数指定不同的「主」容器设置档,默认为目录下的docker-compose.yml,
有时我们自己需要额外的服务,可将yaml放到services目录内,由SERVICES=指定。
另外我在services目录中,也提供了一些常用的设置及组合了。
services目录的使用概念上完全同D-Laravel的设置方式哦,如果您是D-Laravel的老手应该有感觉。

DEFAULT=custom就会使用phpenv目录下的custom.yml,这个范例档故意使用php7.x的版本。

DotEnv Settings
DEFAULT=custom
SERVICES="mariadb"
PROJECT=hello
APP_URL=http://127.0.0.1:1050
FOLDER=/Users/devin/code/test
HTTP_PORT=1050
DB_PORT=1250
USER_ID=501
GROUP_ID=20

四、可依需求安装不同的服务,例如在上例中,SERVICES=参数,我只选择了mariadb。这个意思就是使用services 目录下的mariadb.yml档。
五、透过简易的console命令进入容器,Laravel友善环境
当我们用link做选择时,就是把phpenv上的.env档运行强制软连结(ln -sf),连到选择的文件上。
有看到运行后,也有一行说明指出「.env link to envs/material」。

#显示envs目录内的所有项目设置档
devin@CCC:/volume1/docker/phpenv$ ./link
Type number to select your project environment:
1) ccc	     3) demo	  5) phpenv    7) tn_env
2) chat	     4) material  6) test
#? 4
.env link to envs/material
==== current env file =====
SERVICES="ssh redis"
PROJECT=material
APP_URL=http://127.0.0.1:1051
FOLDER=/volume1/docker/material
NETWORK_MOD=host
HTTP_PORT=1051
DB_PORT=1250
SSH_PORT=2051
USER_ID=1026
GROUP_ID=100
devin@CCC:/volume1/docker/phpenv$ ./console
The "material" project of the php container.
dlaravel@a46c5e5cbec0:/var/www/html$ tinker
Psy Shell v0.11.9 (PHP 8.1.11 X cli) by Justin Hileman
>

六、中文环境优化,例如Tinekr中可以看到中文

> Content::find(1)->content1
= """
  <div class="normalDiv">在Laravel中,如何用ModelFactory创建中文的假数据呢?<br />\n
  我是这么做的参考看看吧。\n
  <pre>\n
  <code class="language-php">&lt;?php\n
  use FakerFactory as TwFacker;\n

七、在多环境设置档下,支持「全开」跟「全关」的功能。用./all start启动或./all stop全停

./all start
Project: stisla
Project FILE: envs/stisla_1054
http://127.0.0.1:1054
[+] Running 3/3
  Network stisla_dlaravel_net  Created                                      0.0s
  Container stisla-php-1       Started                                      0.3s
  Container stisla-web-1       Started                                      0.5s


Project: * imap (current)
Project FILE: envs/imap
http://127.0.0.1:1057
[+] Running 3/3
  Network imap_dlaravel_net  Created                                        0.0s
  Container imap-php-1       Started                                        0.3s
  Container imap-web-1       Started                                        0.5s


Project: auth2
Project FILE: envs/auth2
http://127.0.0.1:1055

八、对Laravel友善设置,所以在Dockerfile中,默认我也添加了nodejs支持了。

#一个./console命令秒进容器
devin@CCC:/volume1/docker/phpenv$ ./console
The "material" project of the php container.
dlaravel@a46c5e5cbec0:/var/www/html$ npm install

up to date, audited 755 packages in 2s

76 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
dlaravel@a46c5e5cbec0:/var/www/html$

九、基本上,您可以透过./consoe运行所有的docker-compose命令,docker-compose的子命令怎么运行,./console的子命令就 怎么带。
docker-compsoe,需代入project名称,容器设置档多项参数

docker-compose -p material -f docker-compose.yml -f services/redis.yml -f services/ssh.yml ps

VS
./console,phpenv的./console命令,完全不用带参数,会自动参考.env中的设置帮您搞定这一切。

./console ps

以下是操作时的画面

#./info其实就是cat .env,用来查看phpenv目录上的.env设置
devin@CCC:/volume1/docker/phpenv$ ./info
DotEnv Settings
SERVICES="ssh redis"
PROJECT=material
APP_URL=http://127.0.0.1:1051
FOLDER=/volume1/docker/material
NETWORK_MOD=host
HTTP_PORT=1051
DB_PORT=1250
SSH_PORT=2051
USER_ID=1026
GROUP_ID=100
devin@CCC:/volume1/docker/phpenv$ docker-compose -p material -f docker-compose.yml -f services/redis.yml -f services/ssh.yml ps
      Name                    Command               State               Ports
------------------------------------------------------------------------------------------
material_php_1     docker-php-entrypoint sudo ...   Up      9000/tcp
material_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
material_ssh_1     docker-php-entrypoint sudo ...   Up      0.0.0.0:2051->22/tcp, 9000/tcp
material_web_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:1051->80/tcp
devin@CCC:/volume1/docker/phpenv$ ./console ps
x86_64
http://127.0.0.1:1051
      Name                    Command               State               Ports
------------------------------------------------------------------------------------------
material_php_1     docker-php-entrypoint sudo ...   Up      9000/tcp
material_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
material_ssh_1     docker-php-entrypoint sudo ...   Up      0.0.0.0:2051->22/tcp, 9000/tcp
material_web_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:1051->80/tcp
devin@CCC:/volume1/docker/phpenv$

因为支持SSH的服务,基本上我现在开发,都是透过VS Code微软开发的Remote - SSH包,连到远程主机开发的,
无论天涯海角改Code都不是问题。
 

十、用./console exec db命令进数据库 (这完全与Dlaravel上的操作是相同的)
当您有一个全新Laravel项目,要连到db建数据库时就用的到啦
docker-compsoe exec db mysql,可变成./console exec db mysql

devin@CCC:/volume1/docker/phpenv$ ./console ps
x86_64
http://127.0.0.1:1056
   Name                  Command               State                           Ports
-------------------------------------------------------------------------------------------------------------
ccc_db_1      docker-entrypoint.sh mysqld      Up
ccc_php_1     docker-php-entrypoint sudo ...   Up      9000/tcp
ccc_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
ccc_ssh_1     docker-php-entrypoint sudo ...   Up      0.0.0.0:2256->22/tcp, 0.0.0.0:3356->3306/tcp, 9000/tcp
ccc_web_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:1056->80/tcp
devin@CCC:/volume1/docker/phpenv$ ./console exec db mysql
x86_64
http://127.0.0.1:1056
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7672
Server version: 10.5.5-MariaDB-1:10.5.5+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

十一、内建mysql client进程啦,在容器内也可以下mysql命令。
所以我就搞了Laravel的php artisan的console的备份,对於小项目小数据库是相当方便的,快速备份及还原数据库。

devin@CCC:/volume1/docker/phpenv$ ./console
The "ccc" project of the php container.
dlaravel@b7a4dfbe775a:/var/www/html$ php artisan |grep 备份
  db:backup                             备份MySQL数据库
  db:restore                            备份数据还原
dlaravel@b7a4dfbe775a:/var/www/html$ php artisan db:backup
已完成备份,已存入: storage/app/backup/ccctc.sql
dlaravel@b7a4dfbe775a:/var/www/html$

即然提起,我顺便把我的console进程分享在这篇吧

<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
#Database Backup
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
use Illuminate\Support\Facades\Storage;
/*
|--------------------------------------------------------------------------
| Console Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of your Closure based console
| commands. Each Closure is bound to a command instance allowing a
| simple approach to interacting with each command's IO methods.
|
*/

Artisan::command("db:backup", function(){
    $database = env("DB_DATABASE");
    $command = sprintf("mysqldump -uroot --default-character-set=utf8mb4 -h%s %s",env("DB_HOST"), env("DB_DATABASE"));
    $process = new Process(explode(" ", $command));
    $process->run();
    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }
    $data = $process->getOutput();
    Storage::disk('local')->put(sprintf("%s/%s.sql","backup",$database), $data);
    $this->comment(sprintf("已完成备份,已存入: storage/app/backup/%s.sql",$database));

})->purpose('备份MySQL数据库');

Artisan::command("db:restore", function(){
    if ($this->confirm('您要将备份数据导入Mysql数据库吗?')) {
        $database = env("DB_DATABASE");
        $command = sprintf("mysql -uroot -h%s --default-character-set=utf8mb4 %s < %s/%s.sql",
                    env("DB_HOST"),
                    $database,
                    Storage::path("backup"),
                    $database);
        $this->comment($command);
        system($command);
    }

})->purpose('备份数据还原');



当然D-Laravel还没死哦,phpenv采用的基底image也是来自D-Laravel。
这也为何phpenv使用./console build时,创建项目image时速度很快的原因。
如果您下docker images查看,在phpenv的环境中,每个image及服务是跟著.env中的项目名称一起被创建起来的。
下方的ccc为project名称,而底线后就是服务名称

devin@CCC:/volume1/docker/phpenv$ docker images|grep ccc
ccc_ssh                          latest              948e6ba97f2b   2 weeks ago     1.31GB
ccc_php                          latest              df7295071ef1   2 weeks ago     1.16GB
ccc_nginx                        latest              9633827261ce   2 months ago    141MB
devin@CCC:/volume1/docker/phpenv$

如果您想要自己调整并且Build出自己的D-Larvel image,Dockerfile在D-Laravel的仓库中。

https://github.com/DevinY/dlaravel/tree/master/dockerfiles/fpm

在phpenv中,则是使用了dlaravel的image再去延升安装更多的功能,例如nodejs的npm命令,中文环境等。

https://github.com/DevinY/phpenv/tree/main/dockerfiles

十二、与D-Laravel不同的地方,phpenv改采用supervisor启动容器了
在phpenv的etc/supervisor目录,更名成.conf就能启动罗,下方是phpenv的目录,及一些sample档

devin@CCC:/volume1/docker/phpenv$ cd etc/supervisor/
devin@CCC:/volume1/docker/phpenv/etc/supervisor$ pwd
/volume1/docker/phpenv/etc/supervisor
devin@CCC:/volume1/docker/phpenv/etc/supervisor$ ls
cron.conf.sample  laravel.conf  mailer.conf.sample  queue.conf  websockets.conf.sample
devin@CCC:/volume1/docker/phpenv/etc/supervisor$ cat queue.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=dlaravel
numprocs=8

redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
devin@CCC:/volume1/docker/phpenv/etc/supervisor$

开发环境下还下queue:work吗?直接容器想启动就启动,完全自己决定。

devin@CCC:/volume1/docker/phpenv$ ./console
The "ccc" project of the php container.
dlaravel@b7a4dfbe775a:/var/www/html$ sudo su -
root@b7a4dfbe775a:~# supervisorctl status
laravel-worker:laravel-worker_00   RUNNING   pid 11, uptime 8:43:17
laravel-worker:laravel-worker_01   RUNNING   pid 12, uptime 8:43:17
laravel-worker:laravel-worker_02   RUNNING   pid 13, uptime 8:43:17
laravel-worker:laravel-worker_03   RUNNING   pid 14, uptime 8:43:17
laravel-worker:laravel-worker_04   RUNNING   pid 15, uptime 8:43:17
laravel-worker:laravel-worker_05   RUNNING   pid 16, uptime 8:43:17
laravel-worker:laravel-worker_06   RUNNING   pid 17, uptime 8:43:17
laravel-worker:laravel-worker_07   RUNNING   pid 18, uptime 8:43:17
php-fpm                            RUNNING   pid 10, uptime 8:43:17
root@b7a4dfbe775a:~#

十三、已经直接安装redis-cli命令了,想玩命令行的redis也不是问题。
十四、透过简易的./ports命令,查看所有主要export出来的连接埠,而且顺向排序,在新建或查看环境相当方便。

devin@CCC:/volume1/docker/phpenv$ ./ports
envs/tn_env:HTTP_PORT=1050
envs/material:HTTP_PORT=1051
envs/chat:HTTP_PORT=1052
envs/test:HTTP_PORT=1053
envs/demo:HTTP_PORT=1054
envs/phpenv:HTTP_PORT=1055
envs/ccc:HTTP_PORT=1056


 最后,phpenv是个开箱即用的Project了,不信你试看看. :p

Tags: php docker dlaravel

Devin Yang

文章内容无法一一说明,如果您有什么不了解处,欢印提问哦:)

No Comment

Post your comment

需要登入才可留言!

类似文章


docker

用bash更新docker-compse版本

安装最新版本的docker-compose

dlaravel

[D-Laravel]关於chowner.

关於D-Laravel的Chowner 本文说明在D-Laravel中chowner的功能。 如果您是Linux的使用者,可能需进行这个动作。

dlaravel

如何启动D-Laravel上的supervisor

由於queue workers是一个长期运行的进程,所以我们会需要一个进程管理员supervisor来监控Linux系统上的process是否持续运作,例如:当queue:work运作失败时,可以自动重启queue:work process。很幸运的D-Laravel已内建supervisor罗,所以不需要再自行安装即可使用。 本文简单的介绍,我们如何来启动container内的supervisor。