我该如何使用Postgresql docker镜像/容器?

Awe*_*ler 7 postgresql docker dockerfile

我是码头工人的新手.我仍然试图绕过这一切.

我正在构建一个节点应用程序(REST api),使用Postgresql来存储我的数据.

我花了几天时间学习码头工具,但我不确定我是否按照我应该的方式做事.

所以这是我的问题:

  1. 我正在使用官方docker postgres 9.5映像作为基础来构建我自己的(我的Dockerfile只在它上面添加了plpython,并安装了一个自定义python模块以便在plpython存储过程中使用).我创建了我的容器作为postgres图像文档的建议:

    docker run --name some-postgres -e POSTGRES_PASSWORD = mysecretpassword -d postgres

    在我停止容器之后,我无法使用上面的命令再次运行它,因为容器已经存在.所以我开始使用docker start而不是docker run.这是正常的做事方式吗?我一般会在第一次使用docker run并且每隔一段时间启动docker吗?

  2. 持久性:我创建了一个数据库并在正在运行的容器上填充它.我使用pgadmin3进行连接.我可以停止并启动容器并保持数据,但我不确定为什么或如何发生这种情况.我可以在Dockerfile中看到官方postgres图像创建了一个卷(VOLUME/var/lib/postgresql/data),但我不确定这是继续工作的原因.你能否简要解释(或指出一个解释)这一切是如何运作的?

  3. 架构:从我读到的,似乎这种应用程序最合适的架构是运行3个独立的容器.一个用于数据库,一个用于持久化数据库数据,一个用于节点应用程序.这是一个很好的方法吗?如何使用数据容器改进事物?AFAIK我当前的设置没有一个正常工作.

  4. 还有什么我应该注意的吗?

谢谢

编辑:加入我的困惑,我刚刚从debian官方图片中运行了一个新容器(没有Dockerfile,只有docker run -i -t -d -name debtest debian/bin/bash).随着容器在后台运行,我使用docker attach debtest连接到它,然后继续apt-get install postgresql.一旦安装,我运行(仍然从容器内)psql并在默认的postgres数据库中创建一个表,并用1个记录填充它.然后我退出shell,容器自动停止,因为shell不再运行了.我使用docker start debtest启动容器,然后附加到它,最后再次运行psql.我发现自第一次运行以来一切都持续存在.安装了Postgresql,我的桌子就在那里,而且我所插入的记录也在那里.我真的很困惑为什么我需要一个VOLUME来保存数据,因为这个快速测试没有使用一个,所有的东西都可以很好地工作.我在这里错过了什么吗?

再次感谢

Myk*_*rov 6

1.

docker run --name some-postgres -e POSTGRES_PASSWORD = mysecretpassword -d postgres

在我停止容器之后,我无法使用上面的命令再次运行它,因为容器已经存在.

正确.你--name some-postgres在开始一个新的之前命名了它(),必须删除旧的,例如docker rm -f some-postgres

所以我开始使用docker start而不是docker run.这是正常的做事方式吗?我一般会在第一次使用docker run并且每隔一段时间启动docker吗?

不,这对码头工作者来说并不正常.Docker进程容器通常是短暂的,很容易丢弃并重新开始.

  1. 坚持:...我可以停止并启动容器并保持数据,但我不确定为什么或如何发生这种情况....

那是因为你正在重用同一个容器.删除容器,数据消失了.

  1. 架构:从我读到的,似乎这种应用程序最合适的架构是运行3个独立的容器.一个用于数据库,一个用于持久化数据库数据,一个用于节点应用程序.这是一个很好的方法吗?如何使用数据容器改进事物?AFAIK我当前的设置没有一个正常工作.

是的,这是通过为不同的问题分别设置容器的好方法.这在许多情况下都很方便,例如,当您需要升级postgres基础映像而不丢失数据时(特别是在数据容器开始发挥作用的情况下).

  1. 还有什么我应该注意的吗?

熟悉docker基础知识后,您可以查看Docker组合或类似工具,这些工具将帮助您更轻松地运行多容器应用程序.


bla*_*ops 5

简短而简单:

  1. 你从官方postgres图像得到的是一个随时可用的postgres安装以及一些可以通过环境变量配置的噱头.随着docker run你创建一个容器.容器生命周期命令是docker start/stop/restart/rmYes,这是Docker的方式.
  2. 卷内的所有内容都是持久的.每个容器都可以有任意数量的卷.卷是在Dockerfile,父Dockerfile或命令中定义的目录docker run ... -v /yourdirectoryA -v /yourdirectoryB ....卷之外的所有东西都会丢失docker rm.包括卷在内的所有东西都会丢失docker rm -v
  3. 展示比解释更容易.在Github上看看这个带有Docker命令的自述文件,阅读我如何使用Jira的官方PostgreSQL映像,并添加NGINX:Jira与Docker PostgreSQL.此外,数据容器是一种便宜的技巧,能够删除,重建和更新容器,而无需移动持久数据.
  4. 恭喜你,你已经掌握了基础知识!继续!尝试使用docker-compose来更好地管理那些令人讨厌的docker run ...命令,并能够管理多容器和数据容器.

注意:您需要一个阻塞线程才能使容器保持运行!必须在Dockerfile中显式设置此命令,请参阅CMD,或在docker run -d ... /usr/bin/myexamplecommand命令末尾给出.如果您的命令是非阻塞的,例如/bin/bash,那么容器将在执行命令后立即停止.