Dockerコンテナの起動と廃棄
前回、Dockerイメージのダウンロードや元のイメージを変更し、それを保存して利用するなどの方法を説明しましたが、今回は、Dockerコンテナの起動や廃棄について、さまざまな方法を紹介します。
ホスト名を指定してDockerコンテナを起動する
Dockerコンテナのホスト名は、先述の通り、自動的に割り当てられ、人間にとって分かりにくい文字列になっています。管理者としては、ホスト名を固定して利用したい場合があります。Dockerコンテナの場合は、dockerコンテナを起動するときに「--hostname」オプションを付与することで、コンテナにホスト名を与えることができます。以下は、Dockerイメージ「c66docker0001」から、ホスト名host0001を付与したコンテナtest0001を作成、起動する例です。
# docker run --name test0001 --hostname host0001 -i -t centos:c66docker0001 /bin/bash [root@host0001 /]# hostname host0001
[注意]
上記の場合、CentOS 6.6のDockerイメージ「centos:c66docker0001」の/etc/sysconfig/networkファイルにホスト名を指定すればよいと思うかもしれませんが、Dockerコンテナは、CentOS 6.xにおける/etc/sysconfig/networkに記載した変数をロードしません。したがって、docker runによるコンテナ起動時に「--hostname」オプションで明示的に指定する必要があります。
Dockerコンテナをバックグラウンドで起動する
Dockerコンテナは、ホストOS上でプロセスとして稼働しますが、プロセス(コンテナ)をバックグラウンドで稼働させることができます。Dockerコンテナをバックグラウンドで起動させるには、dockerコマンドに「-d」オプションを付与します。
# docker run -d --name test0002 --hostname host0002 -i -t centos:c66docker0001 /bin/bash 09157002e4c3f638f323dcab34c08db1eec8c9344ffa143d57dbf3f6ff431a80 #
上記のように、Dockerコンテナがバックグラウンドで起動しているため、ホストOSのコマンドプロンプトが返ってきています。バックグラウンドのDockerが稼働しているかを確認します。
# docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 09157002e4c3 centos:c66docker0001 "/bin/bash" ... Up About a minute ... test0002
バックグラウンドで稼働しているコンテナに接続するには、dockerコマンドにattachを付与し、コンテナ名あるいは、コンテナIDを指定します。
# docker attach test0002 [root@host0002 /]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@host0002 /]#
「docker attach test0002」を入力後、Enterキーを2回押すと、上記のように、コンテナに接続できます。
ホストOSからコンテナの停止と起動を制御する
Dockerコンテナで作業していて、端末からexitコマンドを入力すると、そのDockerコンテナは停止しますが、Dockerコンテナのコマンドプロンプトからではなく、ホストOSから、コンテナを停止させたい場合もあります。ホストOSから、稼働中のコンテナを停止させるには、dockerコマンドに、stopを付与し、コンテナ名あるいは、コンテナIDを指定します。以下は、稼働中のDockerコンテナtest0002の状態を確認し、稼働中のDockerコンテナtest0002をホストOSから停止させる例です。
# docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 09157002e4c3 centos:c66docker0001 "/bin/bash" ... Up 9 minutes ... test0002 # docker stop test0002 test0002 # docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 09157002e4c3 centos:c66docker0001 "/bin/bash" ... Exited (137) 2 seconds ago test0002
逆に停止したコンテナをホストOSから起動させるには、dockerコマンドに、startを付与し、コンテナ名あるいは、コンテナIDを指定します。
# docker start test0002 test0002 # docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 09157002e4c3 centos:c66docker0001 "/bin/bash" ... Up 14 minutes ... test0002
コンテナの破棄
起動しているかどうかにかかわらず、コンテナを廃棄するには、dockerコマンドにrmを付与し、コンテナIDまたはコンテナ名を指定します。稼働中のコンテナに対して、docker rmに-fオプションを付与しないで実行すると、エラーになり、コンテナは破棄されません。もし、稼働中のコンテナを強制的に破棄する場合は、-fオプションを付与します。
# docker rm test0002 Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f FATA[0000] Error: failed to remove one or more containers # docker rm -f test0002 test0002 #
Dockerイメージの削除
Dockerイメージを削除するには、dockerコマンドにrmiを付与し、DockerイメージIDまたはイメージ名を指定します。コンテナのイメージファイルを削除する場合は、そのイメージを使って起動しているコンテナを停止させる必要があります。
# docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES a7e038ce5b63 centos:c66docker0003 "/bin/bash" ... Up 2 seconds ... test0002 5780c27edab2 centos:c66docker0003 "/bin/bash" ... Up 5 minutes ... test0003 # docker rmi centos:c66docker0003 Error response from daemon: Conflict, cannot delete c9801030b0b1 because the running container a7e038ce5b63 is using it, stop it and use -f to force FATA[0000] Error: failed to remove one or more images # docker stop test0002 # docker stop test0003
削除したいDockerイメージに紐づいたコンテナが全て停止したとしても、rmiに-fオプションを付与せずに実行すると、エラーになり、Dockerイメージは削除されません。
# docker rmi centos:c66docker0003 Error response from daemon: Conflict, cannot delete c9801030b0b1 because the container a7e038ce5b63 is using it, use -f to force FATA[0000] Error: failed to remove one or more images
削除したいDockerイメージに紐づいた停止済みのコンテナが存在する状態で、そのコンテナが利用しているDockerイメージを削除する場合は、docker rmiに-fオプションを付与する必要があります。
# docker rmi -f centos:c66docker0003 Untagged: centos:c66docker0003 Deleted: c9801030b0b19c4fa2aeba450f407f385d6e2c0f1bca16a07ba7055fb32b16f2
コンテナが終了すると、自動的にコンテナを破棄する方法
通常、コンテナをstopさせると、状態が「Exited」になりますが、終了させたコンテナを、再び利用せずに、即座に破棄したい場合もあります。この場合は、dockerコマンドに--rmオプションを付与します。--rmオプションは、-dオプション(バックグラウンドでコンテナを生成、起動するオプション)とは排他利用になりますので、注意してください。以下は、Dockerイメージ「centos:c66docker0002」からコンテナ「test0003」を生成しますが、コンテナ「test0003」を停止させると、自動的にコンテナが破棄される例です。
# docker run --rm --name test0003 --hostname host0003 -i -t centos:c66docker0002 /bin/bash [root@host0003 /]#
別の端末で、起動させたコンテナを確認します。
# docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 3ae5a186cc15 centos:c66docker0002 "/bin/bash" ... Up 2 minutes ... test0003
コンテナを終了させると、コンテナが自動的に破棄されているかを確認します。
# docker stop test0003 test0003 # docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES
上記より、コンテナtest0003を停止されると、コンテナtest0003が自動的に破棄されていることが分かります。