未経験からプログラミング学習に励んでおります。
楽しいこと大好き、自由を求める『Tatooo』です。
RUNTEQのカリキュラムを進めていく中で、よく理解できていなかったことや気になっていたことを個人の備忘録として少し記事にしておきます。
また、導入編〜入門編のカリキュラムで躓いている方向けの記事として、拙い文章ですが読んでもらえると嬉しいです。
※この記事は 超初心者向け なので、ご注意ください。
今回はターミナル操作やdockerのコマンド操作について、初心者目線で疑問に感じたことをまとめてみます。そもそも『dockerって何?』『dockerの使い方は?』という内容はカリキュラムのテキストや技術記事を読めばわかりやすく書いてありますので、そちらをご覧ください。
1.docker compose buildをせずにdocker compose upをするとどうなるの
?
最初にdockerでコンテナを作成して起動する時、
$ docker compose build # dockerイメージの作成
$ docker compose up # コンテナの起動
っていう手順で起動しますよね?
でも学習を中断して、また続きから始めたい時に、またbuildするの?いきなりupするの?って悩みませんでした?‥‥私は悩みました。
こういうのって、経験者の方からすれば『ちゃんとdockerの概念を理解してたらわかるじゃん』って思われるかもしれませんが、本当に初心者ってこのレベルなんですよね。なので、簡単に解説させていただきます。
buildせずにupした場合、状況によって「自動でビルドされる」か「古いまま起動する」かの2パターンに分かれます。
-
PC内にまだイメージ(コンテナの元となるデータ)がない場合
初回起動時などは、Dockerが『イメージがない』と判断し、自動的にbuildを行ってから起動してくれます。
-
PC内にすでにイメージが存在する場合
すでに過去に一度でもビルドしたことがある場合、既存のイメージをそのまま使って起動します。つまり、DockerfileやGemfileなどの設定ファイルを書き換えていても、変更が反映されずに古い状態のまま起動してしまいます。
つまり、基本的には
$ docker compose up
と記述するだけで、buildで実行されるイメージの作成もやってくれているというわけです。
ただし、Dockerfileなどの内容を書き換えた際には、
$ docker compose build
を実行してからupし直さないと、古いイメージファイルからコンテナを起動してしまうので注意が必要ということです。
ちなみに、Dockerfileなどを書き換えた後に、その内容を反映しつつ起動させるコマンドとして、
$ docker compose up --build
というものがあるそうです。ということは‥初回であっても途中からであっても、このコマンドを毎回書いていたら超便利ということですね。
ただし、毎回--buildをつけると、不必要にビルドの確認処理が走るので通常のupよりも起動に時間がかかるというデメリットもあります。そのため、しっかりと使い分けができるようになれば、普段はupを使って、Dockerfileなどを変更した際に--buildをつけるという方法を使うのが良さそうです。
2.docker compose up -dにするとどうなるの
?
$ docker compose up
$ docker compose up -d
この違いってわかりますか?後ろについている-dの部分は「Detached(デタッチド)モード」の略で、コンテナをバックグラウンドで動かすオプションになります。
ターミナルを使ってDockerコンテナを起動させた場合に、通常だとコンテナの通信記録(ログ)がリアルタイムで流れ続けてしまうので、そのターミナルではコマンド入力ができなくなるんですよね。
そうなった場合、Dockerコンテナを起動させているターミナルとは別のターミナルを開いて、コマンド入力用として使わなければいけません。
しかし、-dオプションを使っておけば、別のターミナルを増やす必要がなくなりますので、基本的には、
$ docker compose up -d
と記述してコンテナを起動させておけばいいですね。またバックグラウンドで実行している場合に、もしログを見る必要があれば、
$ docker compose logs -f
というコマンドを使えば、都度見ることもできます。このオプションの-fはfollow(フォロー)の略で、ログの出力を追いかけ続けるという意味を持っています。
ちなみに、先ほどbuildとupの説明をした時に、
$ docker compose up --build
という便利なコードがありました。これと-dを両方使ったら、めちゃくちゃ便利じゃない?と思って調べたら、
$ docker compose up -d --build
案の定、ありましたね。しかも普通に実務でよく使われている組み合わせだそうです。Dockerの公式ドキュメントでも紹介されていました。
Docker公式ドキュメント
カリキュラムで指定がある時には、そのコマンドを使うべきですが、慣れてきたらこのコマンドさえ記述しておけば、変更分も含めてコンテナをビルドし、バックグラウンドで起動させることができます。この一文はすぐに覚えちゃいましょう!!
ここも同様です。使い分けができるようになれば、普段はup -dを使って、Dockerfileなどを変更した際に-d --buildをつけるという方法を推奨します。
3.docker compose stopとdocker compose downの違いは何
?
これも初心者あるあるではないですか?私だけですか?普通に英語の意味から考えたらわかるのかもしれませんが、私は学習終了時にどのコマンドで終えたらいいのか悩みました。
$ docker compose stop
$ docker compose down
stopについては、動いているコンテナの動作を一時停止するコマンドになります。downについては、コンテナを停止させた後に、そのコンテナ自体やネットワークもまとめて削除します。
つまり、stopで止めただけの状態だと、docker compose up などで起動させた時に、前回止めた状態のコンテナをそのまま再利用するので素早く起動します。
一方で、downを使って停止と削除を行なった後に起動させた場合には、コンテナ環境がリセットされて新しくコンテナを作り直してから起動します。
では、この2つをどう使い分けるべきかと言いますと、作業中に一時的に中断するだけの場合にはstopで停止させておくと次の起動がスムーズです。
一方で、その日の作業を終える場合や別の課題に移るときには、downが推奨されます。なぜなら、コンテナを残したまま色々な作業を続けると、古い状態が残ってしまい、「コードは合っているはずなのに、なぜかエラーが出る」というトラブルの元になるからです。
downを使って都度リセットするというクセをつけておくと、環境がクリーンに保たれて安心です。
ちなみに、downを使ってリセットすると言っても、データベースの中身などのデータは残ります。このようなデータも含めて完全にリセットしたい場合には、
$ docker compose down -v
というコマンドを使います。
この-vオプションはvolumes(ボリューム)の略で、ボリュームというのはDocker環境における「データが保存されている場所」のことを指します。つまり、ボリューム(データ)もコンテナと一緒に全部削除してねという指示になります。
4.ターミナルでコマンドが打てなくなった時に、『Control+C』、『exit』、『q』のどのコマンドを使えばいいの
?
ターミナルでコマンドを打った後に、急にコマンドが打てなくなって困ったことはありませんか?例えばログが流れていたり、閲覧モードという長い文章を読む専用のモードの時には、通常のコマンド操作ができなくなります。
これも経験者は当たり前の操作だと思いますし、カリキュラムでもあまり説明されていなかったりするのですが、初心者にとっては、この対処方法を調べるだけで時間がかかってしまいます。
このような状況に陥った場合、脱出に使われるコマンドは、基本的に3つです。
- Control + C
- exit
- q
これらの使い分けを見ていきましょう。
まず、Control + Cについては、今まさにターミナルで動いているプログラムを「実行中にキャンセル」させる時に使います。例えば、docker compose upでログが流れている時、コマンドの実行が終わらずに途中でやめたい時などです。
次に、exitは、今いる環境(部屋)から「退出」する時に使います。例えば、コンテナの中に入って作業しているが、元のMac/Windowsの画面に戻りたい時、rails cなどのコンソールやirbなどの対話モードを終わりたい時です。
最後に、qは、長い文章を読む専用のモード(閲覧モード)から「抜ける(Quit)」ためのキーです。例えば、git logで過去の履歴を見ている時、長いテキストファイルやログを閲覧している時に使います。
以上を簡単にまとめるとこのようになります。
| 状況 | 脱出方法 |
|---|---|
| プログラムが動き続けて止まらない! | Control + C |
| コンテナやコンソールの中から抜け出したい! | exit |
| 履歴などの文字ばかりの画面から戻りたい! | q |
今回の内容は以上になります。
最後まで読んでいただき、ありがとうございました。