Docker実践ガイド 6

Dockerコンテナの起動と廃棄

前回、Dockerイメージのダウンロードや元のイメージを変更し、それを保存して利用するなどの方法を説明しましたが、今回は、Dockerコンテナの起動や廃棄について、さまざまな方法を紹介します。ホスト名を指定してDockerコンテナを起動するDockerコンテナのホスト名は、先述の通り、自動的に割り当

古賀 政純

2015年9月8日 18:00

前回、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が自動的に破棄されていることが分かります。

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る