5. Volume
このラボでは Docker のデータ管理と Volume によるデータの永続化について学習します。
テキストを参照しながら各問題にチャレンジしてください。
必要があればウェブで調べても構いません。
ステップ 1: 問題 1/14
Docker のコンテナやイメージのデータはホストのどこに保存されますか。
- /var/lib/docker
- /tmp/docker
- /etc/docker
- /opt/docker
Answer
/var/lib/docker
ステップ 2: 問題 2/14
イメージ alpine を使用して sleep 1000 を実行する alpine-1 という名前のコンテナを detatched モードで実行してください。
- イメージ:
alpine - コンテナ名:
alpine-1 - 実行コマンド:
sleep 1000
Hints
docker run -d --name alpine-1 alpine sleep 1000 コマンドを使用します`
Solution
docker run -d --name alpine-1 alpine sleep 1000 コマンドを実行します
ステップ 3: 問題 3/14
いま起動したコンテナ内で touch newfile.txt コマンドを実行して新しいファイルを作成してください。
Hints
docker container exec コマンドを使用してコンテナ内で touch newfile.txt を実行します。
Solution
docker container exec alpine-1 touch newfile.txt コマンドを実行します
ステップ 4: 問題 4/14
docker container inspect alpine-1 を実行してください。 そして、GraphDriver.Data に表示された MergedDir と UpperDir のパスをコピーしてメモしてください。
出力結果の例:
GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/19e49dfa0dc9f46e11ed14b4fac87a58a8d6d3f952231d331f4f376794548c5d-init/diff:/var/lib/docker/overlay2/9aba14641007d2ee4f7c1ebd88c50e3111ce86d3b35786f0adc5e78c223ccb38/diff",
"MergedDir": "/var/lib/docker/overlay2/19e49dfa0dc9f46e11ed14b4fac87a58a8d6d3f952231d331f4f376794548c5d/merged",
"UpperDir": "/var/lib/docker/overlay2/19e49dfa0dc9f46e11ed14b4fac87a58a8d6d3f952231d331f4f376794548c5d/diff",
"WorkDir": "/var/lib/docker/overlay2/19e49dfa0dc9f46e11ed14b4fac87a58a8d6d3f952231d331f4f376794548c5d/work"
ステップ 5: 問題 5/14
ホストの /var/lib/docker/overlay2 にはイメージやコンテナのレイヤーのデータが保存されています。
先ほどコピーした MergedDir (末尾が merged で終わるパスのディレクトリ) にはイメージレイヤーとコンテナレイヤーの統合されたデータが含まれています。
以下のコマンドを実行して、結果に先ほど作成した newfile.txt が含まれていることを確認してください。
ls -la <MergedDir のパス>
ステップ 6: 問題 6/14
先ほどコピーした UpperDir (末尾が diff で終わるパスのディレクトリ) にはコンテナレイヤーのデータだけが含まれています。
以下のコマンドを実行してください。
今度は先ほどと違い、コンテナで作成した newfile.txt だけが含まれていることを確認してください。
ls -la <UpperDir のパス>
ステップ 7: 問題 7/14
コンテナ alpine-1 を削除してください。
Hints
まず docker container stop でコンテナを停止します。 そして docker container rm でコンテナを削除します。
Solution
以下を実行します。
docker container stop alpine-1
docker container rm alpine-1
ステップ 8: 問題 8/14
再度、先ほどコピーしたパスを使用して以下のコマンドを実行してください。
ls -la <UpperDir のパス>
コンテナが削除されたためレイヤーのデータも削除され、ファイルにアクセスできないことを確認します。
出力の例:
ls: cannot access '/var/lib/docker/overlay2/5b63e7a482bbe07ec5dcf69b55eb834324951bb9fafcbb4706ebc640795e79e2/diff/': No such file or directory
ステップ 9: 問題 9/14
my-volume という名前の volume を作成してください。
Hints
docker volume create コマンドを使用します`
Solution
docker volume create my-volume コマンドを実行します
ステップ 10: 問題 10/14
以下の設定で、my-volime をマウントしたコンテナを detached モードで起動してください。
- イメージ名:
nginx:latest - コンテナ名:
nginx-1 - マウントパス:
/usr/local/share/my-volume
Hints
docker container run で -v my-volume:/usr/local/share/my-volume を指定します。
Solution
docker container run -d --name nginx-1 -v my-volume:/usr/local/share/my-volume nginx:latest を実行します。
ステップ 11: 問題 11/14
コンテナ nginx-1 の /usr/local/share/my-volume に data.txt というファイルを作成して My important data という文字列を保存してください。これを実行することで、my-volume 内にファイルが保存されます。
コンテナ nginx-1 で bash -c "echo 'My important data' > /usr/local/share/my-volume/data.txt" を実行してください。 これを実行することで、my-volume 内にファイルが書き込まれます。
Hints
- ワンライナーで実行するには、
docker container execコマンドを使用してbash -c "echo 'My important data' > /usr/local/share/my-volume/data.txt"を実行します。 docker container exec -it nginx-1 bashでコンテナのシェルにアクセスし、echo 'My important data' > /usr/local/share/my-volume/data.txtを実行することもできます。
Solution
docker container exec nginx-1 bash -c "echo 'My important data' > /usr/local/share/my-volume/data.txt" を実行します。
ステップ 12: 問題 12/14
コンテナ nginx-1 を削除してください。
ステップ 13: 問題 13/14
以下の設定で、再度 my-volime をマウントしたコンテナを detached モードで起動してください。
- イメージ名:
nginx:latest - コンテナ名:
nginx-2 - マウントパス:
/usr/local/share/my-volume
Hints
docker container run で -v my-volume:/usr/local/share/my-volume を指定します。
Solution
docker container run -d --name nginx-2 -v my-volume:/usr/local/share/my-volume nginx:latest を実行します。
ステップ 14: 問題 14/14
コンテナ nginx-2 で cat /usr/local/share/my-volume/data.txt を実行してください。 コンテナ nginx-1 で保存したデータは残っていますか。
- 残っている
- 残っていない
Solution
docker container exec nginx-2 cat /usr/local/share/my-volume/data.txt を実行します。
Answer
残っている
完了
チャレンジ完了!
お疲れ様でした!