「 Dockerの学習コストは とんでもなく高い が、 Microsoft が今頑張って 学習コスト掘削事業をしてるんで 2年後には よっぽど改善しているだろう……☆」
「 Dockerの使い方、なんて記事を書いている時間は 全部 無駄になるわね」
「 Windows 使いは Docker Desktop for Windows
を入れるところから始めようぜ☆」
「 ところで 先に行っておくが、 Linux 系OS では Docker はすぐ始められるが、
Windows では クソめんどくさいぜ☆」
「 そんな話は聞きたくなかったのよ! さっさと始めましょう!」
「 Get Docker
ボタンを押せばいいんだろ☆
インストーラーは 391 MB か……、ダウンロードに 1分 ぐらいだな☆」
「 何しろ Docker Desktop for Linux系
とか探せばあるかもしれないが 聞かないしな☆
Linux系 Docker勢からは えっ? 今からいったい何を始めようとしているの? とか思われているぜ☆」
「 ↑ はい、出てきた……☆ Hyper-V
という 知らない人は知らないし、知ってる人は知っている 謎の単語だぜ☆」
「 知らない人が 知ることができる説明でなければ こんな記事 要らないのよ!」
「 ↑ 今どきのPCショップで ハードウェア を買ってくれば、 Windows 10 を選んでいれば、 Windows 10 が入ってると思うが……☆」
「 ↑ Hiper-V を有効にすると、1つのハードウェアに 複数の Windows が入っている ふり をしてくれるんだぜ☆」
「 ↑ 家が1つで 燃えてしまうと全部燃えるが、
家が3つなら 1つ燃えても 残りの2つは助かるだろ☆ これを isolation(アイッソレイション;隔離)という☆」
「 ↑ 5人で使ってるPC、1台にOS複数個詰め込めれば 案外 2台で済むんじゃないの☆?
という お金の面をウリにして 普及している面がある☆
大きな顧客を巻き込んだビジネスに育てれば 普及に つながるんだぜ☆」
「 これは 容量だけでなく、CPU が空いてる、とか そういうのも含めているぜ☆」
「 1人で PC いじっている分には ほとんど メリットもない……☆」
「 ↑ Docker も考え方は Hyper-V と似てるんだが、全然違う☆
それは 触って進めていかなければ 退屈だろう☆」
「 Start
ボタンを押したら出てきたこの画面は何なの? リポジトリ―をクローンする って何なの?」
「 そこだよな☆ 言ってしまえば リポジトリ―というのは クローンして使うものなんだが 例を見せてみよう☆」
「 場所が つながれて ネットワークとなっている この時代、
たまに つながりが切れてるときもあるんだぜ☆」
「 そんなとき 今日 1日作業できません、というのでは
コンピューターを使った作業も 仕事にならないわけだぜ☆」
「 ↑ だったら ネットがつながっている間に 作業に必要なものは 自分とこにダウンロードしておいてしまえ、
というのを リポジトリ―のクローン と呼んでいる☆」
「 置き場所、ぐらいの意味しかない☆
言ってしまえば 電気信号で流れてくるものは2進数なんで……☆ それが何かを尋ねるのは愚か☆」
「 さっきの画面には GitHub レポジトリ―と書いていたから、
GitHub の一部を ちょこっと かいつまんで クローンする、ぐらいの把握でいい☆」
「 じゃあ、 GitHubの一部をクローン って言えばいいじゃないの!」
「 リポジトリ―というのは、 パターンについた名前 なんだぜ☆ 物の名前ではない☆
作戦名ぐらいに考えろだぜ☆ リポジトリ―☆ 何のことか分かっただろ☆ 地域の隔絶が起こることに備えてクローンを用意しておく作戦名だぜ☆」
「 で、今の時代、リポジトリ―をクローンするのは 選択ではなく 必須だぜ☆
通信の性能とか、マシンの性能とか 無尽蔵ではないんで☆」
「 ↑ 右側のターミナルを 上にスクロールしてみると、 git
を使って https://github.com/docker/getting-started.git
という場所から、
わたしのコンピューターの getting-started
というディレクトリの中に中身を放り込んだようだな☆」
「 なんで そんなとこに 勝手に入れんの? わたし、許諾してないんだけど!」
「 2020年現在、ユーザー・フォルダーの真下に 勝手にダウンロードされるのは 慣例的なようだぜ☆
機械学習の練習とかしてたら ゴミだらけになるぜ☆」
「 何に使ったのか 記憶から消えてしまったフォルダーとか あるよな☆
消していいやつなのか どうかが 分からない……☆」
「 ↑ まるで コンピューターの中身をカメラで撮って 画像 (イメージ;image)にした、みたいな話のことを言っていて、
ただし、カメラで撮るのではなく ビルド しよう、と言ってるんだぜ☆」
「 ↑ getting-started
リポジトリの中に入ってる docker-compose.yml
と Dockerfile
がビルドの正体で、
料理のレシピのようなものだぜ☆ イメージを作るために 必要な素材と 組み立ての手順が書いてある☆ だから ビルド ☆」
「 ↑ 右のターミナルで Step 16/21
、 Step 17/21
、 Step 18/21
とか出てるやつが Dockerfile を使ったビルドだぜ☆
この Dockerfile を書くという作業は 初見では無理ゲー☆ インターネットで ベスト・プラクティスを探し回らなければ 長い時間を 書き直しに費やすぜ☆」
「 ↑ このイメージが出来てしまえば、他のハードウェアでも そこに Docker Engine
があれば、このイメージが動くというわけだぜ☆
このイメージは 作ってしまえば 変更できない 固い感じのやつだと 思ってくれだぜ☆」
「 その Docker Engine というのは いつ 出てきたの!?」
「 Docker Desktop for Windows
をインストールしたときだぜ☆」
「 ↑ じゃあ Docker Container を走らせようぜ☆?」
「 ↑ 子どもOS用の ドッカ― みたいなもんかだぜ☆
ドッカ―・コンテナの上では OS はもう Windows 10 じゃなくても良くなったぜ☆ Alpine Linux や、 Ubuntu でも OK☆」
「 Linux 系OS はだいたい オープンソース、フリーソフトウェア なんで、 Microsoft が Linux を Windows の上で動かすのは勝手だし、
あとは Microsoft が無料で自由な Windows を配布すれば あとは Linux側が対応するだけだよな☆ 配布しないだろうけど☆」
「 ↑ Docker Container が走っている間は、ブラウザで http://localhost:80/
にアクセスすると 上図右のように
チュートリアルの Webサイト が見れるぜ☆」
「 ↑ ホストOSの Windows 10 が ポート80番 を開けていて、
ゲストOSの Alpine Linux もポート80番 を開けていて、
ホストOSの ポート80番を ゲストOSのポート80番に紐づけることは Docker がやってくれるんだが、それが -p 80:80
オプションだぜ☆」
「 Alpine Linux の中の Webサーバーは なんで勝手に動き出したの?
いつ キッティングして 誰が サーバーを実行したの?」
「 キッティングが終わった状態を Docker イメージ にするんだぜ☆
わたしが知らない OS、 わたしの知らない Python のパッケージ を使われていたんで どうやって getting-started の Webアプリケーションが
実行される流れになっているのか そのコードは分からなかったが、
Docker を Run するタイミングで 実行のための全ステップを終わらせているのは 確かだろうなんだぜ☆」
「 ↑ そして最後に お前の作った Docker image を インターネットの Webサイト にアップロードして 共有しないか、とか聞いてくるが
会社でやったら 大惨事 の始まりだろ☆ 個人なら やってみようぜ☆」
「 ↑ Hub
というのは だいたい データ共有サーバーのことだぜ☆」
「 ↑ なんか チュートリアルを落とさないか 尋ねてるな☆ ダウンロードしとくかだぜ☆」
「 ここまでが、 Docker engine のインストールだぜ☆
ここから先の Docker の使い方を 公式のエグザンプルを元に覚えていくのは 非効率だぜ☆」
「 おや☆? チュートリアルには まだ続きがあるみたいだぜ☆?」
「 なんで お父んが チュートリアルの続きを 知ってないのか……☆?」
「 Dockerコンテナで起動したWebサイトを、ブラウザで開くボタンだぜ☆」
「 ↑ で、 Docker Desktop for Windows
のダッシュボードがこれだぜ☆
知ってる人には シンプルで何をするか すぐ分かる画面だし、
知らない人には なんのコミュニケーションも取れない 分けわからん 画面だぜ☆」
「 じゃあ Docker を知ってから 使えばいいのでは☆?」
「 ↑ 公式ページの Document を見たらいいんじゃないの?」
「 Docker hub
を もっと見たいですか、 Docker Desktop
を もっと見たいですか、 見積りますか
、 始めますか?
の4択だろ☆
わたしは ドッカ―・ハブ が何かも、 ドッカ―・デスクトップ が何かも 知らないんだぜ☆
言ってしまえば ドッカ― を知らない人間が この公式ページで 何をすればいいと言うのだろう☆?」
「 Docker の方から見ても 何しに来たんだこいつ だよな☆」
「 懐の深いWebサイトのように見えて 出口は Docker hub
か Docker Desktop for Windows
の2つしかないんだぜ☆
あんな人を惑わす デザインにして 何を主張してるんだろな☆? Docker hub に登録して Docker Desktop for Windows をダウンロードする1本の
流れにすればいいじゃないか☆? なんで 選択させるんだぜ☆?」
「 人が読もうとしてるのに、Webサイトがさっさと本題を切り出さないのは あってはならない☆
あんな できそこないの公式Webサイトではなく わたしが解説する☆ つぎは CLI ボタンを押してみろだぜ☆」
「 CLI って何なのよ! こんなわけの分からないボタンなんか 押したくないのよ!」
「 Command Line Interface だぜ☆ 気にせず押せ☆!」
「 Alpain Linux に 接続した ターミナルだぜ☆」
「 これが Dockerコンテナの上で動いているゲストOSなの?」
「 hostname
と打鍵して [Enter]
キーを押してみろだぜ☆」
「 いわゆる コンピューター名だぜ☆
だが、ホストOS とは異なる コンピューター名だぜ☆」
「 ↑ docker-entrypoint.sh
とかいうファイルが FHSのトップディレクトリに置いてあるけど、こんなとこに置いてていいの?」
「 チュートリアルだからだろう☆ 目につくところに 置いてあるぜ☆」
「 ↑ この docker-entrypoint.sh
スクリプトは何をしてるの?」
「 ↑ 何をしているかは さっきの Docker の Dashboard から見れるんだが、見ても分からんぜ☆
このチュートリアルは エグザンプルとして 出来がよいのかどうかは 分からないぜ☆
いろんな環境で チュートリアルを動かすためのもので、 模範として参考にされる目的ではないと思う☆」
「 3つ目のボタンは stop
だが、Webサーバーとかに使っている Dockerコンテナ なら、そのサーバーを止めるぜ☆
ついでに 多くの場合、一緒に Docker コンテナ も削除するぜ☆」
「 全部捨てて、Docker イメージを元に Run し直します というルールで縛ることで プログラマーも 状況把握しやすくなるだろ☆
再起動のときの 初期化忘れ について考えなくて済むぜ☆」
「 なんで デスクトップの Docker Desktop
ショートカットをクリックしても Dashboard 出てきてくれないの?」
「 Docker Desktop のデザイナーの頭がイカれてるんで☆」
「 作者の頭がイカれていることにすれば あらゆる問いに 答えることが可能だな☆」
「 ↑ 昨日、 Stop ボタンを押したんで、この四角いアイコンは 灰色だぜ☆
これは プログラムが EXITED
したことを表し、リターン・コードが 0 だったというのも書いてあるな☆」
「 慣習的に 0 は正常終了、それ以外は 異常終了のエラー・コード だぜ☆」
「 ここで、話しを進めるまえに、昨日のことを思い返して欲しい☆」
docker run -d -p 80:80 \
--name docker-tutorial docker101tutorial
「 ↑ これは --name docker-tutorial
というオプションと、スペースで区切られて docker101tutorial
という引数が書いてあると見てほしい☆」
「 ↑ ここで、上図赤丸の中の docker-tutorial
は、 --name
オプション で与えた コンテナID だぜ☆
また、うしろの緑丸の中の docker101tutorial
は DockerイメージID なんで 見分けてくれだぜ☆」
「 ↑ じゃあ、昨日は Stop
だったところに Start
ボタンが できてるんで 押そうぜ☆?」
「 コンテナが削除されたんだぜ☆ 言ってしまえば ハードディスク・クラッシュ を食らったのと同じだぜ☆」
「 何で気軽に ハードディスク・クラッシュ するんだぜ☆?」
「 アナログ時代が デジタル時代に 移項したように、
物理時代から 仮想時代に 移項したのが だいたい 2010年代……☆
わたしたちは その10年分の遅れを 取り返そうとしているところだぜ☆」
「 仮想のOSを ぽんぽこ 産み出して、 使い終わったら ぱっぱか ハードディスク・クラッシュ させればいいの?」
「 2150年、人類は 肉体を ぽんぽこ 産み出して、 使い終わったら ぱっぱか 全身を強く打つ のだった☆」
「 うーむ……、そんな時代だったら 遅れを取り返したくないかな……☆?」
「 もう ワートリ で そんな世界を知ってるんじゃないの?」
「 なぜか イカれた UI デザイナーは ここで手を抜き 言葉で書いてるんだが、
以下のコマンドをコピー&ペーストしてあなたのターミナルで実行したらまた戻ってきてください、と書いてあるぜ☆」
「 なんで イカしたボタン を置かないんだぜ☆! ここに置くべきだろ☆!」
「 ↑ Visual Studio Code の Terminal を使うのが ベスト と思うが、
ここは ひねくれて 今年 バージョン 1.0 がリリースされた Windows Terminal を使ってみよう☆ まあ、同じだぜ☆」
「 ↑ で、今回は Step 1/21、 Step 2/21、……とか出てこないで Pull
するだけだぜ☆
これは 料理するのに比べれば できあいの冷凍食品をチン するような手軽さだぜ☆」
「 従って 文化 なんていう脱皮で捨てた皮が 次から次へと 出てくるのよ。
10000年後には 文化の墓地の余ったスペースで 現代人が生活しているのよ」
「 ↑ 63a49d2296d1403
……、 長ったらしい この羅列は UUID
だぜ☆
知ってる人は知っているし、知らない人は知らない やつだぜ☆」
「 当たる確率が 230京分の1 の宝くじを引いてるんだぜ☆
1億人が1億回 くじ引いても まだ当たらないぐらいだが 10億人が10億回 くじ引くと そろそろ当たるぜ☆
全人類、全世界で UUID 使うと ぶつかるが、自分1人で使う分には 十分 実用的に見過ごせる エラー率 だぜ☆」
「 ↑ コンテナがまた走ってるな☆ CLI ボタンを押してくれだぜ☆」
「 なんで こっから ターミナルに入れるのに、さっきは ターミナルに入るボタンが無かったの!?」
「 Docker の Dashboard は ゲストOS は取り扱えるが ホストOS は取り扱えないんじゃないか☆?」
「 Docker コンテナに X Window System をインストールしたら GUI 出るの?」
「 GUI も出るという話が インターネット上を検索すると出てくるが、わたしのマシンの非力なグラフィック・ボードで そんなことは止めてほしい☆」
「 出ない☆ Microsoft は GUI を抜いて Windows Core とか言っている☆ これからも出ないだろ☆
その根拠としては ユーザーからのクレームが Microsoft に向かう☆ 無料で配られた改造版Windows の サポートするわけがないぜ☆」
「 Red hat enterprise linux は やってるのにな☆」
「 RHEL を使えるユーザーは コンピューター・スキルが高いからだろ☆
コンピューターから Excel を消してしまいました とか言う 対人スキルに全振りした会社の収益の10%ぐらい稼いでくる営業のおっさんとか ターゲット外だろ☆
Windows ユーザーは そこらへんの おっさん も巻き込んでビジネスする☆ ユーザー層の厚みが違う☆」
「 おっさんが ドラッグ&ドロップで どこかに落とした☆
コンピューター・スキルの有る無しなんか 仕事の売上に関わらないんだぜ☆ 売り上げに関わる仕事に就いているかの有無が重要だぜ☆
営業は脳みその中にソフトウェアが入っている☆ スーツ着てずらっと座っている おっさん たちの取り扱いに長けている☆」
「 Docker は だいたい 使い方が 分かったんじゃないの?」
「 ぜんぜん……☆ お前らはまだ Docker の何たるかの 何も見ていない……☆
これから Dockerから受けるストレスで 転げまわるんだぜ☆」
「 Docker を使った 運用 方法など 何も知らないのだから☆」
「 チュートリアルの使い方は分かったぜ、さあ 既存の業務システムを Docker に置き換えよう……、 どうやって☆!?」
「 チュートリアルから 1歩でも 外れた使い方しようとしたら Docker のまだ見ぬ顔 を見ることになるからな☆!」
「 では その Docker の隠された顔 を お見せしよう☆」
「 Disk space サイズ、まだまだ余ってるじゃないか☆ いけるいける☆」
「 だいたい Docker image 作るのに 100 MB としようぜ☆ 10個作れば およそ 1GB だぜ☆
PCの容量って無限にあるんだな、と思って
じわじわ 使い込んで Docker Desktop が起動失敗して気づくんだぜ☆」
「 ちょっと違うものを バンバン ビルド してしまうことだぜ☆」
「 止めなさいよ! メモリとしての活用すらしてないじゃないのよ! ひと口かじるごとに 食べかすを 記念に 履歴にして ため込んでるわけ!?」
「 Docker には このメモリの利用を改善する ベスト・プラクティス が スキル・レベルに応じて 何段階もあって……☆」
「 ステップ毎に Docker image を取り置きながら ビルドしていく作戦 キャッシュ も、
Dockerの隠された顔 メモリが足りません を倒す 手段の1つだぜ☆
この作戦は 選択できるものではなく、 ほぼ必須に選ばなければならない 作戦だぜ☆」
「 さきっちょを変えるだけなら、取り置きの ステップ 2/3 の続きから ビルドを再開できるんだぜ☆
取り残して置かなくていいものは さっさと捨てることができる☆」
「 この キャッシュ を使いこなさないと メモリが足りなくなるし、
使いこなさなかった場合 8時間 かかる作業も 使いこなすと 1時間 で終わるようになる☆」
「 じゃあ ドッカ―の実技に入る前に 知識として習得しておくべきでは☆?」
「 問題に直面して、解決するには、と 行動を変えて得られる知識だろ☆」
「 リボ払い 年利率18% になるまで 使い切る あんた だけよ!
他の人は もっと早く おかしいことに気づくのよ!」
「 お父んのすごいところは 通帳に入っていない 60万 も買い物してしまうことだぜ☆」
「 使っても残高が減らない不思議なカードで 限度額150万まで まだまだ だったからな☆」
「 特技が 複利計算 なんだったら 真っ先に 気づきなさいよ!」
「 お父んに クレジット を持たせるなだぜ☆ 全部 キャッシュ にしろだぜ☆」
「 今 使っているPC も ディスプレイも NAS も ハブ も スピーカーも ペン・タブレット も マウス も リボ払い で買ったものだぜ☆」
「 このキーボード 東プレ REALFORCE は 若い頃に稼いだ金で買ったものだぜ☆」
「 頭の栓が抜けていて 金を持っていると 使ってしまうようだな☆」
「 ↑ ここまでの流れを見ると Dockerfile さえあれば いくらでも Docker container の初期状態までは作れるわけだから、
自分のマシンには Dockerfile を取り置けばいいんだぜ☆
要らなくなれば Image も Container も捨ててしまえばいい☆」
「 ↑ そんなことが できるのも 世界中の誰かが リポジトリをクラウド に上げてるからなんだけどな☆
OSの開発者が やーめた とリポジトリを消せば 世界中で 悲鳴が上がるぜ☆」
「 日本ではできないよな☆ 行政は コンピューター詳しくないんで、リポジトリ持ってるのは 世界中に散らばった小さな 国立大学や 私企業、などなどだぜ☆
郵便も 水道も 自由経済の民間に委託するこの流れで 大きな政府を頂点 とした共産主義は無いぜ☆ 中国ならワンチャン一発ある☆」
「 一次創作の作者の動向を測りながら 二次創作する2000年の00年代みたいねー。
たかだか 1人 の一次創作者をリポジトリとした 二次創作の多発よ。 プログラミングでは リポジトリが たくさんあるのが違いだけど」
「 リポジトリが やーめた といえば みんなで大打撃を受けるのも同じだぜ☆」
「 1950年~2010年頃の 日本の大企業 を除く コンピューター技術者の民間人レベルでの異民族の交流が 人類史の中でも やけに広かったんだぜ☆
5Gへの野望を最後に人類史は 2020年のアメリカから また ダメになる☆」
「 何が コンピューターの歴史を爆発的に進めたのか その瞬間は わたしには特定できないが、
多分 ストリート・ファイターII なんじゃないか☆?」
「 なんでなんだぜ☆! 国内で大量にパクられた スペース・インベーダー でもいいだろ☆!」
「 Tron と Mac をパクった Windows 95 でしょ!」
「 海賊版や 模倣品は ある意味 リポジトリ―はクローンして使うもの という作戦だぜ☆
これが物理の世界では オリジナルへの打撃 になるが、仮想の世界では オリジナルへの支援 になるんだぜ☆
Docker 以後の歴史では構想は オリジナルをコピーして欲しい んだぜ☆ 正しく パラダイム・シフト という言葉を使うケースだぜ☆」
「 リボ払いする人間に 信じるも信じないも無いのよ! 使うのよ!」
「 くそっ☆ 世界中の UIデザイナー の頭はイカれていて、リボ払いする肯定思想を持つ人間をどうやって止めるんだぜ……☆!」
「 ↑ ステップ3 を リリース用 として使って、
それをベースに エディター もキッティングしたステップ4 を開発用に使う、
みたいなことも 重要な キャッシュを活用した作戦だぜ☆」
「 お父んに何を言われても リボ払い に見えてきた☆
そんな話は信じようと信じまいと、使うんだろ☆」
「 ステップ3 と ステップ4 で重複している箇所は、ステップ3を再利用して ステップ4の追加分だけストレージに記憶していると考えてくれだぜ☆
これで メモリは足りません には大きく対応できる☆
知ってるやつは知っているし、知らないやつは知らない この空間では 知っておくことは重要なことだぜ☆」
「 ↑ 朝の9時に業務を開始し、 Dockerfile を書き始めていたら……☆」
「 ↑ 定時の 17:30 に Dockerfile の作成が終わっていないことが 2日や 3日では足りないほど ある☆!」
「 ↑ キッティングのミスした Docker イメージ を作ってしまうからだぜ☆」
「 キッティングを成功させてから Docker イメージ を作ったらよくない?」
easy_install Flask
「 ↑ 例えば Python の easy_install
☆
これは Python の仮想環境 venv を使っているときに Flask をインストールするコマンドなんだが……☆」
pip3 intall flask
「 ↑ 今では pip3 install
を使うのが普通だぜ☆
つまり わたしが身に付けている 環境構築方法は レガシー☆」
「 ↑ リポジトリ―が無かった……、あるいは わたしが見つけられなかったぜ☆」
「 仮想ではないOS の ubuntu では 使えるコマンドも、
Docker コンテナの上で動くゲストOSの ubuntu では 使えないというコマンドに出会う……、Dockerの隠された顔だぜ☆」
「 ↑ わたしは実は 世界とはつながっていなくて、 Docker とだけつながっているのでは、と思っている☆」
「 ホストOS からインストールしたら いいんじゃないの?」
「 ↑ パッケージの依存関係を全部コピーするのは Docker の利点を損なうぜ☆
わたしのローカルPC というのは 家庭内ネットワーク内の外から どこからでもアクセスできるものでは ないからだぜ☆
つまり Dockerfile は無効化する☆
世界中どこにいても 特定のネットワーク内にある リポジトリ―へ アクセスできるからこその クラウド だぜ☆」
「 レガシーの保守に払う労力を得て クラウドの利点を損なうという選択肢は わたしには無いぜ☆
2000年の00年代の日本の大企業なら 利点を損ねても 労力を取るだろうが、成りたくない大人に なろうとしてはいけないぜ☆
無いなら 無いで、
環境構築手順を すべて 新しく見直すのだった☆」
「 ないけど やらないと進まないから Docker ストレス なんだぜ☆
動かして、失敗して、調べて、直して、また動かして
ただ やるだけ という、プログラミング・スキルで差別化できないところだぜ☆
必要なのは Docker運用経験と Docker知識 だぜ☆ どちらもゼロ☆」
「 ハイ・スペック・マン が ただやるだけマン になっていて わらう☆」
「 C#、 Java、 Python、 Go、 いろいろな言語と データベース、
これからは いろいろなものを Docker を見据えて 構築手順を調べておかないと いけないわけだが、
これを 自分で作っている内は それもまた 仕事が 鈍(のろ)くさい……☆」
https://hub.docker.com/search?q=python%20flask%20nginx&type=image
「 ↑ Docker には 既にキッティングしたイメージ のリポジトリがあって、それを使うのが 時短 だぜ☆」
「 ↑ ただ ここで注意するべき点は、 Docker イメージ というのは 空中(n step; 1<n)から始まるのではなく、根っこ(step 1)から始まる という原理だぜ☆
Python だけ欲しい、というのではなく ubuntu に Python を入れたものを欲しい、という感じで 根っこ から付いてくる☆」
「 Ubuntu と Nginx と uWSGI と Python と flask の組み合わせで欲しいときは どうやんの?」
https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask
「 団体が違う製品を集めたイメージに 公式 とか無いんで、 そういのは 個人が 作ってくれている☆
しかし 企業が 知らない外部の個人のイメージを使って 大丈夫か、というのもあるんで イメージの作成は 自分で全部 やってしまっていい気もする☆
というのも 説明の機会があって 質問に答えなければいけないときに
知らない個人のイメージにお任せしています、というのは まあ 通らないぜ☆」
「 実践的には Official なリポジトリから OS を取ってくることが多いだろ☆
このページを見れば ubuntu:20.10
みたいな感じで Docker イメージ をもらえることが 分かるぜ☆」
「 .iso イメージを ローカルにダウンロードしなくていいなんて 楽になったもんだぜ☆」
「 ↑ 企業のシステムというのは PC1台で回っているなんてことはなくて、複数のサーバーが関係しあって1つのシステムを作っているんだぜ☆」
「 そのシステムのサービスを利用するために アカウントとパスワードが必要になることは 慣例的だぜ☆」
「 Webサーバーを立てるにも Linuxユーザーとそのパスワード、
データベースにアクセスするにも、そのデータベースのユーザーとそのパスワード が必要だぜ☆」
「 こういう Docker イメージ の中に パスワードを入れてはいけない☆
会社の外に Docker イメージ を出すことは無いんで問題ない、とか言うエンジニアの話しは 聞くなだぜ☆ 雇い主の指示に従わずに契約違反になって会社を辞めてもいい☆」
「 理由としては コンピューターを使って問題を解決していないからだぜ☆ そいつはその会社に住んでいる☆
わたしたちは会社に住むのではなく 世界のどこにいても そこにコンピューターがあれば通用する コンピューター・スキルを身に付けなければならない☆」
「 ↑ Dockerfile の中に 平文だろうが暗号化してようが パスワード を書くなんてことをやってはいけないし☆、」
「 ↑ Docker image の中に パスワード を書くなんてことをやってはいけないし☆、」
「 言おうと思ってたんだが、お父んの ↑その絵 は ハード・ディスク じゃなくて CD-ROM だよな☆」
「 ↑ 子OS の中に パスワードや、 AWSのcredentialsファイル(盗まれると高額の請求がされてくる) を入れるなんてことは してはいけないぜ☆!」
「 ↑ パスワードを取り扱うソフトウェアは、開発者のローカルPCではなく サーバー・マシン で動かすのが ほぼ必須なんで、
プライベート・ネットワーク内のどこかの ホストOSの上の ゲストOS になるわけだが、
そこに シークレットなものが置いてあるリスク の話しだな☆」
「 Docker がどう働くか知らないが、
同時に予備のバックアップ・マシンが複製されていたり、 仮想マシンは第三者に委託するなどのタイミングで Dockerfile などを渡して
ひゅるーっと パスワードが 第三者のマシンに吸い取られたり、というときに 社外に 秘密のキー があるとかいう マヌケ なことになるぜ☆」
「 このPCに入っているデータは これだけですね、と目録をチェックして 大丈夫だと判断して PC を移動するんだぜ☆
それなのに あのデータにアクセスできなくなった、ということは起こりうる☆
あのPCに そんな用途のデータが含まれているとは思いませんでした、という ヒューマン・ミスは 容易に起こりえるんだぜ☆
そんなことは起こりえない、とか思ってるやつほど ガードが ザル だぜ☆」
「 プログラマーが、ここで確実に止めておくのが、一番セキュアなんだぜ☆」
「 基本的な考え方は、パスワードの取り扱いを 現状から動かさないことだぜ☆」
「 例えば、 AWSの.credentials ファイルは、親OS のこのディレクトリーの中にある、という運用をしているのなら ずっと そのディレクトリーの中にあるべきだし、
それを Docker を扱うためだから、といって ファイルをコピーするようなことをしているなら 振り込め詐欺に引っかかってATMに現金を入れている途中 と自覚しろだぜ☆!」
「 ↑ シークレットなものにアクセスするタイミングとしては、 build
、 run
、 running
の3つが考えられるぜ☆
Dockfile
、 Docker Image
、 Gest OS
の中にシークレットを置いてるやつは論外で☆」
「 Docker を使うからならではの 作業も出てくるんだな☆」
「 で、わたしは先週 ここで 足踏みしているので 解決方法は待てだぜ☆」
「 なんなのよーっ! 解決してから偉そうにしなさいよーっ!」
「 Docker の何が簡単なんだろうな☆? 不思議だぜ☆」
「 魔界じゃなかったら 張り倒すわよ! 化け物の1つでも出てくるんでしょうね!」
「 ↑ ファイルの中身を見ると このように シーケンス(一列)な見た目をしているんだが……☆」
「 ↑ FROM がブロックの先頭になってると思ってくれだぜ☆
そして FROM には、 AS 名前 が付いていたり、付いていなかったりするぜ☆」
「 Dockerfile の構造を 視覚化してくれるエディターが欲しいわねぇ」
「 ↑ そのブロック構造は、 FROM 名前 をつなげることで、ツリー構造になっているぜ☆」
「 ↑ from と as を つなぐと、 AS無しFROM のブロックをスタート地点として
ふたまた に伸びていくツリーが でけたな☆」
「 なぜ こんな 複雑な構造で 在らねばならないのか……☆?」
「 FROM は、 Docker イメージの 底にあるものを指していることを 思い出してくれだぜ☆」
「 ↑ FROM が ブロックの足し算記号 みたいな働きをし、
COPY --from= は、その Docker イメージを ファイルや、ディレクトリーに複製してるわけだぜ☆」
「 これ覚えないと 1時間の作業が 8時間になるんでしょ! 覚えるわよ!」
「 この図をたどってみると node
と python
を入れてるんじゃないかだぜ☆?」
「 2つのものを 入れれてるんだな☆
片方の タグは 12-alpine
、 もう片方のタグは alpine
なんで、タグは勝手に付けれる自己申告制なんだが、 Alpine Linux を使ってるものと思うぜ☆」
「 その2つの Alpine Linux は、まったく同一なのかだぜ☆?」
「 どのイメージも すべて 同じ OS のはずだぜ☆ 根っこは同じなら キャッシュ で飛ばす、という 原理 なのだから☆」
「 一番底にある OS のリポジトリ―が やーめた したら 大惨事にならない?」
「 ↑ じゃあ 残りを見ていくかだぜ☆
先頭に WORKDIR /app
と書いてあるな☆」
# WORKDIR /app と多分、同等
mkdir /app
cd /app
「 Linux で、特に何も指定しなければ、root ユーザーで FHSのトップ・ディレクトリに居ると思ってくれだぜ☆
そこに app ディレクトリを作って、その中にカレント・ディレクトリを移動するんだぜ☆」
「 相対パスを書くと、前の WORKDIR から見た相対パスになるぜ☆」
http://docs.docker.jp/engine/reference/builder.html
「 ↑ 細かな説明は 公式のドキュメントを当たってくれだぜ☆」
「 ↑ COPY は、複数の移動元と、1つの移動先 だぜ☆
WinSCP 使わなくても送信できるぜ、楽だぜ~☆」
「 ↑ 移動元のカレント・ディレクトリは build コマンドを打ったときのカレント・ディレクトリだったかな……☆?
調べても 分からないぜ☆ 打てば分かるだろ……☆」
「 ↑ RUN なんだが、 コンテナの run や running とは何の関係もないぜ☆
単に Linux のコマンドラインを打ち込む、ぐらいの意味しかないぜ☆」
「 今は Docker image を作っている build のフェーズなのだから、
だったら BUILD とかにしてくれればいいのに RUN だぜ☆」
「 ↑ 今まで 書き忘れていたんだが、キャッシュは コマンド単位で取られるんだぜ☆」
「 忘れンな! キャッシュ作戦の印象が だいぶ変わるじゃない!」
「 ここは ワン・セット で、というところは && でつなげておく 必要 があるわけだぜ☆
中途半端にキャッシュが残ると意味が変わってしまうところで 忘れるなだぜ☆」
「 ウーン☆ Dockerfile の書き方も 分かったかな……☆」
「 ↑ Docker のネーミング・センスが イマイチだと思うんだが……☆」
「 ↑ この動線は run ではなくて new アンド run
だと思う☆」
「 Docker コンテナを run するんだから、合ってるんじゃないか☆?」
「 使い方は Webサーバーとは限らないのだから、 きふわらべちゃんの Dockerコンテナをrunする の説の方が勝ちよ!」
「 この run では、構築後の ゲストOS で1つだけ 叩くコマンド を指定できるんだぜ☆」
「 build のフェーズでも 山ほど RUN してなかった?」
「 はっきりした言葉で 公式に書かれていないんだが、恐らく……☆」
「 この build フェーズで行っているのは、ファイル・システム なのではないか、
そのとき実行されていた プロセス は 含まれていないのではないか、ということだぜ☆」
「 ドライブ が書き込まれるな☆ ファイル・システム の写しだぜ☆」
「 じゃあ プロセスなんか Dockerイメージに 書き込まれないのでは☆?」
「 したがって、 build のフェーズで Webサーバーを起動しても、イメージには Webサーバーが起動していることは 書き込まれないわけだぜ☆」
「 ビデオを ポーズするのとは違うわけだぜ☆
今どきでいうなら、動画を一時停止するのとは違うわけだぜ☆」
「 build は、ゲストOSを動かして RUN してファイル・システムをデプロイし、すべてのコマンドが終わった時点の ドライブを Dockerイメージ として焼き付けることで、
run は Dockerコンテナを起動し、その上で走っている ゲストOSで コマンドを1つ打つことができる、
この違いを はっきり認識することが重要だぜ☆」
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]
「 ↑ は、run するときに使われるが、 build するときは 覚えておくだけで まだ使わないんだぜ☆」
mkdocs serve -a 0.0.0.0:8000
「 ↑ run したときに、打ち込まれるコマンドかのように振る舞う んだぜ☆」
「 なんで 角括弧で囲んだり、ダブルクォーテーションで囲って カンマ区切り にするんだぜ☆?
なんで そのまま 書かないんだぜ☆?」
docker run -d -p 80:80 --name docker-tutorial docker101tutorial
「 ↑ run コマンドは こんな見た目をしてるんだが、見やすくするために オプション を省いてみようぜ☆」
docker run docker101tutorial
「 ↑ こう書くだけで Dockerコンテナは走り、その上に docker101tutorial
イメージを元にゲストOSが復元されるわけだが……☆」
docker run docker101tutorial mkdocs serve -a 0.0.0.0:8000
「 ↑ CMD で指定したものは run コマンドの末尾に デフォルト値として付くと思ってくれだぜ☆」
docker run docker101tutorial mkdocs serve -a 0.0.0.0:8000
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
「 で、本当のところ、 run コマンドの イメージ名の後ろに書かれたコマンドラインが、ゲストOS起動時に1回だけ実行される、というのが 原理 だぜ☆」
「 ↑ だから こういう CMD 命令を見かけたら、 run コマンドの末尾に付く デフォルト引数、ぐらいの感覚でいてくれだぜ☆
書き方が 独特だが、 引数に半角スペースが付いていても対応できるんだぜ☆」
「 その他に もう1つだけ、ゲストOS起動時に1回だけ実行される コマンドがある☆」
ENTRYPOINT["docker_entrypoint.sh"]
「 ↑ ENTRYPOINT だぜ☆ 書き方は CMD と同じだが、働きが異なる☆」
ENTRYPOINT["entry_a", "entry_b"]
CMD ["cmd_a", "cmd_b"]
「 ↑ そして ENTRYPOINT と CMD の両方を使うと多分……☆、」
entry_a entry_b cmd_a cmd_b
「 ↑ CMD の方は、 ENTRYPOINT の引数になる☆」
「 ENTRYPOINT と CMD のどちらも Dockerfile になかったなら、エラーになる☆」
「 さあ……☆ 詳しくは 公式のドキュメントを当たってくれだぜ☆」
「 使い分け方の分からない 似たようなコマンドは どっち使えばいいのか 気になるのよねーっ!」
「 もし ゲストOS起動時に シェル・スクリプトを叩きたいだけなら ENTRYPOINT の方を使えだぜ☆」
「 まだまだ 途中だが 日付も変わったんで ここまでだぜ☆
次があるのなら Docker を少しは 使いこなしておきたいものだぜ☆」
「 そういえば Docker の何が 分けわからないのか その深淵に入ってないな……☆
ここから さあ 既存システムを Docker に移行していくのを 実践するぞ、というところなんだぜ☆」
「 Docker の何が分けわからんかというと、 Dockerが分けわからん ことと、 Dockerはちょっと分かったが、どう運用すればいいのか分けわからん
の 2方向からの爆撃を受けていて わたしの戦闘機は墜落していく……、という感覚を味わうと思う☆」
「 その Dockerはちょっと分かった が錯覚で、本当は Dockerを間違えて把握している から どう運用すればいいのか分からん が導かれているのではないの?
Dockerが分けわからん 状態を先にクリアーできないの?」
「 初見では無理だと思う☆ わたしたちの原理 と、 Dockerの原理 に ずれ がある☆ それを各個撃破しよう☆」
「 ↑ ちなみに わたしが Docker 分けわからん と言っている内容は インターネット上の記事をサーフィンすれば既出だぜ☆」
「 じゃあ ネット上で 知識を溜め込んでから Docker を触ればいいのでは☆?」
「 Docker の魔界を歩きながら叫んでいる言葉は エグザンプルが少ない だぜ☆
Docker を覚えたいのではなく、 わたしの周りにある既存のシステムを Docker に移行したい んだぜ☆」
「 Dockerを覚えないといけない んじゃないの? そのステップを飛ばすから 魔界 に入るんじゃないの?」
「 わたしの思っているDocker と、 Docker と、違うんだぜ☆ アンジャッシュのすれ違いコント の状態で記事を読み続けることになる☆
Dockerは 間違ったブランド・イメージ を確立しやすいアフォーダンスを外に向けている と思う☆」
「 Docker に 既存システムを載せようとすることが 間違いなのでは☆?
システム改修は発生し、
システムの リプレース、および マイグレーション が必要なのでは☆?」
「 じゃあ Docker の記事って、 これから新規システムを一から作る人 が読むのかだぜ☆?」
「 じゃあ、 Docker界隈の人って、一からシステムを作り直す前提で 盛り上がってんの?」
「 Dockerの 仮想化 に対応していない OS依存のプログラムとか、 Dockerの 仮想化から見れば みんな レガシー になるのかだぜ☆?」
「 レガシーというより、非仮想プログラム なだけだろ☆
Z3 や ENIAC も みんな そうだぜ☆
本体は Docker に乗らないだろうが、エミュレーターなら乗ることはできるだろう☆」
「 2150年に仮想化した人類は 現代の人類と 同一と言えるのかしら?」
「 別だろ☆ 仮想、人類 だぜ☆
人体を捨てて 仮想空間の中で 出産しろだぜ☆」
「 してるよな☆ お前ら課金で☆ セカンド・ワールドに接続してしまえば、あとは本体を消せば仮想化 完成だぜ☆」
「 世界中のデジタル的財産が Docker に独占されないの?」
「 Docker はオープンソースだしな☆ Docker は Go 言語で書かれているが これも BSD ライセンスなんで、
何かが独占しているという状態ではない☆」
「 C++ 勢も Docker に移行できているという記事もあるし、
環境構築してしまえば 既存コードも マイグレーションできるのでは☆?」
「 仮想環境上で動いているものを、仮想を剥がして Docker 上で再構築したり
古いバージョンのパッケージが無いものを 新しいものに置き換えたり 1個、1個 やってきゃいいんだろ☆
百歩譲って それを 簡単 と言う としよう☆」
「 起動から 1度もアップデートしていない プログラム とか いっぱいあって 楽しそうね!」
「 プログラムできる人はいっぱい 居るが、 メンテナンスしてる人は あんまり いないからな☆
拭かれたい尻があれば突き出せだぜ☆ わたしが拭いてやろう☆」
「 Docker を使わない人からすれば、 Docker にするというのが 勝手な話しなのでは☆?」
「 1995年から2000年00年代の会社に住んでいた人たちは 会社と一緒に滑り降りてガラパゴス村を形成した☆ その村の中で うまく回している☆
Docker や機械学習、プログラム言語を先導している GAFA と M もどうなるか 知らんぜ☆
人類に 欲求 や 不足 があるからこそ 需要 が在るんだぜ☆ あくまで コスト削減や それを利便にするのは 手段だぜ☆
遠くに置く目標設定と、面白い 課題 が必要☆」
「 日本企業のお偉いさんって サスティナブルとか 節約とか ただ生かすだけ のことしか言わなくない? 生きてはいるけど やりたいことは無いのよ」
「 回すんだろ☆ 経済を ぐるぐる☆ まあ、血液も モーターも 回ってるしな☆ 重要なんじゃないかな☆」
「 百歩譲って それを 重要 と言う としよう☆ 重要なことだけ やってろだぜ☆
もらっている金以上の 重要なことをしてはいけないぜ☆
わたしたちは 回っている経済の上で 軽快 にコンピューター・スキルを身に付けようぜ☆」
「 Visual Studio Code などのエディターを使って Dockerfile のエクステンションを入れると Dockerfile のインストラクションに色付けてくれて見やすいんだが、
ちょっと見てみようぜ☆」
「 ↑ この インストラクション が 1つ読み込まれるたびに、
Docker コンテナは起動し、ゲストOSが起動し、コマンドラインは実行され、ゲストOSは終了し、Docker コンテナは終了する 原理 があるらしいぜ☆」
「 その 原理 は 何に働きを及ぼして どのような結果を導いているの?」
「 Docker イメージに もろに影響を与えているぜ☆ それは結果の違いとなって現れる☆」
「 しかし エグザンプル には ヘマした例 は書いてない んだよな☆
こういう書き方をしてはいけない、というのを 避けているので 知らずに わたしたちは ヘマをする んだぜ☆」
cd /usr/local
mkdir www
「 例えば ターミナルを使う分には カレント・ディレクトリ を移動してから、そこにディレクトリを作ろう、というふうに
一連の動作は 少しずつ やってもいいわけだが……☆」
WORKDIR /usr/local/www
「 ↑ Dockerfile に書くときは、一連の動作を インストラクション1つでやる 必要 があるぜ☆
何しろ イントラクション が1つ終わるたびに ゲストOS を終了させられてしまうからな☆」
「 ディレクトリー1つ作るたびに OSを終了するなんて 頭イカれてんじゃないの?」
「 節約し、経済を回し、重要なことをするのは 時間が連続している物理空間 だけにしてくれだぜ☆
仮想空間では システムに1つ変更を加えるごとに OSを再起動し、前後の操作と関連を持たず 現在の仮想ディスクの状態とだけ関連を持ち、一から手順を再開しろだぜ☆」
https://docs.docker.com/engine/reference/builder/
「 ↑ で、公式のドキュメントを読むと この原理には 抜け道が開いている☆ WORKDIR
と USER
だぜ☆」
「 WORKDIR
は うしろの RUN
、 CMD
、 ENTRYPOINT
、 COPY
、 ADD
に影響するらしいぜ☆」
「 現在のディスクの状態と、WORKDIR の状態 とだけ関連を持ち……、という風に原理を修正しないといけないな☆」
「 さらに WORKDIR で相対パスを書いたら、前の パス を引き継いだ相対パス になるとのことだぜ☆」
USER muzudho
「 USER も、 RUN、 CMD、 ENTRYPOINT に影響を与えるぜ☆」
「 USER って何やってんの? su muzudho
してんの?」
「 そういう 実装 の話しは 公式に載ってないんで、使ってみて 思った通りの動きをしているか ケースごとに調べろだぜ☆
実行ユーザー を変えているとは思うんだが☆ 使い込んでないんで 使い道は 知らないぜ☆」
「 まだ シークレット の取り扱いを心得ていないので 機密情報を取り扱った エグザンプルは見せれないが、
そうではないもので 1つ例を 作ってみようぜ☆?」
「 NodeJS / React / TypeScript で将棋の盤が出てくる Webサイト を作ったらいいんじゃないの?」
「 さらに Docker にクビを突っ込み、魔界が広がった……☆」
「 なんで お父んは 魔界に入ってしまうんだろうな☆? 他の人は Docker に入るだろ☆?」
「 ふつうの人には考えられないような 使い方してんじゃないの?」
「 全部 Docker の上に 載せないといけないんじゃないか☆?」
「 データベースも Docker に乗っけたら いいんじゃないの?」
「 既存の知見が 役に立たないので わたしのことは 会社に就職して2週間目の新人 ぐらいのやつだと思ってくれだぜ☆」
「 エラーメッセージは 404 File Not Found
で、 uWSGI のログを見ても HARAKIRI
でタイムアウトしたことぐらいしか分からない……☆」
robpco/docker-nginx-uwsgi-flask-mssql
「 ↑ 似たようなことをやっているやつがいるが、やり方が全然違う☆」
「 development モードで 内部情報バンバン 表示するか……☆」
「 収穫無いのも マヌケなんで Dockerイメージを錬成している間に 調べていたことを書くかだぜ☆」
「 Docker のマウントは、いつか使うかもしれないしな☆」
「 ただ、わたしは Docker の blog記事で使われている、 Dockerの言うボリュームは、ボリュームではないのではないか という違和感がある☆
それを説明したい☆」
「 前に描いた絵だが、この中から デバイス を選んでくれだぜ☆」
「 CPU が ドライバ を通して認識できたら デバイス だろう☆
この定義では CPU自体 はデバイスではないことになるな☆」
「 CPU と デバイス をつなぐのが ケーブル なんで、 デバイス に含めたくないぜ☆」
「 デバイス と ドライバ はこんなもんでいいだろ……☆ 迷う要素は そんなに深刻ではないぜ☆」
「 ↑ さっきの絵の中では Hard Disk Drive しかないな☆ ほんとは 種類多いんだけど☆」
「 ディスク(Disc) は円盤で、ディスク(Disc)が入ってるケースが ディスク(Disk) で、
メディア は 記憶している物理的なものを言っていて、 ドライブ は 回転するメディアを入れる感じのストレージだぜ☆」
「 ↑ で、昔は A ドライブ と B ドライブ があって、ここに フロッピーディスク(Floppy disk) を入れて 起動していたわけだぜ☆
内蔵ハードディスクとか、 C ドライブ とかまだない☆」
「 ↑ disc が入っている disk を drive に差し込んで回るんだぜ☆ カンペキだぜ☆」
「 メディアの差込口だぜ☆ 中で ディスク(disk)のフタが パカッと開いて シュイン・シュイン・シュインとか音が鳴って
ディスク(disk)の中に入っている円盤(disc)が なんか回ってるぜ☆」
「 ↑ で、後に 内蔵の外部記憶装置 とかいう名前の矛盾してるやつが出てくるんだぜ☆ Hard Disk Drive だぜ☆
閉じた箱になっていて、穴は開いてない☆ 3番目のドライブだから C ドライブ ☆」
C:\Users\むずでょ
「 ↑ Windows では c:\ という ドライブ・レター をよく見かけると思うが、昔、 C ドライブのハードディスクに OS が入ってたからだぜ☆」
「 Linuxディストリビューションには ドライブ・レター 無いのよね~」
「 コンピューターはどうあるべき、と未来を創る立場なら ドライブ・レター なんか無くていい、と思うんだが、こういう歴史的経緯で ずっと残ってるんだぜ☆
フロッピー・ディスクは いつ不要になるか? とか くだらないことばかり 長い時間をかけて 切り捨てたが、 C ドライブは残った☆」
「 CドライブにWindows が入っている前提で プログラム組まれてるから 修正できないぜ☆」
「 ↑ 30年ぐらい前、わたしが 小学生ぐらいの頃は 磁気テープ にデータを記録していて、
こいつは くるくる巻かれていたんだが……☆ ↑ こんな剥き出しのやつじゃないが分かりやすいく絵に描いている☆」
「 ↑ 『ダメだ、もう入らね……』となったときに vol.1(ボル1)、 vol.2(ボル2)、 vol.3(ボル3) と増やしていくんだぜ☆
漫画の1巻、2巻、3巻 という助数詞と同じだぜ☆」
「 ↑ 巻物の助数詞が 1巻、2巻……、なんで、そこから来ていると思うぜ☆」
「 ↑ 音楽でよく言う 音のボリュームも、さいしょは つまみ だったのではないかと わたしは考えている☆」
「 2010年以降 よく見かけるようになった わたしの考えた最強の語源 シリーズよね。
あんた いつから ウソつきの仲間になったの?」
「 ↑ 音量のことを Volume と呼ぶように 言葉が変わったせいで 形を失ったと 思わないかだぜ☆?」
「 形なんか 要らんのに……☆? 古いものを残したがる うるさい おっさん かだぜ☆?」
「 将棋の棋士が 正座を止めないように、わたしも ボリュームは 巻くのを止めないからな☆!」
「 じゃあ、Docker が言う ボリューム が、巻いているかどうか 確認しようかだぜ☆!」
docker volume create todo-db
「 ↑ Docker の公式チュートリアルで 最初に出てくる ボリューム は これかだぜ☆」
「 ↑ ターミナルなら どこでもいいから 実行してみようぜ☆?」
「 ↑ マンガの巻数の方の意味で、ボリュームを作ったんだろ☆
C ドライブの中を検索しても todo-db
というディレクトリーは見つからないことから、 Docker engine の管理下の仮想空間に作られてんじゃないか☆?」
「 /var/lib
……、と書いてあるから、 Docker engine の中は FHS なのかだぜ☆?」
「 もともと Docker は Linuxディストリビューションの方から出てきたものだろうしな☆ FHS なんじゃないか☆?」
「 ↑ じゃあ ボリューム が置いてあるのは ここらへんかだぜ☆?」
「 多分……☆ それも /var/lib/docker/volumes/todo-db/_data
というパスで 置いてあると推測するぜ☆」
「 Windows なら、CPU は A ~ Z のドライブが 自分の周辺に ぶら下がってると思ってるんだぜ☆
C は固定だけど……☆
この A ~ Z を ストレージの頭にベタっと押し付けてやるのが マウント だぜ☆」
「 Linuxディストリビューションなら、 /bin
、 /usr
、 /home
とか そんなやつがトップにいる FHS なんで、
ドライブ・レターではなく ディレクトリーで マウント できるわけだぜ☆」
「 Windows でも ディレクトリーで マウント できるんじゃないか☆?」
「 で、マウントされる方と言えば ドライブ や ボリューム だぜ☆」
「 そのあと、アルファベット順の住所録や 団体の役員をディレクトリーと呼ぶようになったあと……☆」
「 ↑ 今では ファイルを置いてる場所を ディレクトリー と呼んでるぜ☆」
「 ドライブ・レターで、ボリュームをマウントする、ディレクトリーで、ドライブをマウントする、
ディレクトリーで、ボリュームをマウントする、 ディレクトリーで、ディレクトリーをマウントする という感じをつかめだぜ☆」
「 さらに Docker では、 マウントをバインドする、 という概念があるぜ☆ 今ではこれが推奨らしい☆」
「 多分、 ゲストOSのディレクトリーの下位に、ホストOSのディレクトリーの下位 を マウントする ことではないかと予想しているんだが、
まだ調べ中だぜ☆」
「 その他に、メモリ上に マウントするやつがあるらしいぜ☆」
「 こっから ネットワークも含めた話をしなければいけない☆ 少しずつ解説しよう☆」
「 仕事のネットワークは こういう感じで 家からデータセンターにつながってるわけだぜ☆
ちなみに データセンターは地図には載っていない☆」
「 つながっていない☆
ネットワークから見れば 文房具と 机が置いてあるぐらいの ただの箱だぜ☆」
「 チーム・メンバーは インターネットに つながってるだけだぜ☆」
「 もう少し詳しく見ると、インターネットに直つなぎしている豪快なやつはいなくて、
インターネットにつながっている LAN につながっているんだぜ☆
端っこを LAN とか WAN に挟まれているから、ネットの内側、 インターネット だぜ☆」
「 ネットは 自由に見えて 電気通信事業者が持ってんのねぇ。
電気通信事業者が反乱したら ネット使えなくない?」
「 使えないんじゃないか☆? 特に電線持ってる一番でかい会社を キャリア―(伝搬する者) と呼び、
NTT、KDDI、ソフトバンク、楽天 とかがある☆」
「 NTTに逆らったらネットにつながらなくなるとか無いの?」
「 なぜか みんな 今はまだ 法律を守ってるんだろ☆ 不思議だよな☆ 自由経済が回ってるんだろ……☆
そのうち みんなで 斧もって 暴れ出すぜ☆」
「 そして もっと細かくみると、LANの出口辺りに ルーター というマシンがいる☆
その内側は プライベート・ネットワーク だぜ☆」
「 それは ルーターの主な仕事ではないんで……☆
ユーザー名や パスワードを聞いてくるのは PCの中の サーバー・プログラムのプロセスなんで☆
ここはどこで、どこから来たやつか ルーティングするのが仕事なんで☆」
「 そもそも 基幹業務システムを 会社が自分で持ってなくて、別会社のクラウド商品をレンタルしてるかも知らんよな☆」
「 その別会社が 事業を やーめたっ って言ったらどうすんの?」
「 契約書で ほっぺた をパチパチ するんじゃないか☆?
商売が回ってるのって 法律 のおかげだからな☆
逆に言うと 海外の企業から見れば 法律が整備 されているところは魅力的だよな☆
逆に 海外に儲けを吸い取られたくなければ 近寄りがたいほど ルールをぐちゃぐちゃ にしろだぜ☆」
「 じゃあ テクノロジーなんか発展したところで 商売にならんだろ☆ 法律 が無ければ☆」
「 そうそう……☆ プログラマーは無力☆ 法律が必要☆
電力は ネットワークも 法律も無ければ プログラマーは 役立たずの ウンコたれ……☆」
「 流れてくる電気を お絵かきソフトや 映像に変換するぐらいだよな☆ 錬金術師の電気版だぜ☆
大事なのは それを成し遂げると全体の数10%か、もっとそれ以上に利くでかい効果があること を実現することだぜ☆
電気の仕事量の延長線上ではない 質的転換 を起こせだぜ☆」
「 プログラマーって そんなこと期待されて 募集されてないだろ☆ 下っ端だぜ☆」
「 プログラマーは 対コンピューターに特化した バフなんだよな☆
本人はウンコたれだが 周りにコンピューターがいっぱいある現代社会では プログラマーがいじることで
コンピューターが 仕事をうまく こなすようになるんだぜ☆
仕事のコンピューター化を しておいてくれないと、あんま やることない☆」
「 で、 キャリア― は VPN(バーチャル・プライベート・ネットワーク) という商売をしていて、
線を分けたり、暗号化してるから 情報は 漏れにくいですよ、と みんな信じて 使ってるんだぜ☆」
「 信じているというより 契約と法律で縛ってるから 使えるんでしょ」
「 不思議な話だが、 VPN は、インターネットにまで 出てきているが、まるで LAN の中にいるように使えるんだぜ☆
だから リモートワーク とかしても 会社の業務システムの中に入れるわけだな☆」
「 そして さらに ネットワークの深い所の説明までしないと、 Docker の分からないところは 分からない☆
Docker が分からないというより、 ネットワークの知識の中で Docker はどう振る舞うかが分からないんだぜ☆ 見ていこう☆」
「 インターネットには ICANN とか、 NIC という団体も ぶらさがっていて、
こいつらが .com とか、 .co.jp といったドメインを管理している☆」
「 ICANN や NIC が反乱起こしたら インターネット使えなくならない?」
「 なる☆ ブラウザ開いたら Not Found☆ こういう団体が反乱起こさないのは なぜだか知らないが
会社の ドメインとして例えば example.com を買ったとしよう☆」
「 ↑ じゃあ ルーターに 名前が付いたみたいに なるんだぜ☆
これで インターネットのどこからでも example.com でこのルーターのところまでアクセスできるな☆」
「 会社のメンバーは 自分とこのプライベート・ネットワークに入るのに わざわざ .example.com を経由して入るわけか?」
「 いや、物理的に みんな 業務システムの外にいるわけだが、
ネットワーク上では .example.com の中にいるように振る舞う☆
仮想のプライベート・ネットワーク、VPN だぜ☆」
「 ↑ Docker コンテナ は、パソコンが1台増えた、ぐらいに考えていい☆
では こいつら、ネットワーク上の どこに 居んの?」
「 お父んのパソコンの中に居るんだから、外から見れば お父んのパソコンまでしか見えないだろ☆」
「 Docker で仮想化して喜んでいる人たちは Dockerコンテナに外からアクセスできてないのかだぜ☆?」
「 Dockerコンテナの外側のホストまでは見えるんでしょ」
「 ↑ 例えば 上図のようなのを 同一ホスト上のDockerコンテナたち と呼ぶ☆」
「 もちろん マルチホスト上のDockerコンテナたち の間で通信したいことも出てくるぜ☆」
「 ↑ そして 仮想のホストから、リアルのホスト へ通信したいことも出てくるぜ☆
このとき 思わぬことが起こったんだぜ☆」
「 ↑ マシンには名前(コンピューター名)が付いていると思っていいんだが、
上図で言うと、 Bob から Charley が見えないんだぜ☆
Bob は Alice の中にぶら下がっている Charley がないか探してしまう☆」
docker run --name Bob --dns-search example.com
「 ↑ そういうときは --dns-search example.com
と付けると、
example.com
からは Charley
はどのマシンのことか見えてるんで、 Bob
にも Charlery
が見えるようになるぜ☆」
「 ここらへんの設定ができなければ、商売の実践で使えないぜ☆
Docker で 楽々 環境構築 とか言ってる連中の頭が どうしてるのか分からない☆」
「 なんでわたしが……☆ Docker の公式が GettingStarted
で説明してくれたらいいのに……☆」
<書きかけ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!