docker logsとPID 1問題

1サービス1コンテナという言葉がある通り、Dockerコンテナでは1つのアプリケーションをパッケージングすることが推奨されています。
これを遵守していれば、docker logsの仕組みについてあまり理解せずともサービスのログの出力先を標準出力、標準エラー出力に向ければdocker logsでログを見ることができました。

docker docsでは例としてnginxとhttpdのコンテナでの設定を紹介しています。

nginx

The official nginx image creates a symbolic link from /var/log/nginx/access.log to /dev/stdout, and creates another symbolic link from /var/log/nginx/error.log to /dev/stderr, overwriting the log files and causing logs to be sent to the relevant special device instead.

View logs for a container or service | Docker Documentation

ログの出力先をシンボリックリンクにしておき標準出力、標準エラー出力にログを流しています。

ここで登場する「/dev/stdout」「/dev/stderr」に関してはそれぞれ下記のようにシンボリックリンクが設定されています。

  • /dev/stdout -> /proc/self/fd/1
  • /dev/stderr -> /proc/self/fd/2

httpd

The official httpd driver changes the httpd application’s configuration to write its normal output directly to /proc/self/fd/1 (which is STDOUT) and its errors to /proc/self/fd/2 (which is STDERR).

View logs for a container or service | Docker Documentation

「/proc/self/fd/1」「/proc/self/fd/2」については上述のnginxの項で出ましたね。
つまり最終的にはここにログを流せば良さそうということになります。

self?

selfというのは自分自身を表す言葉ですが、ここでself示してるのはPIDです。
例に上がっていたnginx,httpの場合selfは何になるのか?ということになりますが
DockerfileのCMDで起動したプロセスのPIDは1になります。つまりselfは1です。

となるとそれぞれ下記にログを転送すればdocker logsにログが出てくれることになります。

  • /proc/1/fd/1
  • /proc/1/fd/2

1というのがPIDであることがわかったので、/proc配下をみてみるとPID毎にディレクトリが切られていることがわかります。
つまりPID毎に標準出力、標準エラー出力を管理していることがわかります。
考えてみれば当然ですね。同じサーバーに複数のクライアントが接続していたとして全てのクライアントに同じ標準出力がでるわけではないので。

複数サービスのログを出したい

ここで最初に触れた1サービス1コンテナの話に戻ります。
1サービス1コンテナがいいことは重々承知ですが、どうしても2サービス動かしたい場合がありました。
その時docker logsに2サービスのログを流すにはどうすればいいかがわかりませんでした。

上述のPID1用の標準出力、標準エラー出力にログを流してあげれば実現できます。

  • /proc/1/fd/1
  • /proc/1/fd/2

PID1問題

ログの問題が解決できたので、複数サービスを起動するシェルスクリプトを作成してDockerコンテナを起動するようにしました。
すると、Dockerコンテナを正常に終了することができなくなりました。

下記事象が原因で発生していると推測できます。

参考

ざっくり理解したのは下記を認識していれば良さそうです。

  • PID1のプロセスがSIGTERMをハンドリングしていなければ正常終了することができない
  • Dockerの場合はTiniを使用すれば回避できる

ThinkRider A1を購入して室内自転車環境とZwift環境構築を試みる

はじめに

新型コロナウイルス感染拡大によるコロナ禍が続いており外出を自粛しなければならない状況が続いています。
不幸中の幸いだったのは、自分のライフスタイルが家に引きこもることを苦としないことだったと思います。

そのため、家に引きこもる事自体は苦痛ではありませんが当然のことながら外に出て運動する機会が激減していますね。


室内での運動となると筋力トレーニングが主になって来ると思いますが、中々継続的に取り組むことができなかったので改善を余儀なくされていました。

そこで、目をつけたのがスピンバイクです。

スピンバイク

スピンバイクに目をつけた理由は、ゲームしていても足は自由だから同時にできるのではないか?ということです。
購入するならば「FITBOX LITE」でした。カートに入れるまではやってます。

まず、大前提として防がなければいけないのは騒音です。
そのため「マグネット制御式負荷」が良く、その中で製品の質が安定してそうなのが「FITBOX LITE」でした。

