如何在GCE和容器映像上使用持久存储

时间:2018-06-09 00:29:14

标签: docker google-compute-engine persistent-storage

我有一个上传到GCP容器注册表的docker镜像,其中包含在TomEE上运行的Web应用程序和用于数据持久性的postgres。我使用以下命令在端口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实例的公共地址访问,但是当重新启动GCE实例时,应用程序创建的任何数据到容器的postgres数据库都是丢失。我想将持久性磁盘挂载到容器中以获取postgres数据,这样数据就不会丢失,并且可以根据我读过的文档,为GCE支持的备份目的拍摄快照。

根据GCE的文档,我认为这是一个两步过程。

  1. 创建磁盘并将其附加到GCE实例。
  2. 在创建GCE实例时,使用此选项将附加磁盘挂载到docker容器: - container-mount-host-path mount-path = / mnt / disks / appdata,host-path = / var / lib / postgresql /数据,模式= RW
  3. 我被困在第一步。我创建了一个磁盘,将其连接到GCE实例,格式化新磁盘,安装它,并更新/ etc / fstab,以便在GCE"添加或调整持久磁盘后#34;#34;添加或调整持久磁盘&#34时重新启动磁盘;如何。所有步骤都适用于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实例中运行的容器中?

1 个答案:

答案 0 :(得分:0)

由于您正在运行基于容器的GCE实例,因此您必须以不同的方式创建和装入卷。并不是说使用/ etc / fstab对基于GCE容器的实例有限制,它只是一种不同的方法。

要在容器中创建和装入卷,您必须使用docker命令。您可以通过运行以下命令来创建卷:

$ docker volume create [volume_name]

我在官方的docker页面上附上了一篇关于如何在容器here中创建卷的文章。它还包括有关如何从容器备份和还原数据卷的步骤。文章建议使用卷,因为它更容易备份。

编辑:从我的研究来看,这似乎是Docker的一个问题。您可以详细了解该问题here