我是码头工人的新手。我仍然试图绕过这一切。
我正在构建一个节点应用程序(REST api),使用Postgresql来存储我的数据。
我花了几天时间学习码头工具,但我不确定我是否按照我应该的方式做事。
所以这是我的问题:
我使用官方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吗?
Persistance:我创建了一个数据库并在正在运行的容器上填充它。我使用pgadmin3进行连接。我可以停止并启动容器并保持数据,但我不确定为什么或如何发生这种情况。我可以在Dockerfile中看到官方postgres图像创建了一个卷(VOLUME / var / lib / postgresql / data),但我不确定这是继续工作的原因。你能否简单解释(或指出一个解释)这一切是如何运作的?
架构:根据我的阅读,似乎这种应用程序最合适的架构是运行3个独立的容器。一个用于数据库,一个用于持久化数据库数据,一个用于节点应用程序。这是一个很好的方法吗?如何使用数据容器改进事物? AFAIK我当前的设置没有一个正常工作。
还有什么我应该注意的吗?
由于
编辑:加入我的困惑,我刚从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来保存数据,因为这个快速测试并没有使用一个,所有的东西都可以正常工作。我在这里错过了什么吗?再次感谢
答案 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,很容易被丢弃并重新开始。
坚持:......我可以停下来开始 容器和数据是持久的,虽然我不确定为什么或 怎么会发生这种情况。 ...
那是因为你正在重复使用同一个容器。删除容器,数据消失。
架构:从我所看到的,似乎最合适 这种应用程序的架构将分别运行3个 容器。一个用于数据库,一个用于持久化数据库 数据,以及一个节点应用程序。这是一个很好的方法吗?如何 使用数据容器改进的东西? AFAIK我目前的设置是 没有人工作正常。
是的,这是通过为不同的问题分别设置容器的好方法。这在许多情况下都很方便,例如,当您需要升级postgres基础映像而不丢失数据时(特别是在数据容器开始发挥作用的情况下)。
还有什么我应该注意的吗?
熟悉docker基础知识后,您可以查看Docker compose或类似的工具,这些工具可以帮助您更轻松地运行多容器应用程序。
答案 1 :(得分:5)
简短而简单:
docker run
创建容器。容器生命周期命令是docker start/stop/restart/rm
是的,这是Docker的方式。docker run ... -v /yourdirectoryA -v /yourdirectoryB ...
定义的目录。卷外的所有内容都会丢失docker rm
。 docker rm -v
docker run ...
- 命令,并能够管理多容器和数据容器。注意:您需要一个阻塞线程才能使容器保持运行!必须在Dockerfile中显式设置此命令,请参阅CMD,或在docker run -d ... /usr/bin/myexamplecommand
命令的末尾给出。如果您的命令是非阻止的,例如/bin/bash
,然后容器将在执行命令后立即停止。