2016-02-05 109 views
4

我是新来的码头工人。我仍然试图把我的头围绕着这一切。我该如何使用Postgresql docker镜像/容器?

我建立一个节点的应用程序(REST API),使用PostgreSQL来存储我的数据。

我花了几天的学习泊坞窗,但我不知道我是否做的事情,我应该的方式。

因此,这里是我的问题:

  1. 我使用的是正式的Postgres泊坞窗9.5图像为基础,以建立自己的(我Dockerfile只增加plpython在它的上面,并安装一个定制的Python模块用于plpython存储过程中)。我建立了我的容器作为suggedsted Postgres的图像文档:

    搬运工运行--name一些-的Postgres -e POSTGRES_PASSWORD = mysecretpassword Postgres的-d

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

  2. 持久性:我创建了一个数据库,并填充它的运行容器上。我使用pgadmin3进行连接。我可以停止并启动容器,数据仍然存在,但我不确定这是为什么发生的。我可以在正式的Postgres图像将卷创建(VOLUME的/ var/lib中/ PostgreSQL的/数据)的Dockerfile看到的,但我不知道这是持久性工作的原因。你能否简单地解释一下(或者指出一个解释)这一切是如何运作的?

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

  4. 还有什么我要atention什么?

感谢

编辑:增加了我的困惑,我只是跑一个新的容器从Debian官方照片(不Dockerfile,只是码头工人运行-i -t -d --name debtest的debian /箱/ bash)的。随着容器在后台运行,我使用docker attach debtest连接到它,然后进入apt-get安装postgresql。一旦安装,我运行(仍然在容器内)psql,并在默认的postgres数据库中创建一个表,并用1条记录填充它。然后我退出了外壳,并且由于外壳不再运行,容器自动停止。我使用docker start debtest启动了容器,然后连接到它并最终再次运行psql。自第一次运行以来,我发现一切都持续存在。 Postgresql被安装,我的表在那里,而且我的插入记录也在那里。我真的很困惑,为什么我需要一个VOLUME来保存数据,因为这个快速测试没有使用一个,所有的apears都能正常工作。我在这里错过了什么吗?

再次感谢

回答

3

1.

搬运工运行--name一些-postgres的-e POSTGRES_PASSWORD = mysecretpassword -d postgres的

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

正确。因此,在开始新文件之前,您必须先删除旧文件(--name some-postgres),然后才能删除旧文件。 docker rm -f some-postgres

所以我把它用 搬运工开始,而不是搬运工运行启动。这是做 事情的正常方法吗?我一般会第一次使用码头运行,并且docker 每隔一段时间启动一次?

不,这绝不是正常的码头工人。 Docker进程容器通常应该是ephemeral,它很容易被丢弃并重新启动。

  • 持久性:......我可以停止和启动 容器和数据持久化,虽然我不知道为什么还是 怎么会发生这种情况。 ...

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

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

  • 是的,这是由具有不同的关注单独的容器去的好办法。这在许多情况下非常方便,例如,当您需要升级postgres基本映像而不丢失数据时(特别是数据容器开始扮演角色的地方)。

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

    当与泊坞窗基本熟悉,你可以看看Docker compose或类似工具,将帮助你运行的多容器应用程序更加容易。

    +0

    您认为持久性容器是个好主意! –

    +0

    @RobertGrant取决于你的情况。在某些情况下,它可能已经足够好了,有时候您可能希望拥有主机卷。有些设置完全禁止卷。 –

    +0

    这似乎是一个边缘情况下,而不是在答案中没有一个大的警告标志应该写的东西。 –

    3

    短而简单:

    1. 你从官方的Postgres的图像得到的是一个现成的Postgres去安装一些噱头,可以通过环境变量来配置一起。随着docker run你创建一个容器。容器生命周期命令是docker start/stop/restart/rm是的,这是Docker的方式。
    2. 卷内的所有内容都会保留。每个容器可以有任意数量的卷。卷是在Dockerfile,父Dockerfile内或通过命令docker run ... -v /yourdirectoryA -v /yourdirectoryB ...定义的目录。卷外的所有内容都会丢失docker rm。包括卷在内的所有内容都会丢失docker rm -v
    3. 显示比解释更容易。请参阅本自述文件,在Github上使用Docker命令,阅读如何使用官方PostgreSQL镜像用于Jira,并将NGINX添加到混合中:Jira with Docker PostgreSQL。另外一个数据容器是一个便宜的技巧,可以在不移动持久数据的情况下移除,重建和更新容器。
    4. 恭喜,您已经掌握了基本知识!继续!尝试docker-compose以更好地管理那些令人讨厌的docker run ...-命令并能够管理多容器和数据容器。

    注意:您需要一个阻塞线程,以保持一个容器中运行!此命令必须在Dockerfile中明确设置,请参阅CMD或在命令末尾给出。如果你的命令是非阻塞的,例如/bin/bash,那么在执行该命令后,容器将总是立即停止。