サブコマンド(image, container)から深めるdockerコマンドへの理解

白状するとDockerに関して、打っているコマンドをよく理解しないまま使っていたんですね。

もちろん実務では使っていますし、何かあった時にも都度調べれば何とかなるという感じで「理解しない」のレベル感としては多分、「ぜんぜんわからない。俺たちは雰囲気でDockerを使っている」*1くらいのものだったかと思います。

そして、ローカル環境での開発に限れば幸いにもそれで何とかなっていました*2。ただそんな有様ですからうまくいかない時に都度本筋から離れて対応をググらなければならず、開発者体験の方のDXはよくはありませんでした。

詰まってしまう具体例としては、

  • コンテナ立ち上げるコマンドって docker run / docker exec どっちだったっけ? (docker-compose up とごっちゃになることもある)
  • 一覧出すのって docker ls だっけ? docker ps だっけ?
  • 諸々整理したいときは docker stopdocker rm ?んん、rm する前に止めろと言われとる。ん、rmi? ( docker-compose down とごっちゃになることもある)
  • --name でコンテナに名前をつけようとしたらすでに使われていると怒られた。docker ps だと出てこないのに。
  • とりあえず docker system prune しとこ

みたいな。改めて文字にするとひどいもんですが、ホントこんな感じ。

そんな中いつものようにググっていた時だったか、突き当たったのが↓のQiita記事でした。

qiita.com

Dockerの入門には慣れていた*3のでおさらい的な内容も多かったのですが、良かったのが記事の中で紹介されていたこちらの投稿です。

qiita.com

「おお、コマンド体系が新しくなってる(なってた)」と自分の中で発見がありました。そして新コマンド体系(2017年にはすでに使えていたのでそう新しくもないですが)では各コマンドがdockerの何に対する操作か明示されているではないですか。

以前のコマンド体系だと、イメージに対する操作もコンテナに対する操作もフラットになっていて、それが実務で出てくるやりたいこととコマンドの紐付けを妨げていたのだと思います。一方、今でも旧コマンド体系が使えるため、現場では特に意識しない限りは混在してしまいます。これが私にとっては罠でした。

振り返ってみれば、学習段階では概念としてのイメージ、コンテナと各コマンドの対応を意識していなかった、そしてその後はコマンド体系が新しくなったことをキャッチアップできていないことが自分にとっての大事なピースだったのですが分かってしまえば、コマンドへの理解が進んですっきりするものです。

今ならimage (からのDockerfile(build)), container (からのcommit), volume, networkとコマンドと対応させながら進め、Docker Composeと学んでいけばスムーズに理解が進むのではないでしょうか。

考えてみると私が開発でDockerを触り始めた2016年頃はまだDocker for Macが出る前で、それゆえMacで使うためにはDocker Machineのお世話にならなければなりませんでした。

Docker for Macが出てもこなれるまではdinghyを使っていたし、もちろん開発する上ではDocker Composeも使ってるわけで要するに一口にDockerといっても開発エコシステム全体がやたら複雑だったんですね。今から考えると当時は過渡期だったんでしょうね。

新しめの技術だと往々にしてこういったことがありますし、体系だった学習リソースに突き当たるのが難しかったり、もしくは存在しなかったりします。今回の気づきは今後新しい技術を私の中でモノにするための参考になりそうだと思った次第です。

*1:元ネタ: 【株の知識ゼロ】バカが考えた株の漫画|俺たち株の初心者

*2:逆に何とかなってしまうから、これまで本腰入れなかったのでしょうけどね。

*3:「開発でDockerを使う」となった時にお勉強として入門系の書籍は読んだ他、ものにしようとちょこちょこ入門系の記事も読んでたのです。