自由気ままに書いちゃおう

好きなことをつらつらと・・・

【docker】docker run と docker execの違いについて

混乱しがちな2つのコマンドについてです。

■本記事の流れについて

以下の流れで記載致します。

1.docker runについて
2.docker execについて
3.なぜ混乱しがちなのか
4.コンテナへのログイン方法について
5.コンテナへログインせずにコマンド実行する方法について

■1.docker runについて

docker run はコンテナを起動するコマンドです。
docker runコマンド自体は以下の3つのコマンドを一気に実行しています。

① docker pull ・・・ コンテナイメージの取得
② docker create ・・・ コンテナの作成
③ docker start ・・・ コンテナの起動

そのため、docker runコマンドが仮に存在してなかったとしても(そんなことはあり得ないのですが)上記3つのコマンドを一つずつ実行すればコンテナは起動します。

また、一度停止(stop)したコンテナを起動する際は、docker startコマンドを使います。

■2.docker execについて

docker exec はコンテナに対してコマンドを実行するものです。

■3.なぜ混乱しがちなのか

上記の通り、
docker runは「コンテナ起動」、
docker execは「コンテナに対するコマンド実行」
です。
これだけ見るとあまり間違う要素がないのですが、
「コンテナにログインする」というときに間違えそうになります。

というのも、
① 起動直後にログインするパターン(docker run)
② 起動後に任意のタイミングでログインするパターン(docker exec)
の2つが存在するからです。
しかも上記①、②で利用するコマンドが異なります。
これが混乱を招く原因です。

以降はログインについて深堀りしていきます。
※下記で利用したcentos8を使います。

www.guri2o1667.work

 

■4.コンテナへのログイン方法

■① 起動直後にログインするパターン(docker run)


以下コマンドを実行します。

docker run --name centos81 -it centos:centos8

 

実行後、既にCentOSにログインした状態となります。

f:id:guri2o1667:20201103151154p:plain


ログアウトするには次のどちらかを行います。
・centos8を起動したままにしたいなら、「Ctrl+P」⇒「Ctrl+Q」
・centos8を停止してもよいなら、exitコマンドを実行

■② 起動後に任意のタイミングでログインするパターン(docker exec)

以下コマンドを実行します。
あえて、オプションにdをつけてバックグラウンドで実行するようにしています。

docker run --name centos82 -itd centos:centos8

続けて以下コマンドを実行します。

docker exec -it centos82 /bin/bash

f:id:guri2o1667:20201103151821p:plain

 
centosのプロンプトが表示されていればログイン成功です。

■5.コンテナへログインせずにコマンド実行する方法について

centos8にログインせずに任意のコマンドを実行します。
以下は ls -l /var/ コマンドを実行しているところです。

f:id:guri2o1667:20201103152031p:plain


以上です。