by Devin Yang

建立于: 4年前 ( 更新: 1年前 )

其实我最近不用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 X 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

[必学]在docker swarm环境必学iptabels的使用

首先Docker在Linux的环境下,Docker使用iptables规则来提供网络隔离。然而在Docker swarm mode的环境下,我们是没辨法把连接埠开在host的127.0.0.1下的,这时便可透过iptables中的DOCKER-USER chain来自定义规则罗 。

docker,laravel

如何使用多个YAML档,运行多个docker的container服务

这个影片介绍如何用docker-compose命令,指定多个YAML结构语言设置档,来创建容器的运行,并且介绍在D-Laravel的使用环境中,我们如何透过使用.env的方式,简化docker-compose的启动命令。

docker,phpenv

在Linux上ping不到host.docker.internal

可用docker version检查,确认版本在Docker v20.10+即可添加extra_hosts如下: