42東京 課題紹介 inception
はじめに
今回はinceptionという課題を紹介します。
実は一番最初の課題から順番に説明しようと思っていた矢先、仕事と課題とビザの取得、引っ越し等、いろんなことがあり書く気が起きず、だらけていました。
そんなこんなしている間に時は流れ、inceptionという2週間くらいでやれそうな課題に1ヶ月半もかけてしまいました。(理由はあるよ)
ということで今回この課題についてどんなものを説明していきます。
inceptionの課題の中身とは
簡単にいうとDocker を使えるようにしようぜ!!というものでした。
私はとりあえず触りながらやるというよりもある程度本とかYoutubeで知識をつけてから勉強するのが好きな人間なので、今回も動画を見たりしてDocker とはなんぞやから始めました。
具体的に説明するとやりたいことの方向性としてNginx(ウェブサーバー)とMariadb(データベース)とWordpressを使って自分のページを表示したり、投稿に対してコメントとかができるようにする環境を作る課題です。
どうやってやるかというとDocker を使ってそれぞれのイメージを作って、最後にDocker composeを作って通信とアプリ間の連携を指定してうまく動かすようなものです。
Dockerfileとは
これはGoogleで検索したらもっとわかりやすく丁寧に説明しているサイトがたくさんあるので見てみてください。
私が言えるのは、どんな人のPCで同じような環境を作っていることができる手順書=Dockerfileということです。
なので、ガイドラインを書いていくのが課題のメインの内容です。
Debianをインストールして〜、必要なパッケージインストールして〜、このファイルをここにコピーして〜、ファイルの権限はこんな感じにして〜、このコマンドを実行してください!
これをDockerfileに順序よく細かいことを気にしながら書いていきます。
私の進め方
動画を見てへーそんなものあるんだーから始まり、徐々に自分で書いていこうとしました。
でも、Nginxとはなんぞやってなるんですよ。そうするとこっちを調べにいきまして、で動画で理解して次にMariadbのことを調べて〜ってやりました。
当然、インプット過多で情報処理が追いつかなくなり、わけわからんってなります。
そこで友達にアドバイスをもらいました。
Nginxだけ実装して具体的に動かしてみたら?と
実はこの課題VM上でやるんですが、私のPCは8GBしかないので、常に重々の状態でやっていたんですね。しかも、設定するのがめんどくさかったので、誰かが作ってくれていたVMをそのまま使いました。(これが後ほど私を死ぬほど苦しめることになろうとは夢にも思いませんでした。)
Nginxについて
ということでまずはNginxを実際にPCにインストールして何がどこに入っているのかということを動かしながら確認しました。
またPortをいじったりするために、default.confの設定の確認やホストの指定などを行なってみます。
これがイメージできたので、ここで同じことができるように手順書を書きます。(Dockerfile)
実際にやったインストール〜default.confについての変更までを課題要件に合わせてやりました。
Mariadb
これも実際にインストールしてどのように動くのか、どうやったら、データベースの中に入って何がどこにあるのかを細く確認しました。
今回の課題はバックグラウンドで処理を回すとアウトになるので、そうならないようにする必要がありました。
docker の中でどの順序で設定して、どのようにやったら、バックグランドではなく、フォアグラウンドで処理を継続できるのかを考えるのが大変でした。
→コマンドによっては起動してから終了するまで一連の流れでするものもあります。docker composeは処理が途中で終了すると「やべ、再起動せな」ってなって、何回も再起動を繰り返すプログラムを2-3週間くらいずっと直してました。(自分が悪い)
Wordpress
ここは割とすんなりいけました。決まった要領でインストールして、設定のスクリプトを書いていくだけなので特に大きな障害にはなりません。しかし、これは終わってからみてみると最初の状態から変わっていなかったのでそう言っているだけです。
エラーが出るとなぜ出ているのかがわからなくて迷子になるので何回か描き直しました。
灯台下暗しはとはよく言ったものだ
上記の通りやっていたのですが、4/20くらいには概ね出来上がっていました。
しかし、ここから大きな2つの問題にぶち当たりました。
1つ目がportを443しか開放していないのに80portで繋がってしまう。
2つ目がmariadbがVM再起動をするとExit(137)となってしまう。
これらにはかなり苦しみました。5/9に課題提出する時はういいやと思って提出したのですが、当然落ちました。
そこでいろんな人に話を聞いたり、みてもらったりしてもなかなか原因が得的できなかったのですが、ふとある人が「そういうば、あのVMってnginxとmariadb最初から入っているよね。」
ん?え?そうなの?そうなんだ?
他の人に見てもらうときに実行してみてもらうというより書いているコードをみてもらっていました。
これはもしやということで、ブラウザを使わず、curlで実行してport80が繋がるかやってみたら「ちゃんと接続できない!!」
元から入っていたnginxとブラウザの設定のせいでport80のものが全部勝手に443に変わってしまっていました。悲しみ。
つまり、いけてた、、、できていた
次の問題はmariadb。こちらはport番号を確認したりしたら、元から入っているものがdocker と同じport番号指定していたので、こちら優先されてしまい、dockerの方がexitしていました。
元のnginxとmariadbを消し去り、実行してみたら、できていた。
2週間を無駄にしてしまった。が、実はこのエラーを探す旅の間にDockerについて、PID1問題についてたくさん調べて多少なりとも知識がついてので、結果オーライにします。
おすすめの勉強方法
いろんな失敗をしてしまいましたが、やってみてこうすればよかったなと思うものを載せておきます。
課題の要件をよく読むこと
まずは、動画や本で概要の知識を取り入れる。
実際にアプリケーションをインストールして動かしてみること
Docker Desktopは絶対使ったほうが楽です。(Macでしたが、これがなかったら本当に泣いていた。)
うまく概要を理解できたら、さっそく作り始めてしまう。ネットに参考資料がたくさんあるので惜しまず、調べること。
使っているVMの中身は確認した方が良い
こんな感じです。
最後に
ということでお疲れ様でした。私は晴れて大きな課題を一つ終わらせることができました。
残るはC++のちょこちょこした課題と最も大きいwebserverという課題です。頑張ります。
私はひとまず最低限のレベルでいいので完成に向かいたいと思います。