首先,我承认我是Docker的新手,我可能是从错误的假设中解决了这个问题……让我知道是否是这种情况。我已经看到了很多关于Docker如何对部署有用的讨论,但是没有有关如何实际完成的示例。
这是我认为可行的方式:
- 创建数据容器以在计算机A上保存一些持久性数据
- 创建使用数据容器中的卷的应用程序容器
- 做一些工作,可能会更改数据容器中的数据
- 停止应用程序容器
- 提交并标记数据容器
- 将数据容器推送到(专用)存储库
- 在计算机B上拉并运行第6步中的图像
- 从您在机器B上停下来的地方接起
这里的关键步骤是步骤5,我认为这将保存当前状态(包括文件系统的内容)。然后,您可以将该状态推送到存储库,然后从其他位置将其拉出,从而为您提供一个与原始容器基本相同的新容器。
但这似乎不起作用。我发现步骤5并没有执行我认为的操作,或者步骤7(拉动并运行映像)将容器“重置”为初始状态。
我整理了一组三个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"]
运行
#!/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进行部署的示例?