Docker のコンテナで動くOSがよく分からなかった
よく分からなくなったこと
- Dockerfile で Alpine Linux が登場して、コンテナの OS だよって言われてよく分からなくなった
- コンテナで OS が動いているの?ってなった
分かったこと
自分が理解できていなかったことで大事なこと。
- Docker は Linux でしか使えない(Windowsコンテナ―とかは無視)
- だから、 Windows や Mac(Unix) では直接は使えない
- Linux ディストリビューションが違っても実行ファイルは動作する
一つずつ説明していきます。
1. Docker は Linux でしか使えない(Windowsコンテナ―とかは無視)
まず
大前提として、Docker は Linux で成り立っている。
大前提として、Docker は Linux で成り立っている。
大前提として、Docker は Linux で成り立っている。
ここ重要。
2. だから、 Windows や Mac(Unix) では直接は使えない
Linux なので当然 Widows や Mac(Unix) では使えないため、Docker for Windows や Docker for Mac が用意されている。
今回は Windows で説明するが、Docker for Windows をインストールして Docker を起動すると、仮想環境で Linux が動作している。
Settings に Disk image location があるが、このイメージが Hyper-V 上で動作している。
Hyper-V を確認すると MobyLinuxVM というイメージが動作していることがわかる。
3. Linux ディストリビューションが違っても実行ファイルは動作する
参考サイトより引用
DockerはLinuxの同じCPUならば、違うディストリビューションでもマシン語で書かれている実行ファイルのフォーマットが同じ形式であり、適切な依存ライブラリを渡してやれば動くでしょという思想です。
OSの名前はついているが、ベースイメージはOS的役割をするのではなく、そのOSっぽい環境を整える(ディレクトリ構成をそのOSっぽくするなど)のが役割
もうここら辺の引用がほぼ答え。
- 実行ファイルはディストリビューションが違っても Linux であれば動作する
- Alpine Linux で それっぽい Linux OS の環境を作成する
- 実行時のLinux カーネルは ホストOS、環境はAlpine Linux となる
こんなイメージかなー
参考
Docker for Windowsのインストール後の設定項目 - Qiita
Docker - Dockerのコンテナ内で使われるOSについて|teratail
Hapa英会話第3回「家族について」
感想
最初の方は付いていけても、途中で何言ってるかわからなくなって、最後まで分からなくなる。
兄弟の言い方 siblings なんてあったのか。
この単語分からなくて、最初聞いたとき何言ってるのか全く分からなかったなぁ。
車通勤中に Podcast でHapa英会話を聞き始めた
毎朝の車通勤の約20分を利用してPodcast の Hapa英会話を聞き始めた。
今日は第一回「仕事について」を聞いた。
感想
速すぎて何言ってるのか全然わからん。
「仕事について」ってタイトル見てるからそういう話してるんだろーなって思って聞いてるけど、 このヒントなかったら本当何言ってるか分からんな多分。
とりあえず一ヶ月朝の車通勤時に続けてみようと思う。
Puppeteer を使って Yahoo のニュースをスクレイピングしてみる
kanazawa.rb meetup #72 で Puppeteer を触る機会があったので残しておく。
Puppeteer
インストールは
npm i puppeteer
ver 1.7.0 から puppeteer-core ってのが公開されたらしくこっちだと Chromium を同時にダウンロードされることはないみたい。
すること
Yahoo のページから上記のニュースの一覧を取得してコンソールに表示してみる
プログラム
Puppeteer を使って Yahoo のニュースをスクレイピング
こんな感じで、 「ブラウザを起動して、ヤフーのページを開いて、ニュース取得する Javascript を実行するっていう」を Node.js を使ってコマンドラインから実行できる。
実行結果
node scraping_yahoonews.js [ 'オスプレイ 佐賀県民の不安写真', '関東など猛暑日 東京22日ぶり写真NEW', 'ロヒンギャ難民 長期化に焦り写真NEW', '愛知岐阜の遺体 仕事で面識か写真NEW', '旧盆の海にお化け?気象台解説写真', '吉田輝星 内定先監督の不安写真', 'みやぞん まずは1.55キロ完泳写真NEW', '南米熱狂 FLOWのアニソン写真' ]
感想
Puppeteer の理解より先に、Javascript の書き方の理解が必要そう。 async/await とかどうなってるのか全然わかってないし、 jQuery 使って〜とかの知識しかなくてちょっと辛い。
VS CodeでSpring Boot を起動しようとしたら「Build failed, do you want to continue?」と表示されて起動しない
バージョン
参照
下記ページを参照することで解決できた。
したこと
Command-line arguments: -data C:\Users\xxxx\AppData\Roaming\Code\User\workspaceStorage\56838f4e76654cb1f380037ac07c0b54\redhat.java\jdt_ws
ってあるので、56838f4e76654cb1f380037ac07c0b54 のフォルダを削除するかリネームする。(VS Code 一旦終了してする)
Java Language Server が workspace を持ってるみたい。
- F5 キー押して起動してみる
- 起動したー
Spring Boot でセッションタイムアウトを1秒に設定しようとしてハマった
バージョンとか
- Spring Boot 2.0.2
- Embedded Tomcat
設定してみる
application.yml にタイムアウトの設定を追加して、下記のコードで確認を行う。
タイムアウトの値は極端に短く 1 秒になるようにしてみる。
server: servlet: session: timeout: 1
int t = request.getSession().getMaxInactiveInterval();
System.out.println(t);
結果は
60
getMaxInactiveInterval()
の戻り値は秒だから 60 秒ってことか。
timeout: 2
に変更しても、結果は変わらず。
何で 1 秒ならんの?
ちなみに、yml から設定を削除して実行してみると、1800 が表示されるので、 デフォルトは 1800 秒( = 30 分) のようだ。
60 になってるから設定は何かしら効いているっぽい。
よくわからんからソース読む。
で、このあたりが怪しい。Math.max で大きい方取ってる。
private long getSessionTimeoutInMinutes() { Duration sessionTimeout = getSession().getTimeout(); if (isZeroOrLess(sessionTimeout)) { return 0; } return Math.max(sessionTimeout.toMinutes(), 1); }
リファレンスには下記のようにあるので、application.yml の設定は「秒」で設定されてる。
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used.
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Duration がよく分からなかったので実験してみる
まとめ
つまり、application.yml の 1 秒とか 2 秒の設定は、Duration#toMinutes()
で 0
になって Math.max(sessionTimeout.toMinutes(), 1)
の比較で 1 に負けて、1 分つまり 60 が設定されたってことか。
秒で設定出来そうに見えて、分刻みでしか設定出来ないってことになるんだな。
最小の設定は 1 分 (= 60 秒)なんだな。