TOP
前: コンテナへのアクセス
次: コンテナに環境変数を設定
コンテナ内のファイルシステムは一時的な領域です。コンテナが無くなるとコンテナ内のファイルシステムに保存したデータも失われてしまいます。これを回避するにはコンテナに外部のボリュームをマウントしデータをその中に保存します。
-
centos:8のイメージを使いコンテナをバックグラウンドで実行してください。なお、centosのイメージはコマンドを指定しないとすぐに停止するのでsh -c "sleep 3600"などのコマンドを指定して実行してください。 -
作成したコンテナにログインし、適当な場所にテストファイルを作成してください。
-
コンテナを削除してください。
-
先ほどの手順と同じく
centos:8のイメージを使いコンテナをバックグランドで実行してください。 -
先ほど作成したテストファイルがなくなっていることを確認してください。
-
コンテナを削除してください。
このように、コンテナに変更を加えてもそのコンテナが失われるとデータも一緒に消えてしまいます。(なお、コンテナを削除ではなく停止すればテスト用のデータは消えませんが、コンテナを停止するという運用はあまり行わず起動/削除が一般的です。)
それでは、コンテナにボリュームをマウントさせてデータを保存してみます。
-
ホストOSに
~/host-dirというテスト用のディレクトリを作成してください。 -
centos:8のイメージを使いコンテナをバックグラウンドで実行してください。この時、先ほど作成したホストOSのテスト用ディレクトリをコンテナ内の/container-dirにマウントしてください。ボリュームマウントはdocker runコマンドのオプションで指定します。やり方は日本語マニュアルを参考にしてください。 -
作成したコンテナにログインし
/container-dirがあることを確認してください。 -
コンテナ内の
/container-dir配下にテスト用ファイルを作成してください。 -
コンテナを削除してください。
-
先ほどの手順と同じく
centos:8のイメージを使いコンテナをバックグラウンドで実行してください。この時、ホストOSのテスト用ディレクトリをコンテナ内の/container-dirにマウントしてください。 -
コンテナにログインし/container-dir配下のテスト用ファイルが
あることを確認してください。 -
ホストOSの
~/host-dir配下を確認してください。コンテナ内で作成したファイルがあるはずです。 -
ホストOSから
~/host-dir配下のテストファイルを削除してください。 -
コンテナにログインし、/container-dir配下のテスト用ファイルが
ないことを確認してください。 -
以下コマンドでコンテナをすべて削除してください。
docker rm -f `docker ps -a -q` -
ホストOSの
~/host-dirディレクトリを削除してください。
このように、コンテナにボリュームをマウントさせればデータをコンテナのライフサイクルと切り離すことができます。
答え(一例です)
- 以下コマンドを実行する。
docker run -d centos:8 sh -c "sleep 3600"
- 以下コマンドを実行する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47f4cbe7663 centos:8 "sh -c 'sleep 3600'" 44 seconds ago Up 40 seconds elastic_davinci
$ docker exec -it {docker psで確認したコンテナID} bash
# touch test.txt
- 以下コマンドを実行する。
$ docker rm -f {docker psで確認したコンテナID}
{docker psで確認したコンテナID}
- 1.と同じコマンドを実行する。
- 以下コマンドの手順で確認する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c2d5243c77b centos:8 "sh -c 'sleep 3600'" 7 seconds ago Up 5 seconds vibrant_bassi
$ docker exec -it {docker psで確認したコンテナID} bash
# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
- 3.と同じコマンドを実行する。
- 以下コマンドを実行する。
mkdir ~/host-dir
- 以下コマンドを実行する。ここで、
-vコマンドはイメージよりも前で記述することに注意してください。
docker run -d -v ~/host-dir:/container-dir centos:8 sh -c "sleep 3600"
- 以下コマンドの手順で確認する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83b2395f89b1 centos:8 "sh -c 'sleep 3600'" 4 seconds ago Up 3 seconds charming_noether
$ docker exec -it {docker psで確認したコンテナID} bash
# ls
bin container-dir dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
- 以下コマンドを実行する。
# cd container-dir/
# touch test.txt
- 3.と同じコマンドを実行する。
- 8.と同じコマンドを実行する。
- 以下コマンドの手順で確認する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30bbdf7e1ed7 centos:8 "sh -c 'sleep 3600'" 44 seconds ago Up 43 seconds hopeful_roentgen
$ docker exec -it {docker psで確認したコンテナID} bash
# ls container-dir/
test.txt
- 以下コマンドの手順で確認する。
# exit
exit
$ ls ~/host-dir/
test.txt
- 以下コマンドを実行する。
$ rm -f ~/host-dir/test.txt
- 以下コマンドの手順で確認する。
$ docker exec -it {docker psで確認したコンテナID} bash
# ls container-dir/
#
exitでコンテナから出た後、プラクティスの指示コマンドを実行してください。- 以下コマンドを実行する。
$ rm -rf ~/host-dir/
TOP
前: コンテナへのアクセス
次: コンテナに環境変数を設定