docker runとdocker execの違いの解説


 ネットでdockerに関する記事を読んでますと、たまに「docker run」と「docker exec」を混同されている方を見かけます。

 コンピュータ業界では、runとexec(execute)はどちらも「実行する」という意味で使われますので、違いが分かりにくいと思います。

 私もDockerの勉強を始めたころは、上記の2つのコマンドをたまに間違えてつかって、良くエラーになってました。(というか今でもたまにやります・・・)

 本記事は、「docker run」と「docker exec」の違いを明確にすることを目的としております。

 

そもそも「docker run」コマンドとは

 「docker run」コマンドは一言でいいますと、コンテナを作成して起動するコマンドです。

 例えば以下のコマンドは、ベースイメージとしてCentOS公式イメージを使用してコンテナvmtestを作成して、そのコンテナを起動するまでを行います。

$ docker run -d --name vmtest centos init

 つまり、次の2つのコマンドを1つのコマンドで実現できるコマンドということになります。

$ docker create --name vmtest centos init
$ docker start vmtest

 ですので、極端な話、「docker run」コマンドは無くても問題ないことになります。

 しかし、本番環境など特別な環境で、より確実性を求められる場合など以外では、「docker run」コマンドを使った方が便利だと思います。

 私は、個人的なDocker環境でコンテナを起動する場合は、「docker run」コマンドで行ってます。

 

そもそも「docker exec」コマンドとは

 「docker exec」コマンドは一言でいいますと、起動中のコンテナ内で、指定したコマンドを実行するコマンドです。

 「docker exec」コマンドを使うためには、対象となるコンテナが起動されている必要があります。

 例えば、CentOS公式イメージで作成したコンテナvmtest2を起動して、そのコンテナ内で「ls」コマンドを実行する場合は、「ls」コマンドを実行する際に「docker exec」コマンドを使用します。

 実際にやってみます。

 まず、vmtest2コンテナを起動します。

$ docker run -d --name vmtest2 centos init

 次に、起動したコンテナvmtest2内で「ls」コマンドを実行して、コンテナvmtest2内の/etcディレクトリの内容を出力させます。

$ docker exec -it vmtest2 ls -l /etc

 以下のように、コンテナvmtest2内の/etcディレクトリの内容が出力されます。

total 900
-rw-r--r-- 1 root root 14 Nov 2 12:47 BUILDTIME
-rw-r--r-- 1 root root 5090 Feb 16 2016 DIR_COLORS
-rw-r--r-- 1 root root 5725 Feb 16 2016 DIR_COLORS.256color
-rw-r--r-- 1 root root 4669 Feb 16 2016 DIR_COLORS.lightbgcolor
-rw-r--r-- 1 root root 94 Apr 29 2015 GREP_COLORS
drwxr-xr-x 5 root root 54 Nov 2 12:46 X11
-rw-r--r-- 1 root root 16 Nov 2 12:47 adjtime.rpmsave
-rw-r--r-- 1 root root 1518 Jun 7 2013 aliases
drwxr-xr-x 2 root root 42 Nov 2 12:46 alternatives
drwxr-xr-x 2 root root 54 Nov 2 12:47 bash_completion.d
-rw-r--r-- 1 root root 2835 Aug 12 2015 bashrc
drwxr-xr-x 2 root root 6 Sep 15 2016 binfmt.d
-rw-r--r-- 1 root root 38 Dec 9 2015 centos-release
-rw-r--r-- 1 root root 51 Dec 9 2015 centos-release-upstream
drwxr-xr-x 2 root root 6 May 12 2016 chkconfig.d
drwxr-xr-x 2 root root 28 Nov 2 12:46 cron.daily
drwxr-xr-x 2 root root 29 Nov 2 12:46 cron.hourly
(以下省略)

 「docker exec」コマンドに関しましては、別記事「docker execコマンドの使い方(実例付)」でご紹介しておりますので、そちらもご利用頂ければと思います。

 

「docker run」と「docker exec」の違いについて

 これまでの内容で、「docker run」と「docker exec」の違いはご理解いただけたと思います。

 Dockerは数ある仮想化技術のひとつなのですが、良く利用されているVMwareやHyper-Vなどのホスト(ハイパーバイザ)型仮想化技術とは違う、コンテナ型仮想化技術ですので、慣れるまでは戸惑いがあると思います。

 私も慣れるまでは大変でした。

 「docker run」コマンドは、ホスト型仮想化技術で例えますと、仮想マシンを起動するという部分にあたります。

 「docker exec」コマンドは、同様にホスト型仮想化技術で例えますと、起動した仮想マシン上でプログラムを実行するという部分にあたります。

 このようにお考えになると、ご理解し易いのではないかと思います。

 

 本記事で、Dockerについての理解が深まって頂けたら幸いです。

 最後までお読みいただきありがとうございました。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください