如何将docker容器中的目录挂载到主机上

假设我有这个简单的Dockerfile的应用程序:

//... RUN configure.sh --logmyfiles /var/lib/myapp ENTRYPOINT ["starter.sh"] CMD ["run"] EXPOSE 8080 VOLUME ["/var/lib/myapp"] 

我从中运行一个容器:

 sudo docker run -d --name myapp -p 8080:8080 myapp:latest 

所以它正常工作,并将一些日志存储在docker容器的/var/lib/myapp中。

我的问题

我需要这些日志文件自动保存在主机,所以我怎么能从容器挂载/var/lib/myapp/var/lib/myapp在主机服务器(不删除当前容器)?

编辑

我也看到docker – 从容器挂载目录到主机 ,但它不能解决我的问题,我需要一种方法来备份我的文件从docker到主机。

首先是关于Docker卷的一些信息。 卷挂载仅在创build容器时发生。 这意味着您启动容器后无法更改卷装入。 而且,卷的装载仅限于单向:从主机到容器,而不是反之亦然。 当你在你的容器中指定一个挂载为卷的主机目录(例如: docker run -d --name="foo" -v "/path/on/host:/path/on/container" ubuntu )时,它是一个“常规的ole”linux mount --bind ,这意味着主机目录将暂时“覆盖”容器目录。 实际上,目标目录上没有任何内容被删除或覆盖,但是由于容器的性质,这实际上意味着在容器的生命周期内它将被覆盖。

所以,你剩下两个选项(也许三个)。 您可以将一个主机目录挂载到您的容器中,然后将这些文件复制到您的启动脚本中(或者如果将cron引入到容器中 ,则可以使用cron定期将这些文件复制到该主机目录卷装入)。

您也可以使用docker cp将文件从容器移动到主机。 现在,这有点hacky,绝对不是你应该使用在你的基础设施自动化。 但是确实的目的确实很好。 一次性或debugging是一个很好的情况。

你也可以build立一个networking传输,但是这对你正在做的事情很有帮助。 但是,如果你想定期为你的日志文件(或其他)做这个,你可以使用rsyslog这样的东西来移动这些文件。

那么我怎样才能从容器挂载/ var / lib / myapp到主机服务器的/ var / lib / myapp

这是相反的:你可以在docker run一个主机文件夹到你的容器 。

(不移除当前容器)

我不这么认为。
现在,您可以检查docker inspect <containername>并查看是否在与容器关联的卷上的/var/lib/docker/volumes/...看到日志。

或者,您可以将docker logs <containername>的结果redirect到主机文件。
有关更多示例,请参阅此要点 。

另一种方法是将主机目录挂载为日志文件夹,然后直接在主机上访问日志文件。

 me@host~$ docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx dockerfile/nginx me@host~$ ls <log-dir> 

(再次,适用于您启动的容器,而不是现有的容器)