by Devin Yang , 2 years ago

前言

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

Login is required to leave comments

Similar Stories


docker

如何在Raspberry上用Docker啟動HAProxy

Raspberry很便宜有相當多的運用,例如有人拿來當Wifi的router, 遊戲機,監視器及許許多多物聯網相關運用,我則是用他來當一台HAProxy。 長話短說,因為有一台老舊的Windows伺服器,他執行舊版本的PHP及Apache,並且無法設定HTTPS憑證,所以就想說 透過HAProxy來幫忙啦。讓這台老舊伺服器也可以有https的網址, 所以來分享我的docker-compose.yml設。

MacOS

MacOS上重啟sshd服務

紀錄我如何在MacOS上重啟sshd服務。

python

python fastapi速查筆記

簡單記錄執行fastapi的安裝步驟