docker execコマンドの使い方(実例付)CE対応


 docker execコマンドの使い方を解説します。Docker CE ver18.06.0に対応してます。

 このコマンドは、実行中のコンテナ内で新たなコマンドを実行します。

 仮想環境内でオペレーションを行いたい場合、このコマンドを使用してコンテナ内でシェルを起動します。私はかなり使います。

 また、コンテナ内であるコマンドを1つ実行して、その結果がすぐ知りたい場合などにも使います。例えばのファイルの存在確認を行いたいときに、「ls」コマンドを実行する場合などです。

 尚、このコマンドは、起動状態のコンテナに対してのみ実行可能です。停止中(若しくは一時停止中)のコンテナには使用できません。

 それでは以下で詳細に解説いたします。

 

docker execコマンドのフォーマットとオプション

フォーマット

docker exec [オプション] [コンテナ] [コマンド] [引数...]

 

主なオプション一覧

-d, --detach
指定したコマンドをコンテナ内でバックグラウンドで実行します。

-e, --env <定義>
指定したコマンドを実行する際に環境変数を適用します。

-i, --interactive
指定したコマンドを実行した後、コンテナの標準入力をDockerホストの標準入力と接続します。

-t, --tty
コンテナ内で疑似的な仮想端末を割り当てて、Dockerホストの標準出力と接続します。

--privileged
指定したコマンドを特権モードで実行します。

-u, --user
指定したコマンドを特定ユーザで実行します。

-w, --workdir NEW

コンテナ内でコマンドを実行する際の作業ディレクトリが指定できます。

■ 本記事の目次に戻る ■

docker execコマンドの主な使い方

 以下の実例は、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。コンテナは「docker run -d --name testvm centos init」で起動します。

コンテナ内で「ls」コマンドを実行する

 コンテナ内で「ls」コマンドを実行し、その結果を確認します。

$ docker exec testvm ls -l /usr

 以下のように、コンテナ内の/usrディレクトリ下のファイルの一覧が出力されました。

total 52
dr-xr-xr-x 2 root root 12288 Jul 1 20:34 bin
drwxr-xr-x 2 root root 6 Aug 12 2015 etc
drwxr-xr-x 2 root root 6 Aug 12 2015 games
drwxr-xr-x 3 root root 22 Jul 1 20:31 include
dr-xr-xr-x 19 root root 4096 Jul 1 20:34 lib
dr-xr-xr-x 26 root root 12288 Jul 1 20:34 lib64
drwxr-xr-x 7 root root 4096 Jul 1 20:34 libexec
drwxr-xr-x 12 root root 121 Jul 1 20:29 local
dr-xr-xr-x 2 root root 4096 Jul 1 20:34 sbin
drwxr-xr-x 52 root root 4096 Jul 1 20:34 share
drwxr-xr-x 4 root root 32 Jul 1 20:29 src
lrwxrwxrwx 1 root root 10 Jul 1 20:29 tmp -> ../var/tmp

■ 本記事の目次に戻る ■

コンテナ内でbashを起動して仮想環境内でオペレーションを行う

 コンテナ内でbashなどのシェルを起動することで、コンテナにログインしたかのようにオペレーションを行うことが出来ます。

$ docker exec -it testvm bash

※「-it」は「-i -t」と同じです。

 以下のようにプロンプトが変わったと思います。

[root@b8494b835220 /]#

 「root@」のあとの文字列は、docker execコマンドで指定したコンテナのコンテナIDです。このプロンプトは、docker exec で実行したコンテナ内のbashが出力しているプロンプトになります。よって、このプロンプトで実行するコマンドは、コンテナ内で実行することになります。

 試しに、色々なコマンドを実行してみてください。

[root@b8494b835220 /]# hostname
b8494b835220
[root@b8494b835220 /]# uname -a
Linux b8494b835220 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@b8494b835220 /]# pwd
/
[root@b8494b835220 /]#

 「exit」を実行することで、コンテナ内のシェルが終了し、Dockerホストに戻ります。

[root@b8494b835220 /]# exit
exit
$

■ 本記事の目次に戻る ■

コンテナ内で起動するコマンドの実行時のユーザを指定する

 「-u」オプションを使用することで、コンテナ内で起動するコマンドの実行時のユーザの指定が可能となります。

 例えば、コンテナ内で「ps」コマンドを「nobody」ユーザで実行する場合は、以下を実行します。

$ docker exec -it -u nobody testvm ps -ef

 以下のように「ps」コマンドの出力結果が表示されたかと思います。「ps -ef」のUIDは「nobody」になっているのが確認できます。

UID    PID PPID C STIME TTY TIME     CMD
root   1   0    0 06:01 ?   00:00:00 init
nobody 136 0    0 08:41 ?   00:00:00 ps -ef

■ 本記事の目次に戻る ■

コマンドを実行する際に指定した環境変数を適用する

 「-e」オプションで指定した環境変数を、指定したコマンドを実行する際に適用します。

 コンテナtestvm内でbashを起動します。その際、「testenv=123」という環境変数をコンテナ内で起動するbashに適用します。

$ docker exec -it -e testenv=123 testvm bash

 表示されたコンテナ内のbashのプロンプトで「env」コマンドを実行し、実行したbashに適用されている環境変数を確認します。

[root@356027bd1667 /]# env
HOSTNAME=356027bd1667
TERM=xterm
testenv=123
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
 (以下省略)

 色々な環境変数が表示されますが、その中にdocker execコマンドのオプションで指定した「testenv=123」の値が存在することが確認できました。

 1つのdocker execコマンドで複数の環境変数を適用する場合は、「-e」オプションを複数記述します。試しに、「testenv2=abc」と「testenv3=321」を指定してdocker execコマンドを実行します。

$ docker exec -it -e testenv2=abc -e testenv3=321 testvm bash

 コンテナ内のbashのプロンプトでenvコマンドを実行します。

[root@356027bd1667 /]# env
HOSTNAME=356027bd1667
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
testenv3=321
testenv2=abc
 (以下省略)

 指定した2つの環境変数が確認できました。

■ 本記事の目次に戻る ■

コマンド実行時のカレントディレクトリ(作業ディレクトリ)の指定

 docker execコマンドを使用してコンテナ内でシェルを起動した場合、デフォルトではカレントディレクトは/(ルート)になっていると思います。

 またコンテナ内でlsコマンドを実行した場合もカレントディレクトリはデフォルトでは/(ルート)です。

 「-w」オプションでディレクトリを指定することで、任意のディレクトリをカレントディレクトリ(作業ディレクトリ)として利用することができます。

 オプション「-w /tmp」を指定してdocker execコマンドを実行します。

$ docker exec -it -w /tmp testvm bash

 教示されたプロンプトで「pwd」コマンドを実行して、カレントディレクトリを確認します。

[root@22755b68256f tmp]# pwd
/tmp

 「/tmp」ディレクトリがカレントディレクトリになっていることが確認できました。

 一旦exitコマンドでDockerホストに戻ってからオプション「-w /usr/bin」を指定して、以下のdocker execコマンドを実行してみてください。

$ docker exec -it -w /usr/bin testvm pwd
/usr/bin

 「pwd」コマンドが実行されたときのカレントディレクトリは/usr/binになっています。

 

以上でdocker execコマンドの紹介を終わります。

ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(ver1.12対応版)(オリジナルな実例付き)」をご参照ください。

 ご訪問ありがとうございました!


コメントを残す

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

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