ネットでdockerに関する記事を読んでますと、たまに「docker run」と「docker exec」を混同されている方を見かけます。
コンピュータ業界では、runとexec(execute)はどちらも「実行する」という意味で使われますので、違いが分かりにくいのかもしれません。
私もDockerの勉強を始めたころは、上記の2つのコマンドをたまに間違えてつかって、良くエラーになってました。(というか今でもたまにやります・・・)
本記事は、「docker run」と「docker exec」の違いを明確にすることを目的としております。
※以前はCentOS公式のDockerイメージを利用して記事を書いておりましたが、最近Ubuntuを触る機会が増えたため、本記事はUbuntu公式のDockerイメージを利用する内容に書き換えました。同時に以前の記事の記述ミス部分の修正も行っております。(2020.06.02管理人)
そもそも「docker run」コマンドとは
「docker run」コマンドは一言でいいますと、コンテナを作成して起動するコマンドです。
例えば以下のコマンドは、ベースイメージとしてUbuntu公式イメージを使用してコンテナtestvmを作成して、そのコンテナを起動するまでを行います。
$ docker run -dit --init --name testvm ubuntu
つまり、次の2つのコマンドを1つのコマンドで実現できるコマンドということになります。
$ docker create -it --init --name testvm ubuntu
$ docker start testvm
極端な話、「docker run」コマンドは無くても同じことが実現できます。
本番環境など特別な環境で、事前にコンテナを起動せずにコンテナ作成まで終わらせておき、あとはdocker startだけの状態にする場合などは、docker createコマンドを利用した方が良いと思います。
しかし、それ以外の場合はdocker runで大丈夫な気がします。
私は、個人的なDocker環境でコンテナを起動する場合は、「docker run」コマンドで行ってます。
状況に応じて使い分けていただければと思います。
そもそも「docker exec」コマンドとは
「docker exec」コマンドは一言でいいますと、起動中のコンテナ内で、指定したコマンドを実行するコマンドです。
「docker exec」コマンドを使うためには、対象となるコンテナが起動されている必要があります。
例えば、コンテナtestvm2内で「ls」コマンドを実行する場合は、まずコンテナtestvm2を起動してから、そのあとで「docker exec」コマンドを使用します。
実際にやってみます。
まず、testvm2コンテナを起動します。
$ docker run -dit --init --name testvm2 ubuntu
次に、起動したコンテナtestvm2内で「ls」コマンドを実行して、コンテナtestvm2内の/etcディレクトリの内容を出力させます。
$ docker exec -it testvm2 ls -l /etc
以下のように、コンテナtestvm2内の/etcディレクトリの内容が出力されます。
total 260
-rw-r--r-- 1 root root 3028 Apr 23 11:06 adduser.conf
drwxr-xr-x 2 root root 4096 Apr 23 11:09 alternatives
drwxr-xr-x 1 root root 4096 Apr 23 11:06 apt
-rw-r--r-- 1 root root 2319 Feb 25 12:03 bash.bashrc
-rw-r--r-- 1 root root 367 Apr 14 19:26 bindresvport.blacklist
drwxr-xr-x 2 root root 4096 Apr 23 11:07 cron.d
drwxr-xr-x 2 root root 4096 Apr 23 11:07 cron.daily
(以下省略)
「docker exec」コマンドに関しましては、別記事「docker execコマンドの使い方(実例付)」でご紹介しておりますので、そちらもご利用頂ければと思います。
「docker run」と「docker exec」の違いについて
これまでの内容で、「docker run」と「docker exec」の違いはご理解いただけたと思います。
Dockerは数ある仮想化技術のひとつなのですが、良く利用されているVMwareやHyper-Vなどのホスト(ハイパーバイザ)型仮想化技術とは違う、コンテナ型仮想化技術ですので、慣れるまでは戸惑いがあると思います。
私も慣れるまでは大変でした。
「docker run」コマンドは、ホスト型仮想化技術で例えますと、仮想マシンを起動するという部分にあたります。
「docker exec」コマンドは、同様にホスト型仮想化技術で例えますと、起動した仮想マシン上でプログラムを実行するという部分にあたります。
このようにお考えになると、理解し易いのではないかと思います。
本記事で、Dockerについての理解が深まって頂けたら幸いです。
最後までお読みいただきありがとうございました。
コメント