こんにちは、ツヨシです。 9月になり、一気に涼しくなりましたね。
あと4ヶ月で今年も終わりかと思うと胸熱です。
さて前回、Dockerを使ってhello-worldのイメージを実行してみました。
今回は、LinuxのディストリビューションのUbuntuを実行します。そのなかで、コンテナの更新や、コンテナの実行、再起動などを行います。
Ubuntuのイメージを持ってくる
まず、Docker hubからUbuntuイメージを持ってきて起動させます。コマンドとしては"docker run -it
$ docker run -it ubuntu bash
Ubuntuのイメージはまだホストにはありませんが、ない場合にはdocker hubよりpullしてきてくれます。 その後、コンテナが作られてbashが動作するコマンドになります。
この時Docker hubより4つpullしているのが分かります。これはイメージレイヤになっています。
このイメージレイヤはそれぞれ独立しています。そのため、新しいイメージレイヤを追加することで全体として別のDockerイメージを作ることができます。つまり、もともとある部分を共通で使うことでリソースの節約を行い、新たにイメージレイヤを追加することで新しいDockerイメージを作成しコンテナを作成します。
入ったコンテナから出る場合はexitのコマンドを使います。
$ exit
Ubuntuのコンテナを更新する
Docker imageを更新する方法としてDocker fileを更新する方法と、コンテナから更新する方法があります。ここではコンテナからDocker imageを作る方法を行います。 更新する内容ですが、"test"という空ファイルを作成します。
ファイルを追加してこのレイヤを新しいレイヤとして追加したイメージを作成します。
先ほど作成したUbuntuのイメージを立ち上げます。
$ docker run -it ubuntu bash
Ubuntuが立ち上がり、bashが起動します。起動したコマンドラインより"touch"コマンドよりファイルを追加します。その後、Ubuntuから"exit"により抜け出します。
$ touch test $ exit
これにより、コンテナ内にtestファイルが追加されたことになります。
"docker ps -a"コマンドでコンテナの状態がどのようになっているかを確認します。
$ docker ps -a
ubuntuというイメージがあり、bashコマンドが最初に実行されたことがわかります。
コンテナを再起動する
docker ps
一度、停止したコンテナを再起動します。まず、コンテナのIDと状態を確認するため、"docker ps -a"コマンドを実行します。
$ docker ps -a
この時 パラメータの"CONTAINER ID"にコンテナのIDが入ります。これは起動時のパラメータとして使うことができます。また、他のパラメータに"STATUS"があります。これは"Exited"になっいることがわかります。つまり、コンテナが稼働していなことになります。
docker restart
このコンテナを起動するわけですが一度起動して抜けたしたコンテナを再起動するには"restart"コマンドを使用します。再起動するコンテナは先ほどのコンテナIDを使います。
$ docker restart ce1afc0e2d3a
再度"docker ps -a"コマンドを実行してコンテナの状態を確認します。"Up"となっていることがわかり、コンテナが稼働しています。
docker exec
コンテナが稼働していることがわかりましたので、次にこのコンテナに入ります。コンテナに入るためには"docker exec -it
$ docker exec -it ce1afc0e2d3a bash
detachとattach
次にコンテナから抜けます。コンテナから抜けるには今までは"exit"コマンドを使用していました。この"exit"コマンドはコンテナを抜ける際にプロセスを切って抜けます。このため"docker ps"で確認できるステータスが"Exited"になります。
このプロセスを切らずにコンテナから抜ける方法としてdetachがあります。detachをすると抜けた後のコンテナのステータスが"Up"のままになります。
detatchはコンテナに入った後"Ctl + p +q"で実行ることができます。
detach後の稼働中のコンテナに再び入ります。稼働中のコンテナに入るには"attach"コマンドを使います。 コンテナに入る方法としてはexecとattachがあります。
"attach"は稼働中のコンテナの PIC=0 のプライマリプロセスに接続して、exit するとコンテンが停止します。
execは稼働中のコンテナで別プロセスを実行します。その後exit するとそのプロセスのみが停止します。
まとめ
今回はps、restart、exec、detach、attachを実行してみました。プロセスの停止などちょっとわかりにくいですが、だんだん慣れるのではないかと思います。