いざ購入するぞ!となって踏みとどまったのは、購入しても継続できないのでは?という不安が頭をよぎったからです。
スピンバイクは、物理的に中々大きい代物なので使わなくなった時のデメリットは非常に大きいと思います。


継続できるにはどうすればいいかを考えます。答えは1つ。そうゲームです。

Zwift


Zwiftは、インドアサイクリングを行う際各種センサーを用いて自転車からデータを送信してバーチャルサイクリングを楽しめるものです。
見つけた時は、これだと思いましたがネックとなったのは設備投資でした。

インドアサイクリング

自転車があるだけではインドアサイクリングはできません。大きく分けて3つの方法が存在します。

3本ローラー

回転するローラーの上に車輪を乗せて走るタイプですね。

  • メリット
    • やや安価
    • 準備が楽
      • いつもの自転車を3本ローラーの上に乗せて走るだけだと思うので
  • デメリット
    • 落車の危険
      • 3本ローラーの場合は自分でバランスを取りながら走る必要があるので、ゲームに集中しながら走るのは無理そう
    • 騒音
      • 車輪とローラーの摩擦が発生するので物理的に防ぐのは不可能
固定ローラー

[asin:B006JYDIBO:detail]
後輪を固定しローラーを当てて負荷をかけるタイプです。

  • メリット
    • 安価
    • 準備がやや楽
      • 後輪を固定し、ローラーに当てる調整が必要
  • デメリット
    • 騒音
      • ローラーとの摩擦が発生する以上避けられない
    • 摩耗
      • 最近の固定ローラーは改善していってるという話も目にしましたがタイヤの摩耗は発生するようです
ダイレクトドライブ

[asin:B07H54MGFG:detail]
自転車の後輪を外してサイクルトレーナーに直接接続するタイプです。

  • メリット
    • 静音
      • 摩擦が発生しないのでローラー式より静か
    • 自動負荷調整(製品により異なる)
      • 例えばZwiftで上り坂に入ったら重くなったり、下り坂になったら軽くなったり
  • デメリット
    • 高価
    • 準備が手間
      • 外で走行したあと、後輪外して接続してを毎回やるのはきつい

結局騒音を防がなければいけない以上ダイレクトドライブ一択だと思うんですが、何せ高い...上に張ったGARMINのエントリーモデルでも8万円。

ThinkRider A1

[asin:B08PYFBGHX:detail]
そんな時見つけたんです。3万円!のダイレクトドライブ型。
自動負荷調整はないので一定の負荷なんですが、3万円なら全然オッケー!と思い購入。

f:id:arcright:20210827164812j:plain

同梱物

f:id:arcright:20210827174034j:plain

注意点としては、スプロケットが付属していないので自転車から付け替えるのが面倒であれば購入したほうがいいと思います。
[asin:B072MLYG5T:detail]
これは11速。Amazonの記載によるとThinkRider A1は8/9/10/11速に対応しているようです。

スペーサーの付け方でちょっと手こずりましたが比較的簡単に取り付けることができました。
Zwiftも無事使えてます。
f:id:arcright:20210827204635p:plain

騒音も夜間でなければ大丈夫そうな気がしています。

まとめ

散々悩んでいたんですがThinkRider A1を見つけてから2日で環境ができあがってしまいました。
しばらく試してみます!

AWS認定ソリューションアーキテクト アソシエイト合格しました

夏休み最初の関門をどうにかクリア。

前回合格したクラウドプラクティショナーに続き、今回ソリューションアーキテクト アソシエイト(以下SAA)も合格することができた。

  • 前回の記事

今回も前回と同じくピアソンVUEでのオンライン受験。

教材




所感

オンライン試験の手続きに関しては前回経験済みなこともあって戸惑うことなく手続きできた。

試験に合格はしたが、感覚的には薄氷の勝利という印象が強い。

今回3つの教材を準備したが、1つ1つのボリュームがとても多く試験までの準備期間(2週間)では全部終わらなかった。
カリキュラム順序通りにやっていたのである程度知識がある部分も触れながら勉強していたが、限られた時間の中では実務で触れてない部分を重点的にやればもう少し手応えが良かったと思う。

次は、SAAと問題傾向が似ているらしいSysOps アドミニストレーターを受けようと思う。
不合格になることなくいければ合格特典を使って受験料半額で受け続けられるので次も良い結果を得たいところ。