我有一个上传到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实例。
  • 在创建GCE实例时,使用此选项将附加的磁盘安装到docker容器:--container-mount-host-path mount-path = / mnt / disks / appdata,host-path = / var / lib / postgresql / data ,mode = rw

  • 我被困在第一步。我创建了一个磁盘,将其附加到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/

    10-16 06:47