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

时间:2016-02-05 19:43:25

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

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

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

  5. 由于

    编辑:加入我的困惑,我刚从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来保存数据,因为这个快速测试并没有使用一个,所有的东西都可以正常工作。我在这里错过了什么吗?

    再次感谢

2 个答案:

答案 0 :(得分:6)

1

  

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

     

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

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

  

所以我开始使用它   docker start而不是docker run。这是正常的做法吗?   事情呢?我一般会使用docker第一次运行和docker   每隔一段时间开始一次?

不,这对码头工作者来说并不正常。 Docker进程容器通常被认为是ephemeral,很容易被丢弃并重新开始。

  1.   

    坚持:......我可以停下来开始   容器和数据是持久的,虽然我不确定为什么或   怎么会发生这种情况。 ...

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

    1.   

      架构:从我所看到的,似乎最合适   这种应用程序的架构将分别运行3个   容器。一个用于数据库,一个用于持久化数据库   数据,以及一个节点应用程序。这是一个很好的方法吗?如何   使用数据容器改进的东西? AFAIK我目前的设置是   没有人工作正常。

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

      1.   

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

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

答案 1 :(得分:5)

简短而简单:

  1. 你从官方postgres图像得到的是一个随时可用的postgres安装以及一些可以通过环境变量配置的噱头。使用docker run创建容器。容器生命周期命令是docker start/stop/restart/rm是的,这是Docker的方式。
  2. 卷内的所有内容都会保留。每个容器都可以有任意数量的卷。卷是在Dockerfile,父Dockerfile内部或通过命令docker run ... -v /yourdirectoryA -v /yourdirectoryB ...定义的目录。卷外的所有内容都会丢失docker rmdocker rm -v
  3. 会丢失包括卷在内的所有内容
  4. 展示比解释更容易。在Github上使用Docker命令查看本自述文件,阅读我如何使用Jira的官方PostgreSQL图像,并添加NGINX:Jira with Docker PostgreSQL。此外,数据容器是一种便宜的技巧,能够删除,重建和更新容器,而无需移动持久数据。
  5. 恭喜,您已成功掌握了基础知识!继续!尝试使用docker-compose来更好地管理那些讨厌的docker run ... - 命令,并能够管理多容器和数据容器。
  6. 注意:您需要一个阻塞线程才能使容器保持运行!必须在Dockerfile中显式设置此命令,请参阅CMD,或在docker run -d ... /usr/bin/myexamplecommand命令的末尾给出。如果您的命令是非阻止的,例如/bin/bash,然后容器将在执行命令后立即停止。