何はともあれ、Vagrantっぽくベースとなるイメージをとってこよう
> docker pull centos:centos7
cenotosのimage
をとってこれた。
image
は、OSインストールする際のCD-ROMみたいなものだと思うといいかもしれない。
> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 b5b4d78bc90c 5 weeks ago 203MB
コンテナをつくる。コンテナはimage
をもとに動く仮想環境みたいなもの。vagrant up
したら起動するやつって思ってていい。
> docker run b5b4d78bc90c ls
anaconda-post.log
bin
dev
etc
home
# 省略
これは、イメージIDb5b4d78bc90c
もとにコンテナを作って、ls
コマンド叩いた結果になってる。
Vagrantから入門した場合、ここでまず戸惑うかと思う。自分も、え?コマンド叩いたのはわかったけど、コンテナどうなったの?って思った。
結論から言うと、このコンテナは、lsコマンドを叩くためだけに起動して、lsコマンドを叩き終わったら、終了している。
docker ps -a
を叩くとコンテナを確認することができる。
-a
は、停止しているコンテナも表示するっていうオプション。
��Status欄を見ると、Exitedになってるね。
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353e87f036e4 b5b4d78bc90c "ls" 2 seconds ago Exited (0) 1 second ago hardcore_shtern
試しに、sleep
を使って処理を遅延させてみよう。
# 10秒後にlsを叩くコマンド
> docker run b5b4d78bc90c sleep 10s;ls
このとき急いで、別ターミナルでdocker ps
を叩くと起動中のコンテナとして確認できる
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2c89808ede3 b5b4d78bc90c "sleep 10s;" 5 seconds ago Up 3 seconds gifted_kowalevski
ちなみに、docker run
は毎回イメージからコンテナをつくってしまう。
停止中のコンテナを起動するには、docker start コンテナID
でいける。
# 起動
$ docker start 5895622e50c8
# 起動していることが確認できる
$ docker ps
- imageは、コンテナを作成する大本のCDROMみたいなもの
- コンテナはimageから作成されて、コンテナに実行するコマンドが終了すると、コンテナは終了しちゃう
- 終了したコンテナは再度起動できる
コンテナ起動中であれば、コンテナに渡したコマンドとは別のコマンドを実行できる。 sleepを60秒に増やしてみよう。
> docker run b5b4d78bc90c sleep 60s
その状態で、docker ps でコンテナIDを確認して、以下を叩くと起動したコンテナ内でdate
コマンドが実行される
> docker exec コンテナID date
Thu Jun 11 07:41:39 UTC 2020
この考え方の延長で、起動中のコンテナに端末をアタッチすることができる。
# 682fd380744dはコンテナID
> docker exec -it 682fd380744d bash
[root@682fd380744d /]#
これは、bashを新しく起動して、そのプロセスに��疑似端末を割り当てるってコマンド。 疑似端末否々はLinuxのログインの知識があんまりわかってないので、うまく説明できない。
今のやり方は、
- コンテナに60秒sleepさせるコマンドを実行させる
- 起動中のコンテナにアタッチする
というフローを踏ん出る。
これはちょっと回りくどくって、最初からコンテナにbashを起動させるようにしてあげればいい。
# bashはなくてもうまくいくみたい
> docker run -it イメージID bash
root@44c6e2199a2f /]#
root@44c6e2199a2f /]# exit
次にコンテナ内を更新してみる。
作成したコンテナを再度起動しよう。その際、 -i
をつけると、同じように端末をアタッチすることができる。
>docker start -i コンテナID
[root@44c6e2199a2f /]# touch test.txt
[root@44c6e2199a2f /]# exit
ファイルを作成したら、exitでコンテナを抜けよう。
コンテナは終了してしまうので、再度起動し、もっかいコンテナに接続してみよう。
>docker start -i コンテナID
[root@44c6e2199a2f /]# ls
さっきつくったファイルが残っていることが確認できる。
一方、別のコンテナを作成してみよう。
> docker run -it b5b4d78bc90c bash
[root@55f7832f7ce2 /]# ls
こうすると、新しくできたコンテナにはさっきのファイルが存在しないことがわかる。
- コンテナ単位でデータ(状態)が管理される。
- コンテナが終了しても、データは残ったまま。