如何使用postgres数据库,Docker和Kubernetes来保存数据?

我正在试图在我的容器上运行Postgres自定义映像的永久磁盘。 我正在使用Kubernetes并遵循本教程。

这是我的db_pod.yaml文件:

 apiVersion: v1 kind: Pod metadata: name: lp-db labels: name: lp-db spec: containers: - image: my_username/my-db name: my-db ports: - containerPort: 5432 name: my-db volumeMounts: - name: pg-data mountPath: /var/lib/postgresql/data volumes: - name: pg-data gcePersistentDisk: pdName: my-db-disk fsType: ext4 

我使用gcloud compute disks create --size 200GB my-db-disk命令gcloud compute disks create --size 200GB my-db-disk

但是,当我运行pod时,将其删除,然后再次运行(如本教程中所述),我的数据不会持久化。

我试过这个文件的多个版本,包括PersistentVolumes和PersistentVolumeClaims,我试着改变mountPath,但没有成功。

编辑

用于创buildPostgres图像的Dockerfile:

 FROM ubuntu:trusty RUN rm /bin/sh && \ ln -s /bin/bash /bin/sh # Get Postgres RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" >> /etc/apt/sources.list.d/pgdg.list RUN apt-get update && \ apt-get install -y wget RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - # Install virtualenv (will be needed later) RUN apt-get update && \ apt-get install -y \ libjpeg-dev \ libpq-dev \ postgresql-9.4 \ python-dev \ python-pip \ python-virtualenv \ strace \ supervisor # Grab gosu for easy step-down from root RUN gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture)" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture).asc" \ && gpg --verify /usr/local/bin/gosu.asc \ && rm /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && apt-get purge -y --auto-remove ca-certificates wget # make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \ && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 ENV LANG en_US.utf8 # Adjust PostgreSQL configuration so that remote connections to the database are possible. RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.4/main/pg_hba.conf # And add ``listen_addresses`` to ``/etc/postgresql/9.4/main/postgresql.conf`` RUN echo "listen_addresses='*'" >> /etc/postgresql/9.4/main/postgresql.conf RUN echo "log_directory='/var/log/postgresql'" >> /etc/postgresql/9.4/main/postgresql.conf # Add all code from the project and all config files WORKDIR /home/projects/my-project COPY . . # Add VOLUMEs to allow backup of config, logs and databases ENV PGDATA /var/lib/postgresql/data VOLUME /var/lib/postgresql/data # Expose an entrypoint and a port RUN chmod +x scripts/sh/* EXPOSE 5432 ENTRYPOINT ["scripts/sh/entrypoint-postgres.sh"] 

和入口点脚本:

 echo " I am " && gosu postgres whoami gosu postgres /etc/init.d/postgresql start && echo 'Started postgres' gosu postgres psql --command "CREATE USER myuser WITH SUPERUSER PASSWORD 'mypassword';" && echo 'Created user' gosu postgres createdb -O myuser mydb && echo 'Created db' # This just keeps the container alive. tail -F /var/log/postgresql/postgresql-9.4-main.log 

最后,似乎真正的问题是我试图从我的入口脚本创build数据库的事实。 诸如创build数据库或用户的事情应该在创build容器时完成所以我最终使用了标准的Postgres镜像,它实际上提供了一个简单而方便的方法来创build一个用户和一个数据库。

这是Postgres的全functionconfiguration文件。

 apiVersion: v1 kind: Pod metadata: name: postgres labels: name: postgres spec: containers: - name: postgres image: postgres env: - name: PGDATA value: /var/lib/postgresql/data/pgdata - name: POSTGRES_USER value: myuser - name: POSTGRES_PASSWORD value: mypassword - name: POSTGRES_DB value: mydb ports: - containerPort: 5432 volumeMounts: - mountPath: /var/lib/postgresql/data name: pg-data volumes: - name: pg-data persistentVolumeClaim: claimName: pg-data-claim 

感谢所有帮助我的人:)

  • 你的自定义postgresql持续数据在/ var / lib / postgresql /数据?
  • 你能够从你的postgresql容器获取日志,并发现有趣的东西?
  • 当你的pod运行时,你能看到你的容器内的挂载点,并检查持久磁盘在那里吗?

我遵循这个场景,我能够通过将mountPath更改为/ var / lib / postgresql并使用cassandra(即/ var / lib / cassandra for mountPath)来保存我的数据。

我能够从不同的节点/主机删除/重新启动豆荚,仍然可以看到我的“用户”表和我以前input的数据。 但是,我没有使用自定义图像,我只是使用标准的泊坞窗图像。