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 — 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

Docker image的封存及取回

如何封存docker的image成為tar檔,並且載回docker image。 我們可以用docker save及docker load進行。

dlaravel

D-Laravel測試域名*.dev變更為*.test

由於Google Chrome 63會強制轉換*.dev的域名為https了,D-Laravel新版的域名變更為*.test。 本文說明更新的方式。

docker

用樹莓派安裝Docker及docker-compose

本文簡單介紹我們如何在Raspberry Pi上安裝docker及docker-compose。