我开发了一个nodejs应用程序,它一方面提供https(http / 2)接口,另一方面与SQL Server数据库,SMTP邮件发件人和基于http的邮政编码查询服务进行通信。本质上是一个基于Web的单页面应用程序。
这是在一个小型的覆盆子pi / 2上运行,它位于公司局域网上,与局域网上的Windows机器上的数据库通信。其他服务是外部的。应用程序保持私密非常重要。
这是此应用程序的早期版本,因此会有一些更改。其中最复杂的是如何在没有长时间停机的情况下升级到更新版本的节点。
昨天我遇到了Docker,更具体地说是一篇关于如何在覆盆子pi上设置Docker的文章。令我兴奋的是,这可能是快速更新我的应用程序的解决方案。如果我将节点和我的应用程序打包到Docker容器中,我可以为最新版本的节点和我的应用程序预先构建容器,测试它们并确实非常快速地安装它们。
目前,Raspberry Pi文件系统的SD卡配置为4个分区。 1)是启动分区,2)是文件系统的根。这两个都是只读的,3)是pi用户家的分区,4)是/ var后两个是读写的。
原因是安装后的软件除了日志(进入/ var)外都是只读的。防止断电时SD卡损坏。我确实有一个用户在只读区域中有一个主目录,并且其设置使得登录将文件系统转为rw直到他再次注销。我在这个用户运行命令来安装最新的生产版本。一些测试和开发可以在pi用户中进行,这就是该区域是可读写的原因。
我刚刚在运行Debian的桌面(amd64)机器上安装了Docker。据我所知,所有Docker文件都位于/ var / lib / docker下。这包括组成加载图像的所有文件。虽然有一个/ etc / docker目录,但那里的唯一配置似乎是一个密钥。
所以我的问题是,有没有办法配置Docker,以便容器图像实际上可以放在我在登录帐户时在读写之间切换的区域,并在我注销时再次变为只读时但写入的容器部分(可能没有 - 见下一段)就是/ var。
我的应用程序实际上将其日志写入stdout和stderr。目前它们由PM2管理,它们在退出时重新启动它们,但也将日志写入它旋转的一对日志文件。不幸的是我遇到了应用程序失败并且PM2没有重新启动它的实例
我怀疑Docker也可以设置为自动重启失败的容器,我也可以设置它,以便将内容stdout和stderr重定向到Docker容器外的文件中。这将使以后更容易查看它们。这可能吗?确实,如果有可能是好的做法,或者我会更好地继续在Docker容器中使用pm2
答案 0 :(得分:2)
我刚刚在运行Debian的桌面(amd64)机器上安装了Docker。据我所知,所有Docker文件都位于/ var / lib / docker下。这包括组成加载图像的所有文件。虽然有一个/ etc / docker目录,但那里的唯一配置似乎是一个密钥。
所以我的问题是,有没有办法配置Docker,以便容器图像实际上可以放在我在登录帐户时在读写之间切换的区域,并在我注销时再次变为只读时但写入的容器部分(可能没有 - 见下一段)就是/ var。
您可以通过设置守护程序的/var/lib/docker
(或短--graph
)标记,将Docker根目录从-g
更改为任何其他目录。使用systemd时,您可以使用简单的插件来完成此操作(例如,在/etc/systemd/system/docker.service.d
中):
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/path/to/readonly/dir
具体步骤可能因Docker版本和Linux发行版而异。有关详细信息,请参阅the documentation。
但是,这会影响图像和容器文件系统存储。只有一个只读,另一个是可写的,这种方式是不可能的。
我的应用程序实际上将其日志写入stdout和stderr。目前它们由PM2管理,它们在退出时重新启动它们,但也将日志写入它旋转的一对日志文件。不幸的是,我遇到了应用程序失败且PM2没有重新启动的情况
我怀疑Docker也可以设置为自动重启失败的容器,我也可以设置它,以便将内容stdout和stderr重定向到Docker容器外的文件中。这将使以后更容易查看它们。这可能吗?确实,如果有可能是好的做法,或者我会更好地继续在Docker容器中使用pm2
您可以使用--restart=on-failure
启动容器(请参阅more on restart policies)。这将导致Docker引擎自动重启容器(如果它存在非零退出代码)。或者,使用--restart=always
重新启动容器,而不管退出代码如何。就个人而言,我建议不要在Docker中使用PM2进行简单的故障重启,除非您需要任何PM2的附加功能。
关于日志记录:默认情况下,Docker将捕获容器主进程的所有STDOUT和STDERR输出,并将它们存储在自己的日志文件中(默认情况下,在/var/lib/docker/containers/<CONTAINER-ID>/<CONTAINER-ID>-json.log
中)。您可以使用docker logs <CONTAINER-NAME>
查看它们。
如果这不是您想要的,您可以通过在启动容器时设置--log-driver
标志来更改日志记录机制(例如,更改为--log-driver=syslog
)。再次,请参阅the documentation以获取更多信息。