其實我最近不用Tinkerwell了,因為老是要我花錢更新。
要測試直接ssh 主機不就搞定啦不是?🙄
devin@m1Max:~$ssh www
Last login: Sat Dec 10 09:39:03 2022 from 172.23.0.1
dlaravel@1defe94ae59d:~$ tinker
Psy Shell v0.11.9 (PHP 8.1.11 — cli) by Justin Hileman
>
我的主機都是SSH容器中的Laravel環境,基本上到處是tinker。
在phpenv環境,最後兩行已直接內建artisan跟tinker別名了。
https://github.com/DevinY/phpenv/blob/main/dockerfiles/bash_aliases
alias artisan='/usr/local/bin/php /var/www/html/artisan'
alias tinker='/usr/local/bin/php /var/www/html/artisan tinker'
以下是舊資料啦
前言
D-Laravel加入了ssh的image了,這意味著,我們可以使用Tinkerwell在D-Laravel的docker環境。
當然我相信ssh的運用不止於此。
如果您還沒聽過Tinkerwell,可以參考官網Demo:
https://tinkerwell.app/
關於build ssh的image(非必要)
我們可以使用dlaravel中的
dockerfiles/fpm/Dockerfile_php_ssh
Build我們自己的image,簡單的執行...
#在D-Laravel的目錄中
cd dockerfiles/fpm
./build ssh
如果您要不同的php版本,可自行調整Dockerfile_php_ssh檔的第一行。
FROM php:7.4.2-fpm
ARG user
#安裝ssh環境
ENV OSSH_USER ${user:-dlaravel}
RUN apt-get update&&apt-get install -y openssh-server git pwgen
RUN mkdir /var/run/sshd
略.....
或是用官方的指令,來build自己的image
docker build -t <myimage> -f Dockerfile_php_ssh .
眼尖的您或許會發現,build.sh的指令中,已經把官方build指令也列出來供您參考了。
build的指令,預設是找Dockerfile,但因為我們使用的非預設的檔案,所以這裡多了 -f 指定檔案,最後的「.」代表了目前的目錄。
切換Docker上PHP加ssh環境
在D-Laravel的簡易bash上,切換到ssh的環境非常簡單,如果您已是D-Laravel的使用者或許猜到了。
./console ssh
這個指令,會在D-Laravel的目錄建立軟連結,我們能透過./console link指令確認。
讓我們來看看docker-compose-ssh.yml的內容吧
version: '3.6'
services:
#=== web service ======================
web:
image: nginx
dns: 8.8.8.8
ports:
# normal
- "80:80"
- "443:443"
- "2020:22"
volumes:
- ./sites:/var/www/html:cached
- ./etc:/etc/nginx/conf.d
- ./var/log/web:/var/log/nginx
hostname: web
networks:
- dlaravel_net
#=== php service ==========================
php:
network_mode: "service:web"
image: deviny/fpm:7.4.2ssh
volumes:
- ./etc/php:/usr/local/etc/php/conf.d
- ./sites:/var/www/html:cached
- ./etc/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf
- ~/.ssh:/home/dlaravel/.ssh
- ./etc/cache:/home/dlaravel/.composer/cache
environment:
- TZ=Asia/Taipei
#=== db service ===========================
db:
image: mysql:8.0.18
command: --default-authentication-plugin=mysql_native_password
hostname: db
ports:
- "127.0.0.1:3306:3306"
volumes:
- ./etc/mysql/conf.d:/etc/mysql/mysql.conf.d
- ./data:/var/lib/mysql
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD= "yes"
- TZ=Asia/Taipei
networks:
- dlaravel_net
#=== top-level netowks key ======================
networks:
dlaravel_net:
在上方的Yaml檔中,重點請專注在php的容器服務(php:)上。
一、port
- "2020:22"
阿不是說專注在php:容器服務的設定上嗎,這2020:22怎麼在web服務(web:)?
請注意,這裡的php網路模式在D-Laravel的設定中採用了
network_mode: servce:web
這裡代表了他開的連結埠,會開在web服務上,所以是將-port的設定放在了web:。
如果您是docker新手,再提醒一下,冒號左邊2020是host的連結埠,代表執行Docker的主人,就是我們自己的電腦,只要不衝突可依自己需求隨意調整。
冒號右邊的22是,容器內開啟的連接埠,基本上是固定的不可調整。
二、ssh的image的部份,使用了7.4.2的php版本,並且有ssh功能的。
image: deviny/fpm:7.4.2ssh
三、掛載,在php:下的volumes:項目
- ~/.ssh:/home/dlaravel/.ssh
預設D-Laravel是直接掛載了我們自己的家目錄下的.ssh資料夾(~/.ssh),當然您可以依自己的需求調整。
SSH公鑰驗證
透過D-Laravel所build出的ssh服務只可採用公鑰驗證登入,使用密碼是行不通的。
OpenSSH會有兩把鑰匙,一把是沒有.pub的私鑰,一把是私鑰。
首先,我們先進到~/.ssh目錄,指令如下:
cd ~/.ssh
但是,您可能會出現,找不到.ssh目錄的錯誤訊息
cd: no such file or directory: /Users/devin/.ssh
如果,您出現了上方,目錄不存在的錯誤,別緊張,這代表了您尚未建立過任何的OpenSSH鑰匙,您可以用ssh-keygen產生一把。
我想給tinkerwell一把專用的鑰匙,所以,我是這麼做的。
cd ~/.ssh
ssh-keygen -C "tinkerwell"
實際執行圖片如下:(非常重要,詢問儲存時,不要直接壓Enter,否則會蓋掉你自己的id_rsa,如果您先前有建立了)
詢問金鑰密碼passphrase的部份,可以壓enter空白。
執行ls tinkerwell,就會發現我們的目錄下建立了tinkerwell的金鑰對了。
$ls tinkerwell*
tinkerwell tinkerwell.pub
我們能用下方指令重導向,快速的把公鑰,加入到authorized_keys
cat tinkerwell.pub >> authorized_keys
測試SSH登入php容器
透過ssh指令,快速測試,是否能用ssh連進容器內
ssh -i ~/.ssh/tinkerwell dlaravel@127.0.0.1 -p 2020
參數說明:
-i 指定我們要使用的私鑰,在上方的設定中,我們有將tinkerwel.pub公鑰,加入到authorized_keys中了。
-p 指定非標準的連接埠,D-Laravel會把port開在2020,所以這裡指定連到2020。
成功登入,我們能透過Ctrl+d離開。
Tinkerwell設定
點選下圖中,左方的第四個icon,ssh connect,進行設定:
接下來,就來試看看tinkerwell,選擇金鑰時,因為~/.ssh是隱藏資料夾,所以在MacOS的系統,我們可以透過
shift+cmd+g,來指定路徑,並且選取我們的金鑰
試跑看看囉:
搞定啦,成功讓Tinkerwell在專案中執行啦。
No Comment
Post your comment