Dockerを初めて使用することを認めることから始めます。間違った一連の仮定からこの問題に近づいているのかもしれません。その場合はお知らせください。Dockerが展開にどのように役立つかについて多くの議論を見てきましたが、実際にどのように行われるかについての例はありません。
これがうまくいくと思った方法は次のとおりです。
- マシンAに永続データを保持するデータコンテナを作成します
- データコンテナのボリュームを使用するアプリケーションコンテナを作成します
- データコンテナ内のデータを変更する可能性のある作業を行います
- アプリケーションコンテナを停止します
- データコンテナのコミットとタグ付け
- データコンテナを(プライベート)リポジトリにプッシュします
- マシンBでステップ6のイメージをプルして実行します
- マシンBで中断したところから再開する
ここで重要なステップはステップ5です。これは、現在の状態(ファイルシステムの内容を含む)を保存すると思ったものです。その後、その状態をリポジトリにプッシュし、他の場所からプルすることで、元のコンテナと基本的に同じ新しいコンテナを作成できます。
しかし、そのようには機能しないようです。私が見つけたのは、ステップ5が思ったとおりに動作しないか、ステップ7(イメージのプルと実行)がコンテナを初期状態に「リセット」することです。
これをテストするために、3つのDockerイメージとコンテナーのセットをまとめました。データコンテナー、30秒ごとにデータコンテナー内のファイルにランダムな文字列を書き込むライター、およびecho
データの値を単純に読み取るリーダーコンテナファイルと終了します。
データコンテナ
で作成
docker run \
--name datatest_data \
-v /datafolder \
myrepository:5000/datatest-data:latest
Dockerfile:
FROM ubuntu:trusty
# make the data folder
#
RUN mkdir /datafolder
# write something to the data file
#
RUN echo "no data here!" > /datafolder/data.txt
# expose the data folder
#
VOLUME /datafolder
作家
で作成
docker run \
--rm \
--name datatest_write \
--volumes-from datatest_data \
myrepository:5000/datatest-write:latest
Dockerfile:
FROM ubuntu:trusty
# Add script
#
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/*.sh
CMD ["/usr/local/sbin/run.sh"]
run.sh
#!/bin/bash
while :
do
sleep 30s
NEW_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
echo "$NEW_STRING" >> /datafolder/data.txt
date >> /datafolder/data.txt
echo "wrote '$NEW_STRING' to file"
done
このスクリプトは、ランダムな文字列と日付/時刻を/datafolder/data.txt
データコンテナーに書き込みます。
読者
で作成
docker run \
--rm \
--name datatest_read \
--volumes-from datatest_data \
myrepository:5000/datatest-read:latest
Dockerfile:
FROM ubuntu:trusty
# Add scripts
ADD run.sh /run.sh
RUN chmod 0777 /run.sh
CMD ["/run.sh"]
run.sh:
#!/bin/bash
echo "reading..."
echo "-----"
cat /datafolder/data.txt
echo "-----"
これらのコンテナをビルドして実行すると、それらは正常に実行され、期待どおりに動作します。
開発マシンで停止して開始:
- データコンテナを作成する
- ライターを実行する
- すぐにリーダーを実行してください。「データがありません!」を参照してください。メッセージ
- しばらく待ってください
- リーダーを実行し、ランダムな文字列を参照してください
- 作家を止める
- ライターを再起動します
- リーダーを実行し、同じランダムな文字列を見る
しかし、コミットとプッシュは私が期待することをしません:
- データコンテナを作成する
- ライターを実行する
- すぐにリーダーを実行してください。「データがありません!」を参照してください。メッセージ
- しばらく待ってください
- リーダーを実行し、ランダムな文字列を参照してください
- 作家を止める
- データコンテナにコミットしてタグを付けます
docker commit datatest_data myrepository:5000/datatest-data:latest
- リポジトリにプッシュする
- すべてのコンテナを削除して再作成します
この時点で、データコンテナがコミットされ、リポジトリにプッシュされ、リポジトリ内の同じイメージから再作成されているため、リーダーを実行し、同じランダムな文字列を確認します。ただし、実際に表示されるのは「データがありません!」です。メッセージ。
私がここで間違っている場所を誰かが説明できますか?または、代わりに、Dockerを使用した展開方法の例を教えてください。