質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1142閲覧

Docker内のLaravelからネットワーク上のMySQLサーバーへクエリを流したい

yosida001

総合スコア56

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/12/03 09:46

編集2021/12/03 09:50

解決したいこと

Docker内のLaravelで以下のコマンドを利用し、

# sail artisan remote:select

こちらのようなソースコードの中身を通したいと思っております。

public function handle() { $this->line("-----------------------------"); $this->line("start remote_mysql test connection."); $this->line("-----------------------------"); dispatch(new CreateTunnel()); $user = DB::connection("mysql_tunnel")->table("user")->get(); dd($user); $this->line("-----------------------------"); $this->line("end remote_mysql test connection."); $this->line("-----------------------------"); return Command::SUCCESS; }

この時の、mysql_tunnelのコネクション先がLaravelの存在しているサーバーとは別のネットワーク上にあるMySQLサーバーです。

stechstudio/laravel-ssh-tunnel

というライブラリを使えば外部サーバーへssh通信で繋げることができ、Eloquentのコネクションを繋げることが可能なのではないか?と考えました。
そこの設定どおりやっていざコードを実行したところ、以下のようなエラーメッセージが発行されました。

ErrorException Could Not Create SSH Tunnel with command: /usr/bin/ssh -o StrictHostKeyChecking=no -N -i ./resources/ssh/id_rsa -L 3306:127.0.0.1:3306 -p {port} {user}@{ip-address} Check your configuration. at vendor/stechstudio/laravel-ssh-tunnel/src/Jobs/CreateTunnel.php:72 68▕ // Wait a bit until next iteration 69▕ usleep(config('tunneler.wait')); 70▕ } 71▕ ➜ 72▕ throw new \ErrorException(sprintf("Could Not Create SSH Tunnel with command:\n\t%s\nCheck your configuration.", 73▕ $this->sshCommand)); 74▕ } 75▕ 76▕ ...

コンフィグの問題だといわれてしまっているので設定方法が悪いのかと思い、問題の切り出しのため以下のコマンドをLaravelの入っているサーバーにログインしたうえで実行したところ、普通に対象のサーバーにアクセスすることができてしまいました。

/usr/bin/ssh -o StrictHostKeyChecking=no -i ./resources/ssh/id_rsa -L 3306:127.0.0.1:3306 -p {port} {user}@{ip-address}

違いは「-N」を入れていないことと、CreateTunnelクラスを介さず手動でコードを実行していることくらいだと思いますが、
これらの違いがエラーになる理由がわかりません。
手がかり程度でもいいので何か原因など思い当たる節があればどなたか教えていただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surface_0

2021/12/08 10:22

> Laravelの入っているサーバーにログインしたうえで実行したところ、普通に対象のサーバーにアクセスすることができてしまいました。 こちらはLaravel用のコンテナ内で実行してみたということでしょうか?
yosida001

2021/12/09 09:16

コメントありがとうございます。 はい、 docker compose exec laravel.test bash で入ることのできるLaravelの入っているコンテナ内で実行してみました。
guest

回答1

0

自己解決

自己解決しました

結論から言うとmysqlにホスト指定していない場合、デフォルトがlocalhostでの接続になり、かつ、ホスト名がlocalhostの場合デフォルトがソケット接続になってしまっていたため、ローカルのmysqlサーバーに接続しようとしていたため繋がっていませんでした。

参考文献
https://dev.mysql.com/doc/refman/5.6/ja/connecting.html

Unix では、MySQL プログラムはホスト名 localhost を、ほかのネットワークベースのプログラムと比較して想定されるのとはおそらく異なる、特別な方法で扱います。localhost への接続で、MySQL プログラムは Unix ソケットファイルを使用してローカルサーバーに接続しようとします。これは、ポート番号を指定するために --port または -P オプションが与えられた場合にも生じます。クライアントがローカルサーバーに TCP/IP 接続を行うことを保証するには、--host または -h を使用して、ホスト名の値 127.0.0.1、またはローカルサーバーの IP アドレスまたは名前を指定します。--protocol=TCP オプションを使用して、localhost に対しても、接続プロトコルを明示的に指定することもできます。

ありがとうございました。

投稿2021/12/13 04:02

yosida001

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yosida001

2021/12/13 04:04

すみません、読み直したら全然解決してませんでした、 コメントの段階ではSSH接続でのコマンド自体の設定を間違えていました。 (ローカルの3306はすでにdocker経由で手元のmysqlと接続済みのため、ポートが重複していました。) その後、さらにそれらのssh接続コマンドの設定をこねくり回している段階で上記のミスに気が付きました。ありがとうございました
surface_0

2021/12/14 04:43

結局解決されたということでしょうか?
yosida001

2021/12/14 04:44

はい、解決しました。ありがとうございます。
surface_0

2021/12/14 05:03

承知しました。 一応自分の方でもさっき試したところ、sail upコマンドで立ち上がるコンテナにはncコマンドがインストールされておらず、それが原因で失敗したので、それかと思いましたが違ったようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問