我应该如何使用Postgresql泊坞窗图像/容器?

我是docker工人。 我仍然试图把我的头围绕这一切。

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

我已经花了几天的时间了解了docker工人,但是我不确定自己是否按照我应有的方式做事。

所以这是我的问题:

  1. 我使用的官方dockerpostgres 9.5图像作为基础来build立自己的(我的Dockerfile只在其上添加plpython,并安装一个自定义的python模块,以便在plpython存储过程中使用)。 我创build了我的容器作为由postgres图像文档suggedsted:

    docker运行 – 名称some-postgres -e POSTGRES_PASSWORD = mysecretpassword -d postgres

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

  2. 坚持:我创build了一个数据库,并将其填充到正在运行的容器中。 我使用pgadmin3来连接。 我可以停止并启动容器,数据仍然存在,但我不确定这是怎么发生的。 我可以在官方postgres映像的Dockerfile中看到卷被创build(VOLUME / var / lib / postgresql / data),但我不确定这是持久性工作的原因。 请您简单介绍一下(或者指出一个解释)这一切是如何运作的?

  3. 架构:从我读到的,似乎这种应用程序最合适的架构将运行3个独立的容器。 一个用于数据库,一个用于保存数据库数据,另一个用于节点应用程序。 这是一个好办法吗? 如何使用数据容器改善事情? AFAIK我目前的设置工作正常,没有一个。

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

谢谢

编辑︰join我的困惑,我只是从debian官方图像(没有Dockerfile,只是docker运行-i -t -d – 名称debtest debian / bin / bash)运行一个新的容器。 随着容器在后台运行,我使用docker attach debtest连接到它,然后进行apt-get install postgresql。 一旦安装,我运行(仍然从容器内)psql,并在默认的postgres数据库中创build一个表,并填充1logging。 然后我退出了shell,因为shell没有运行,容器自动停止。 我使用docker start debtest启动容器,然后连接到它,最后再次运行psql。 自从第一次运行以来,我发现一切都是持续的。 Postgresql被安装,我的表在那里,而且我的插入logging也在那里。 我真的很困惑,为什么我需要一个VOLUME来保存数据,因为这个快速testing没有使用一个,所有的apears工作得很好。 我在这里错过了什么?

再次感谢

1。

docker运行 – 名称some-postgres -e POSTGRES_PASSWORD = mysecretpassword -d postgres

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

正确。 你把它命名为( --name some-postgres ),因此在启动一个新的之前,必须删除旧的,例如docker rm -f some-postgres

所以我使用docker start而不是docker run来启动它。 这是做事情的正常方式吗? 我通常会第一次使用docker运行,docker会每隔一段时间启动一次?

不,对docker工人来说,这绝不是正常的。 Docker进程容器通常应该是短暂的 ,很容易被丢弃并重新启动。

  1. 坚持:…我可以停止和启动容器,数据是持久的,但我不知道为什么会发生这种情况。 …

那是因为你正在重复使用同一个容器。 取出容器,数据不见了。

  1. 架构:从我读到的,似乎这种应用程序最合适的架构将运行3个独立的容器。 一个用于数据库,一个用于保存数据库数据,另一个用于节点应用程序。 这是一个好办法吗? 如何使用数据容器改善事情? AFAIK我目前的设置工作正常,没有一个。

是的,这是通过单独容器分开考虑的好方法。 这在许多情况下派上用场,例如,当你需要升级postgres基础镜像而不会丢失数据(特别是数据容器开始扮演angular色的地方)。

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

熟悉Docker基础知识时,可以查看Docker组合或类似的工具,这些工具将帮助您更轻松地运行multicontainer应用程序。

简单而简单:

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

注意:你需要一个阻塞线程来保持一个容器的运行! 这个命令必须在Dockerfile中明确设置,参见CMD,或者在docker docker run -d ... /usr/bin/myexamplecommand命令docker run -d ... /usr/bin/myexamplecommand 。 如果你的命令是非阻塞的,例如/bin/bash ,那么容器在执行命令后总会立即停止。