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

我开发了一个nodejs应用程序,它在一端提供一个https(http / 2)接口,另一端与一个SQL Server数据库,一个SMTP邮件发送者和一个基于http的邮政编码查询服务对话。 实质上是一个基于Web的单页面应用程序。

这运行在一个公司局域网上的一个小树莓pi / 2上,在局域网上的windows计算机上与数据库交谈。 其他服务是外部的。 应用程序保持私密是很重要的。

这是这个应用程序的早期版本,所以会受到一些改变。 其中最复杂的将是如何升级到较新版本的节点,而不会停机很长时间。

昨天我遇到了Docker,更具体的是一篇关于如何在树莓派上设置Docker的文章。 这让我很兴奋,这可能是快速更新我的应用程序的解决scheme。 如果我将节点和我的应用程序打包到一个Docker容器中,我可以预先为最新版本的节点和我的应用程序构build容器,testing它们并确实非常快速地安装它们。

目前,Raspberry Pi文件系统的SD卡被configuration为4个分区。 1)是启动分区,2)是文件系统的根。 这两个都是只读的,3)是pi用户家的分区,4)是/ var,后两者是可读写的。

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

我刚刚在运行Debian的桌面(amd64)机器上安装了Docker。 据我所知,所有的Docker文件都在/ var / lib / docker下。 这包括组成加载图像的所有文件。 虽然有一个/ etc / docker目录,那里的唯一configuration似乎是一个关键。

所以我的问题是,是否有一种方法来configurationDocker,使得容器映像实际上可以位于在login到帐户时在读写之间切换的区域,并在注销时再次成为只读,但是部件写入容器的容器(也许没有 – 见下一段)坐下是/ var。

我的应用程序实际上是将其日志写入stdout和stderr。 目前,他们正在由PM2pipe理,PM2在退出时重新启动它们,而且还将日志写入一对旋转的日志文件。 不幸的是我有应用程序失败,PM2没有重新启动它的情况

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

我刚刚在运行Debian的桌面(amd64)机器上安装了Docker。 据我所知,所有的Docker文件都在/ var / lib / docker下。 这包括组成加载图像的所有文件。 虽然有一个/ etc / docker目录,那里的唯一configuration似乎是一个关键。

所以我的问题是,是否有一种方法来configurationDocker,使得容器映像实际上可以位于在login到帐户时在读写之间切换的区域,并在注销时再次成为只读,但是部件写入容器的容器(也许没有 – 见下一段)坐下是/ var。

您可以通过设置守护进程的--graph (或short -g )标志将Docker根目录从/var/lib/docker --graph为任何其他目录。 使用systemd时,可以使用简单的插件(例如,在/etc/systemd/system/docker.service.d )中完成此操作:

 [Service] ExecStart= ExecStart=/usr/bin/dockerd --graph=/path/to/readonly/dir 

确切的程序可能会有所不同,取决于您的Docker版本和Linux发行版。 有关更多信息,请参阅文档 。

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

我的应用程序实际上是将其日志写入stdout和stderr。 目前,他们正在由PM2pipe理,PM2在退出时重新启动它们,而且还将日志写入一对旋转的日志文件。 不幸的是我有应用程序失败的情况下,PM2没有重新启动它

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

您可以使用--restart=on-failure启动容器(请参阅有关重新启动策略的更多信息 )。 这将导致Docker引擎在存在非零退出代码的情况下自动重启容器。 或者,使用--restart=always让容器重新启动,而不pipe退出代码如何。 就个人而言,我build议不要在Docker内部使用PM2,以便进行简单的重启,除非您需要任何PM2的附加function。

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

如果这不是您想要的,则可以通过在启动容器时设置--log-driver标志(例如--log-driver=syslog )来更改日志logging机制。 再次请参阅文档以获取更多信息。