はじめに
KubernetesやOpenShift、VMware Tanzuなど、コンテナでのエンタープライズ運用の世界はどんどん先に進んでいるんですが、そういえば技術的にはまずはDockerのことをちゃんと使えるようにならないとどうしようもないなと痛感しております。
Dockerのインストール記事はたくさんあるので問題ないのですが、さて入れてから何をしていいかわからない。コマンドの紹介記事はたくさんあるけど、どんな意味なのかが頭に入ってこない。
そんなときのために記事を書いてみました(自分の勉強も兼ねて)。
インストールについては過去書いた通り。
今回はインストール直後の話です。
ローカルPCに入れたDocker for Windowsで「docker」というコマンドを叩くと、使い方がテキストで流れるんですがまずはここに書かれていることをきちんとおぼえれば、使えるようになると思います。
具体的にはこんなヤツです。
英語ばかりで大変・・ですが、ググれば使い方などQiitaを含めいろいろ出てくるので心配ご無用・・。ただ、似たような言葉も多く頭の中が整理できません。
start / run / exec、それぞれどう違うのか・・とか。
作ったり開始したり走らせたりと、頭が混乱し、そして眠くなります。
なんだか勉強しようとして、あんまりピンと来ないと眠くなるのってどうにかできないのかな・・。
ということで深みにはまる前に、代表的なコマンドたちを文系ITエンジニアの私が日本語に変換しようと思います。
特にVMwareやAmazon EC2などハイパーバイザー・仮想マシンは使っているけどコンテナはよくわからんという人向けにお役に立てればと。
Dockerを使うなら知っておきたい概念たち
コンテナ
コンテナは、仮想マシン・VMと同じような意味です。仮想マシンも電源をオンにしたりオフにしたりしますが本当に電気を入れるわけではないですよね。コンテナも起動したり停止したりします。起動して初めてメモリにデータが入りストレージがマウントされCPUが使われ始めます。コンテナはとりあえずは仮想マシンと同義ととらえてください。
しかし、コンテナには特徴があります。中に仮想マシンのようにOSやアプリケーションに含まれる余計なファイルが入っていません。最低限のファイルしか入っていませんからサイズも数十MB~数百MBのものが多いです。仮想マシンのサイズは数GBから数百GBしますから、とても取り回しが楽であるのが特徴です。
仮想マシンはハイパーバイザー上で動くのは有名ですが、コンテナはどこで動くのでしょうか。これはコンテナエンジンです。Docker Engineもその一つです。これはいくつも種類がありますがコンテナを動かすのは同じです。コンテナエンジンはRed Hat Enterprise LinuxやCentOSなどのOSの上で単なるプログラムとして動きます。その上でコンテナが動くのですが、なんと例えばCentOS7上のコンテナエンジンの上で、CentOS8が動いたりUbuntuが動いたりします。これはLinuxカーネルの機能を活かしたものですが、ホストのOS上で違うOSが動くのがまず感動するポイントです。
ただ、LinuxコンテナはLinux上のコンテナエンジンでしか動きません。WindowsコンテナはWindows上のコンテナエンジンでしか動きません。Docker for WindowsでLinuxコンテナが動くのは、Hyper-V上の仮想マシンで動かしているにすぎませんので注意が必要です。
イメージ
コンテナが、仮想マシンのように起動したり停止したりするのはわかりました。ではどうやってコンテナを作るのでしょうか。これはイメージを利用します。すでに公式イメージが用意されていてこれを利用してコンテナを作成することができます。
例えば、CentOSの最新イメージを利用する!、とすれば今ではCentOS8のイメージが流用されコンテナが作成されます。10秒くらいで出来上がるので驚きです。
もちろんすぐにコンテナは利用せず、ローカルにイメージをダウンロードするだけでも問題ありません。
仮想マシンの場合はテンプレートから作成すると思いますが、コンテナの場合はイメージからということをおぼえましょう。
Docker Hub
ダウンロードしたイメージはローカル環境に登録しリスト化されています。それでは公式イメージはWEBサイトなどからダウンロードし自分で登録しなければいけないのでしょうか。いえ、違います。Dockerを使った場合、イメージを利用する時点でローカルにないと、Docker Hubと呼ばれるクラウド上の公式イメージレジストリから自動で検索し、ダウンロードしてくるのです。
これがすばらしくって、「CentOSの最新イメージを使って、自分のコンテナを作る」と言うコマンドを打つと、勝手にDocker Hubからイメージをダウンロードしてローカルに保管しコンテナを作成してくれます。
一度ダウンロードしたイメージは裏で再利用されるので、音楽のストリーミングみたいな感じですね。
docker create / start / run / exec コマンドそれぞれの違い
いきなりDockerを触った人が混乱する件。そもそも私が混乱したので書いています。
createというのは、イメージからコンテナを作成するが起動はしない。
startというのは、起動していないコンテナを起動する。
runというのは、create(作成)したうえでstart(起動)する。
というように、create + start = runという関係になっています。
基本的にコンテナを作ったら起動するでしょ、ならrunです。
英語記事ですが下記に置いてある図がすこぶるわかりやすいです。
>>
一方で、execと言うコマンドがあってこれが混乱するのですが、execというのは、起動したコンテナのシェルの中で、コマンドを実行することにほかなりません。だから、createやstartやrunがコンテナ自身の生成や起動状態を操作するものだとすると、execはコンテナの中でコマンド実行です。全然話が違うとおぼえておきましょう。
docker attachとexecの違い
コンテナでコマンドを実行する場合に、attachとexecの2通りがあります。
似ていますが用途が違いますのでおぼえましょう。
docker export/importと、save/loadの違い
これも似たような概念なので混乱しやすい。
コンテナをtarファイルとして外だししたり、インポートできたりします。
バックアップのために使っても良いですし、オンプレミスに持ち込むときにファイルで持ち込みたいというときに使えます。
docker rm/start/stop/kill/pause/unpauseコマンド
こちらは、コンテナの起動状態を操作したり、コンテナ自体を削除したりするコマンドたちです。ひとまとめでおぼえると便利。
千里の道も一歩から
Dockerの解説記事はインターネットにたくさんあるのですが、わかってしまった後の記事が多いので、あえて簡単な部分を書いてみました。
仮想マシンのような概念に、GitHubのようなデプロイやバージョン管理の概念をくっつけて便利な仕組みになっているのがDockerです。機能が増えていったためにコマンド数も順調に増えていきなりおぼえると混乱しそうな英単語もあると思います。
とりあえずここに書いてあることを頭に入れてから、Dockerのはじめの一歩的な記事を読んでいくと理解は早いと思います。
コンテナの取り回しや、ネットワーキング的な部分をおぼえたら、次はDockerファイルを使ってComposeなどで関連コンテナをまとめたり、Amazon ECSやマネージドKubernetesなどでサーバーサイドで動かしていくステップに入っていけば良いと思います。
何しろ、Windows10上でCentOS8やUbuntuなどがサクっと動いてしまうのが面白くて仕方ないです。コンテナも前段の通り超軽いファイルなので、取り回しも楽。
遊び心で始めてみましょう。