‫この講義の要件は､ 以前の講義でコンテナの起動方法を知っていることです｡
‫容器の中の様子を外から見るという話は､ 前回の講義で終わったばかりです｡
‫これは､ コンテナの中に入って中をいじるというものです｡ 使えるコマンドはいくつかあるんだ｡
‫1つ目は､ コンテナランに-itをつけたものです｡
‫実際にコンテナ内のシェルを取得するために､ -itがどのように機能するかについて説明します｡
‫それから､ セカンドプロセスを走らせたいコンテナの実行には､ コンテナエグゼを使うこともできますので､
‫その例をいくつか紹介します｡
‫そして､ その途中で､ Ubuntuのような通常のLinuxディストリビューションと､ 仮想マシンにインストールする場合とハードウェアにインストールする場合の違いについて､
‫実際に触れてみたいと思います｡
‫そして､ それらのLinuxディストロがコンテナの中でどうなっているのか｡
‫さっそく始めてみましょう｡
‫外から容器を覗くというのは､ 時としてとても便利なものです｡
‫でも､ よく聞かれるのが､ コンテナに入ってコマンドラインから実際に操作するにはどうしたらいいのか､
‫ということです｡
‫時々､ これをコンテナ内にSSHサーバーを設置してsshでアクセスすることと混同している人がいます｡
‫しかし､ 実際にはその必要はありません｡ なぜなら､ コンテナの実行中にコンテナ自体の内部にシェルを取得するためのコマンドがいくつか用意されているからです｡
‫1つ目は､ docker container runコマンドだけです｡
‫しかし､ 我々はいくつかの余分なオプションを指定するつもりです｡
‫ーイトを行う｡
‫この「-it」は､ 実際には2つの別々のオプションです｡
‫ヘルプを見ると､ tは疑似ttyやsshと同じようなプロンプトを表示することが分かります｡
‫さらにiまでスクロールすると､ そのセッションを開いたままにして､
‫さらにコマンドを実行できるようになります｡
‫dockerコンテナでrun -itして､ 別のnginxを実行すると｡ プロキシと呼ぼう｡
‫そうすると､ 代替のコマンドを指定することになりますね｡
‫このセクションの冒頭で､ dockerコマンドラインのフォーマットについて説明しましたが､
‫dockerコンテナの実行時には､ ヘルプを見ればわかるように､ この最後の､ イメージの後に､ オプションのコマンドと引数があり､
‫これから開始する新しいコンテナに何を実行するか指示することができます｡
‫この画像には､
‫後で設定方法を見ることになるデフォルトのコマンドが含まれています｡
‫しかし､ 起動時に実行される内容を変更したい場合は､ 実行ラインから直接変更することができます｡
‫Bashとだけ言っておこう｡ というのも､ Bashは普段からよく見かける貝殻の一つで､ その貝殻を使った作業ができるようになる容器だからです｡
‫あれを見てください｡ プロンプトの中に入っています｡
‫プロンプトにrootと表示されていますが､ これはコンテナを起動したときのユーザーです｡ 実際にはホストのrootになったわけではありません｡
‫これは､ 私がコンテナ上でrootとして動作していることを意味します｡
‫その後ろの数字が､ 実はコンテナIDなんです｡
‫ls -alを実行すると､ 現在いる場所のすべてのリストが表示されます｡
‫そして､ コンテナ内のファイルシステムのルートパスにいることがわかります｡
‫実際にNginxのイメージをベースにしたコンテナ内のすべてのファイルを見ています｡
‫ここから設定ファイルを変更したり､ インターネットからパッケージをダウンロードしたり､
‫通常のシェルから行うような一般的な管理作業を行うことができます｡
‫終了したらシェルから出るために､ 他のシェルと同じようにexitと入力します｡ これでそのコンテナは停止しました｡
‫実際にドッカーコンテナのlsをやっても､ そこには表示されないでしょう｡
‫プロキシと呼んだことを思い出してください｡
‫だから､ -aをする必要があったんです｡
‫そして､ そこにあるのは では､ 実行されたコマンドをご覧ください｡ Nginxコンテナのデフォルトのコマンドは､ Nginxのプログラムそのものを実行するものです｡
‫しかし､ 最後のコマンドを入力したときに､ このデフォルトのプログラムを実際にBashに変更し､
‫シェルを作成しました｡ シェルを抜けると､ コンテナは停止した｡ なぜなら､ コンテナsは起動時に実行したコマンドが実行されている間だけ実行されるからです｡
‫Bashに変更したので､
‫Bashを終了させるだけで終了します｡
‫さて､ 実際にNginxをやるのではなく､ Linuxのフルディストリビューションを使った場合はどうでしょう｡ フルUbuntuをやってみよう｡
‫実際にUbuntuのイメージをダウンロードし､ この新しいコンテナのプロンプトに私を配置することになります｡
‫Ubuntuを使ったことがある人なら､ aptパッケージマネージャをご存知でしょう｡
‫だから､ ここでそれを使うことができるんです｡ 標準的なUbuntuのサーバーでやるのと同じようにね｡ 実際に何かインストールすることができた
‫apt-get install
‫-y curl.
‫コンテナ内のUbuntuや他のディストリビューションについて言えることは､ 通常､ 非常にミニマルであるということです｡
‫ライブCDやダウンロードしたUbuntuのISOは､ 通常仮想マシンにインストールされますが､ Ubuntuコンテナは､
‫aptパッケージマネージャでいつでもソフトウェアを追加できるUbuntuの非常に最小限のバージョンであり､
‫デフォルトでより多くのソフトウェアがインストールされています｡
‫これで､ この実行中のコンテナにはcurlがインストールされ､ ローカルマシンで使うのと同じように使えるようになったわけです｡
‫もう一度シェルを抜けると､ 実際にコンテナが停止します｡ docker コンテナ
‫ls. 私が見ていないことに気づくのです｡ 先ほど実行したUbuntuのイメージがありますね｡
‫そのコンテナをもう一度立ち上げると､ その中にcurlがインストールされているはずです｡
‫しかし､ Ubuntuのイメージから新しいコンテナを作成すると､ その別のコンテナにはcurlのコマンドラインがインストールされていないのです｡
‫そのコンテナを再実行し､ Bashを再びその中に戻すとしたらどうでしょう｡
‫docker container startコマンドを使えばいいのです｡
‫既存のコンテナを起動するときは少し違うことに気がつくと思いますが､ それと似たようなit...
‫ただのaiです｡
‫次に､ コンテナの名前Ubuntuを指定します｡ 気がついたらすぐ戻っていて､ またgoogleをカールさせることができ､
‫うまくいっています｡
‫終了すると､ また止まってしまいました｡
‫MySQLやNginxなどを実行しているコンテナ内のシェルを実際に見てみたい場合はどうすればいいのでしょうか｡
‫私たちにもできることです｡
‫そして､ それはexecコマンドを使ったものです｡ docker container exec.
‫そして､ ここにいくつかのオプションがあることがおわかりいただけると思います｡
‫そして､ 最も多いのが... 例えば､ MySQLコンテナに飛び込んで､ MySQL自体の管理作業をする必要があるとします｡
‫もう一度itをやってから､ コンテナの名前にするとか｡ 次に､ 実行したいプログラム｡
‫この場合もBashで､ MySQLのあるコンテナに入りました｡
‫実際にコンテナ内でps auxを実行すると､ プロセスの一覧が表示されます｡ もちろん､ バックグラウンドで動作しているMySQLデーモンも表示されますし､
‫現在座っているBashプロセスも､ 先ほど実行したpsコマンドも表示されるはずです｡
‫このシェルでは､ mysqlのコマンドラインでMySQLそのものに飛び込むことができました｡ このBashシェルを終了して､
‫lsを実行すると､ MySQLがまだ実行されていることに気づくでしょう｡ docker container exec は実際には既存の実行中のコンテナ上で追加のプロセスを実行するため､
‫MySQL デーモンのルートプロセスには影響を与えません｡
‫もう一回やってみよう｡
‫ここでわかるように､ これはトラブルシューティングが必要なときや､ 稼働中のシステムの何かを少し変えたいときにコンテナに飛び込むのに非常に便利ですし､
‫異なるディストリビューションのコンテナを使って､ UbuntuやAlpineなどのフルマシンを持っている場合の環境を提供することも可能です｡
‫さて､ アルパインとは何でしょう？ アルパインについては､ これまで触れてきませんでした｡ AlpineもLinuxのディストリビューションの一つですが､
‫Alpineは非常に小さく設計されています｡
‫実は5MBしかないんです｡
‫docker pull alpineを実行すると､ 最新のAlpineイメージが取り出されます｡ docker image lsを実行すると､
‫Ubuntuと比較してAlpineイメージがどれだけ小さいか実際に確認できます｡
‫アルパインには､ 独自のパッケージマネージャが搭載されています｡
‫Docker HubのオプションにAlpineが追加されるのは､ 次節のイメージとDocker Hubの説明で確認できます｡
‫しかし､ とりあえずAlpineの内部でBashシェルをやってみましょう｡ docker container run -it alpine bash.
‫さて､ ここで何が起こったのでしょうか？
‫なんで入ったんだろう？
‫コンテナプロセスを開始する際に､ 実行ファイルであるbashがパスに見つからなかったと表示されるのです｡
‫そして､ その本当の意味は､ Bashがコンテナの中に入っていないことです｡
‫そしてこれは､ コンテナを起動したときに､ そのイメージの中にすでに存在するものしか実行できないという概念に立ち戻ることになります｡
‫あるいは､ execコマンドやrunコマンドで後から追加したものかもしれません｡
‫しかし､ この場合､ アルパインの画像にはどのように入るのでしょうか？
‫まあ､ アルパインは小さいから､ 実はバッシュが入ってないんだけどね｡ でも､ shはあるんですよ｡ このコマンドをshに置き換えると､
‫Bashほど高機能ではありませんが､ コンテナに直接入ることができます｡
‫Alpine Linuxをネットで検索すると､ そのパッケージマネージャがapkであることがわかり､
‫実際に必要であれば､ それを使ってBashをインストールすることができました｡
‫このレッスンで学んだことを簡単に振り返ってみましょう｡
‫コンテナランの -it オプションについて学びました｡ これは､ ある種のサーバーに ssh で接続する場合と同じように､
‫コンテナ内で実際に何かを行うための対話型シェルに相当するものです｡
‫次に､ docker container
‫execの新しいコマンドであるitを学びました｡ これはrunと全く同じことをしますが､ 新しいコンテナを起動するのではなく､
‫実行中の既存のコンテナに対して実行されます｡
‫そして最後に､ Alpineについて少し学び､ それが主要なLinuxディストリビューションとどのように違うのか､
‫そして実際に4MBほどのサイズでコンテナイメージに最適であることを知りました｡