📦

一から格闘する仮想環境の構築

2025/04/06に公開

私はwindowsでずっと開発しているが、レンタルサーバーはLinuxOSなので環境の違いで不具合が出ることが稀にある。
その稀に引っかかったときはまず厄介事になるので、よーーーやく仮想環境とやらに手を出すことにした。その闘いの記録。
GeminiとchatGPT辺りに尋ねまくって闇雲に動かして覚える効率の悪い脳筋プレイだが致し方なし。windows使ってるのが悪い

rancher desktopのインストール

https://rancherdesktop.io/
公式サイトからダウンロードしてインストール。
個人で使う分にはdockerも無料で使えるらしいのだがほぼ同じこと出来るし、拡張性はrancherのほうが若干良さそうかなということでこちらを選択。

会社でdockerを使って個人の開発環境を持てる!みたいな話があり、そちらで度々使っていた。
検証チーム向けに説明会も何度かありエンジニアのサポートも受けられたのだが、メンバーの移動やらそもそもの扱いが難しく二十数人いた中で終盤まで使ってた人間は私だけだった。

というかインストール出来ない。すぐキャンセルされる。は?何故?

WSLのインストール

WSLインストールされてなくてもrancher側で勝手にやってくれるよ~
的な記事を見た気がするのだが、、入ってることに越したことはないのでインストール。
wsl --install これだけ。ラクチン。
ディストリビューションがインストールされてなかったので、wsl --install -d Ubuntuと無難なやつを入れておく。
wsl -l -vでバージョンも確認したところ2となっていたので問題なさそう。

改めてrancher desktopのインストール

改めてインストール。

通った。良かった。
とりあえずKubernetesはよくわからんので一旦無効化。ContainerEngineはdockerdを選択。WSL>IntegrationsのUbuntuにチェックを入れておく。

……ここから先が全くわからん。どうすればいいんだ?
AN HTTPDで開発してたのを仮想環境内で本番と近い形で開発できるようにする、がひとまずの目標であるので、
ひとまずはhello world!がprintされるだけのcgiスクリプトが動くのを見ることができれば達成とする。

イメージをダウンロード

AIに聞いたときはDockerfileを作成して~~とか言っていたのでその通りに動かしていたのだが、上手くいかない。さっぱりわからん。

数時間格闘しても進展がないので自分で検索した結果、httpdの公式イメージがあることがわかった。これでいいじゃん。。
docker pull httpdでイメージを持ってくる。gitの勉強をしたおかげでこの辺のコマンドもすんなり理解できたのはありがたい。

ダウンロードされてる。ヨシ

コンテナを作ってアクセスしてみる

今回一番詰まって時間がかかった場所。

数時間を2日間かけて進歩なし、でこの記事を書き始めた。
ので書きたいのだが、色々試しすぎて何をやったのかすら覚えてない始末…
断片的に書き連ねていく。

docker run -p 8080:80 -v X:test:/usr/local/apache2/cgi-bin httpd:2.4で起動。コマンドが動かない。
AI「書き方が違うで」

docker run -p 8080:80 -v /x/test:/usr/local/apache2/cgi-bin httpd:2.4で起動。
http://localhost:8080/cgi-bin/hello.cgiにアクセス。404 Not Found。
AI「Xドライブは認識しないかも?」

docker run -p 8080:80 -v /c/test:/usr/local/apache2/cgi-bin httpd:2.4で起動。
http://localhost:8080/cgi-bin/hello.cgiにアクセス。404 Not Found。
AI「マウントが上手く行ってないかも?コンテナに入って云々~」
http://localhost:8080It works!は表示されている。
確かにマウントが上手くいってないことが確認できたのだが、ここまで4時間格闘して解決せず断念。

時間を明けて自力で検索した結果、/mnt/cとする必要があるという記事を見つける。
docker run -p 8080:80 -v /mnt/c/test:/usr/local/apache2/cgi-bin httpd:2.4で起動。
コンテナに入ってls -l /usr/local/apache2/cgi-binで中身確認。

マウントされてる!やっぱりAIに聞くより見知らぬ誰かの備忘録なんや!

どうやらこれはWSL2側の仕様らしい…
そしてhttp://localhost:8080/cgi-bin/hello.cgiにアクセス。404 Not Found。

う~む。。。
詰んだので一旦放置!w忘れたほうがいいときもある。

コンテナを作ってアクセスしてみる2

3日ほど放置した。
脳筋プレイで進めると効率が悪いが、何がわからないのかわからないという曖昧な状態はある程度回避できるので、ここで改めて1から環境構築できる方法を調べる。

https://codezine.jp/article/detail/12831
動画やいろんな記事を見まくった結果そもそも普通のhtmlファイルは見れるのか?ということで/htdocsの方へ接続してみる
docker run -it -d -p 8080:80 -v /mnt/c/test:/usr/local/apache2/htdocs httpd:2.4
http://localhost:8080/test.htmlにアクセス。見れた。
大丈夫そう。コンテナに入ってperlコマンドも実行できる。

apacheとperlはコンテナ分けるべき!ともあったが、それは追々やることとしてひとまずは動いてるところを見たい。
Imageレイヤーを更新する感覚は掴んだので、以前AIに言われていた内容を試していく

docker cp hoge:/usr/local/apache2/conf/httpd.conf C:\test\httpd.confでhttpd.confを持ってきて編集

