如何将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>
(再次,适用于您启动的容器,而不是现有的容器)