我可以告诉Docker在我的文件系统中的什么位置放置只读和读写部件吗

我可以告诉Docker在我的文件系统中的什么位置放置只读和读写部件吗,docker,Docker,我开发了一个nodejs应用程序,它一方面提供https(http/2)接口,另一方面与sqlserver数据库、SMTP邮件发送者和基于http的邮政编码查找服务进行通信。本质上,它是一个基于web的单页应用程序 它运行在公司局域网上的一个小树莓pi/2上,与局域网上windows机器上的数据库进行通信。其他服务是外部的。应用程序保持私有是很重要的 这是此应用程序的早期版本,因此可能会有一些更改。其中最复杂的将是如何升级到较新版本的node,而无需长时间停机 昨天我遇到了Docker,更具体地

我开发了一个nodejs应用程序,它一方面提供https(http/2)接口,另一方面与sqlserver数据库、SMTP邮件发送者和基于http的邮政编码查找服务进行通信。本质上,它是一个基于web的单页应用程序

它运行在公司局域网上的一个小树莓pi/2上,与局域网上windows机器上的数据库进行通信。其他服务是外部的。应用程序保持私有是很重要的

这是此应用程序的早期版本,因此可能会有一些更改。其中最复杂的将是如何升级到较新版本的node,而无需长时间停机

昨天我遇到了Docker,更具体地说是一篇关于如何在树莓圆周率上设置Docker的文章。这可能是快速更新我的应用程序的解决方案,这让我很兴奋。如果我将node和我的应用程序打包到Docker容器中,我可以为node和我的应用程序的最新版本预构建容器,测试它们并快速安装它们

目前,Raspberry Pi文件系统的SD卡配置为4个分区。1) 是引导分区,2)是文件系统的根。这两个都是只读的,3)是pi用户主页的分区,4)是/var,后两个是读写的

原因是,软件一旦安装,除了日志(进入/var)之外,都是只读的。为防止SD卡在断电时损坏。我确实有一个用户在只读区中有一个主目录,并且它的设置使得logon关闭文件系统rw,直到他再次注销。此用户是我运行命令以安装最新产品版本的位置。一些测试和开发可以在pi用户中进行,这就是为什么该区域是读写的

我刚刚在运行Debian的台式机(amd64)上安装了Docker。据我所知,所有Docker文件都位于/var/lib/Docker下。这包括构成加载图像的所有文件。虽然有一个/etc/docker目录,但其中唯一的配置似乎是一个键

因此,我的问题是,是否有一种方法可以配置Docker,使容器映像实际上位于当我登录到那里的帐户时在读写之间切换的区域,并在我注销时再次变为只读,但被写入的容器部分(可能没有-请参阅下一段)位于/var

我的应用程序实际上将其日志写入stdout和stderr。目前,它们由PM2进行管理,PM2在它们退出时重新启动它们,但也将日志写入一对日志文件,并进行旋转。不幸的是,我有一些应用程序失败的实例,PM2没有重新启动它

我怀疑Docker也可能被设置为自动重新启动一个失败的容器,我还可以设置它,以便将内容stdout和stderr重定向到Docker容器之外的文件中。这将使以后更容易查看它们。这可能吗?事实上,如果可能的话,这是一种良好的做法,还是我会更好地继续在Docker容器内使用pm2

我刚刚在运行Debian的台式机(amd64)上安装了Docker。据我所知,所有Docker文件都位于/var/lib/Docker下。这包括构成加载图像的所有文件。虽然有一个/etc/docker目录,但其中唯一的配置似乎是一个键

因此,我的问题是,是否有一种方法可以配置Docker,使容器映像实际上位于当我登录到那里的帐户时在读写之间切换的区域,并在我注销时再次变为只读,但被写入的容器部分(可能没有-请参阅下一段)位于/var

通过设置守护进程的
--graph
(或short
-g
)标志,可以将Docker根目录从
/var/lib/Docker
更改为任何其他目录。使用systemd时,您可以通过一个简单的下拉菜单(例如,在
/etc/systemd/system/docker.service.d
中)来完成这一点:

具体过程可能因Docker版本和Linux发行版而异。有关更多信息,请参阅

但是,这将影响映像和容器文件系统存储。一个是只读的,另一个是可写的,这是不可能的

我的应用程序实际上将其日志写入stdout和stderr。目前,它们由PM2进行管理,PM2在它们退出时重新启动它们,但也将日志写入一对日志文件,并进行旋转。不幸的是,我有一些应用程序失败的实例,PM2没有重新启动它

我怀疑Docker也可能被设置为自动重新启动一个失败的容器,我还可以设置它,以便将内容stdout和stderr重定向到Docker容器之外的文件中。这将使以后更容易查看它们。这可能吗?事实上,如果可能的话,这是一种良好的做法,还是我会更好地继续在Docker容器内使用pm2

您可以使用
--restart=on failure
启动容器(请参阅)。这将导致Docker引擎自动重新启动具有非零退出代码的容器。或者,使用
--restart=always
重新启动容器,而不考虑退出代码。就个人而言,我建议不要在Docker内部使用PM2进行简单的故障重启,除非您需要PM2的任何附加功能

关于日志记录:默认情况下,Docker将捕获容器主进程的所有STDOUT和STDERR输出,并将它们存储在自己的日志文件中(默认情况下,存储在
/var/lib/Docker/containers//-json.log
中)。您可以使用
docker日志查看它们

如果这不是什么
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/path/to/readonly/dir