httpd.conf
 <Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
-   Options None
+   Options +ExecCGI
    Require all granted
+   AddHandler cgi-script .cgi .pl
 </Directory>
...
 <IfModule mpm_prefork_module>
- 	#LoadModule cgi_module modules/mod_cgi.so
+ 	LoadModule cgi_module modules/mod_cgi.so
 </IfModule>

docker run --name hoge -it -d -p 8080:80 -v /mnt/c/test:/usr/local/apache2/cgi-bin -v /mnt/c/test/httpd.conf:/usr/local/apache2/conf/httpd.conf httpd:2.4
再起動方法等々を覚えた結果だいぶ長くなった。しかし変化はなし。

このタイミングで間違えてhello.cgiではなくtest.cgiを叩いていたのだが、ここで初めて他のファイルは認識しているのにhello.cgiだけNot Foundになっていた。
そういえば末尾が勝手にhello.cgi/になるな。これ誤差やろ?え、重要なの?
謎現象だがあまりにも不運。仕方なくkakunin.cgiという名前に変更したが、まだcgiファイルとして認識していない。

もう一回見直したところ、AIは直接言及していないがコメントアウトしている箇所があったのでそちらも変更した。

httpd.conf
 <IfModule !mpm_prefork_module>
-	#LoadModule cgid_module modules/mod_cgid.so
+	LoadModule cgid_module modules/mod_cgid.so
 </IfModule>

ちなみに更新は都度止めて起動する必要はなく、起動したままdocker restart hogeでいいことを覚えた。
http://localhost:8080/cgi-bin/kakunin.cgiにアクセス。Internal Server Error。
変わった…!
改行コードがCRLFなのも原因になるらしいのでLFに直す。windowsで開発しているとCRLFになってしまうらしい。
http://localhost:8080/cgi-bin/kakunin.cgiにアクセス。hello world!

開☆通

これにて完遂。
なおXドライブにマウントできなかったのは単に理解してなかっただけ、改行コード問題は全ファイルLFに変換することとした。
この1記事内だけで自身の成長を感じる。伸びしろしかない。

レンタルサーバーに近づける

今まで使っていたディレクトリをそのままcgi-binにマウントしたところ、index.htmlなどもcgiスクリプトとして判別していた。
これでは使いづらいのでレンタルサーバーっぽく使う方法をAIに聞いてもう少し対応を進める。

httpd.conf
 <Directory "/usr/local/apache2/htdocs">
    Options Indexes FollowSymLinks
-   AllowOverride None
+   AllowOverride All
    Require all granted
+   Options +ExecCGI
+   AddHandler cgi-script .cgi .pl
 </Directory>

cgi-bin側の変更は元に戻した。htdocs下で権限を付与してやればいいらしい。
これでindex.htmlやその他cgiページが今まで通り動くようになった(モジュールが足りてないのでまだ完全に動いたわけではない)
7年前に作ってたらしいhtaccessファイルにdeny from allと書いてあり、一部ファイルが読み込めない現象の特定に至るまで2日費やしたのは内緒

コマンドの設定内容をファイルに落とす

docker run --name hoge -it -d -p 8080:80 -v /mnt/x/hogehoge:/usr/local/apache2/htdocs -v /mnt/x/RancherFile/httpd.conf:/usr/local/apache2/conf/httpd.conf httpd:2.4

現時点で長い。オプションを増やすほどさらに長文になっていくのか…?
というところで、最初に詰まったDockerfileを作成して~~の伏線を回収することになる。

X:Rancherfileディレクトリにhttpd.confを置いたのでDockerfileも置いておく。ビルドする時にDockerfileが置く場所はどこでもいいらしいが、場合に寄ってはパスの指定とビルドコンテキストの記述がちょっとややこしくなりそう。

Dockerfile
FROM httpd:2.4
COPY Rancherfile/httpd.conf /usr/local/apache2/conf/httpd.conf
EXPOSE 80
CMD ["httpd", "-D", "FOREGROUND"]

AIに丸投げして作ってもらった。上記を作成後Dockerfileを置いた場所に移動し、docker build -t my-httpd-image .とでもしてビルドすると、各種設定が入ったmy-httpd-imageイメージが作成される。

なおhogehogeにあるスクリプトまでCOPYをしてしまうと、イメージ側に読み取り専用として固定されてしまいリアルタイム開発が出来ないので、ボリュームとしてマウントするべきということになる。
あまり変更しない大元の設定をイメージに読み取り専用として、頻繁に更新するものはボリュームとしてマウントすると。なるほどなあ
結果docker run --name hoge -it -d -p 8080:80 -v /mnt/x/hogehoge:/usr/local/apache2/cgi-bin my-httpd-imageとなり、、あまり変わんないな…
それを解決するのがdocker-compose.ymlで設定…となるようだがこの記事はここまで。

まとめ

最初はよくわからなかったが、ここまで来るとだいぶ解像度が上がった。前半の方を見返すと何故そんなとこで躓いてるんだと自分でも思う。恥ずかC。
仮想環境が難しいというよりもサーバーそのものの知識不足で調査していたのが大半だった気がする。レンタルサーバーって思ってた以上によしなにやってくれていたんだなと…

ひとまず0を1にすることが出来たので、仮想環境を使った開発に慣れていこうと思う

Discussion