我有一个上传到GCP容器注册表的Docker镜像,其中包含一个在TomEE和postgres上运行的Web应用程序,以实现数据持久性。我创建了一个计算引擎实例,并使用以下命令在端口8443上公开了HTTPS访问。
gcloud beta compute instances create-with-container MY_VM --tags MY_TAG --machine-type=n1-standard-2 --container-image IMAGE_ID
gcloud compute firewall-rules create MY_VM-8443 --allow tcp:8443 --source-ranges 0.0.0.0/0 --target-tags MY_TAG
这可以部署应用程序并使之可以通过端口8443上的GCE实例的公共(public)地址进行访问,但是重新启动GCE实例时,该应用程序创建到容器的postgres数据库的所有数据都会丢失。我想将一个永久性磁盘装入用于Postgres数据的容器中,以使数据不会丢失,并且能够为备份目的拍摄快照,这是GCE根据我阅读的文档所支持的。
根据GCE的文档,我认为这是一个两步过程。
我被困在第一步。我创建了一个磁盘,将其附加到GCE实例,格式化了新磁盘,安装了它,并更新了/ etc / fstab,因此应按照GCE“添加或调整持久性磁盘”的操作方法在启动时重新安装该磁盘。所有步骤都可以完成fstab更改。当我使用以下命令停止并重新启动GCE实例时,/ etc / fstab的内容未保留(尝试了整个过程几次)...
gcloud compute instances stop MY_VM
gcloud compute instances start MY_VM
为了验证我正确地执行了此过程,我尝试使用通过以下命令创建的非容器GCE实例尝试相同的磁盘设置。当实例停止并启动时,此工作按预期进行,还原了/ etc / fstab并装入了磁盘。
gcloud compute instances create test-host --tags test-server --machine-type=f1-micro
为了完整起见,这是用于设置附加磁盘的命令类型。
gcloud beta compute ssh MY_VM
sudo lsblk # List the attached disks
sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
sudo mkdir -p /mnt/disks/appdata
sudo mount -o discard,defaults /dev/sdb /mnt/disks/appdata
sudo chmod a+w /mnt/disks/appdata
sudo cp /etc/fstab /etc/fstab.backup
sudo blkid /dev/sdb # Get the block ID for the disk
sudo vi /etc/fstab # Add the line below
UUID=[UUID_VALUE] /mnt/disks/appdata ext4 discard,defaults 0 2
使用/ etc / fstab的基于GCE容器的实例是否有限制?
如果这应该工作,如何调试重新启动时丢失/ etc / fstab的问题?
是否有更好的方法向GCE实例中运行的容器添加持久性存储?
最佳答案
由于您正在运行基于容器的GCE实例,因此必须以其他方式创建和安装卷。使用/ etc / fstab并不限制基于GCE容器的实例,这只是一种不同的方法。
要在容器中创建和装载卷,您将必须使用docker命令。您可以通过运行以下命令来创建卷:
$ docker volume创建[volume_name]
我已经附上了官方docker页面上的文章,内容涉及如何在容器here中创建卷。它还包括有关如何从容器备份和还原数据卷的步骤。本文建议使用卷,因为它更容易备份。
编辑:根据我的研究,这似乎是Docker的问题。您可以阅读有关问题here的更多信息。
关于docker - 如何在GCE和容器镜像上使用持久性存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50769879/