by Devin Yang

建立於: 5年前 ( 更新: 2年前 )

其實我最近不用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在專案中執行啦。




​​​​​​​




 

Tags: docker tinkerwell tinker laravel

Devin Yang

文章內容無法一一說明,如果您有什麼不了解處,歡迎提問哦:)

No Comment

Post your comment

需要登入才可留言!

類似的文章


docker

關於GCE上FPM image如何變更owner

CCC網站升級php 7.2.0囉,有Docker的環境,輕鬆搞定php升級, 在Linux上Image的變更還是有些注意事項您應該了解。 如果您跟我一樣透過docker將D-Laravel安裝於Linux的系統上,當您變更不同的image時, 或許您可能會碰到,疑!怎麼composer沒有權限寫入資料夾的錯誤。 directory is not writable

docker,polymer,seo

用Rendertron解決Polymer SEO問題(Polymer Summit 2017)

文章下方的影片介紹如何使用rendertron解決Polymer SEO優化的問題。 在我fork的source中,已調整支援中文環境。 並且還加入了pdf的API接口,也可以拿來轉pdf。

d-laravel,docker

D-Laravel v1.2.1版變更說明(建議更新,必免踩雷)

D-Laravel v1.2.1版修正說明 use GuzzleHttp\Client; 進行post時.出現存取被拒的問題。 如果您是由舊版升級,您可能需調整etc/default-ssl.conf的設定檔 (如果有該檔) 請調整php:9000變更為web:9000,你可以透過執行一次./console secure調整。 docker-compose設定檔部份,PHP-FPM container變更為network_mode: "service:web"...