没时间拍介绍影片,我就来随便抓些画面介绍我使用的容器环境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"><?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
No Comment
Post your comment