Dockerコンテナの起動と廃棄

2015年9月8日(火)
古賀 政純

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

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています