如何将Docker容器中的目录挂载到主机?

时间:2016-03-27 10:02:45

标签: docker dockerfile

假设我有一个使用这个简单的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 - Mount Directory From Container to Host,但它并没有解决我的问题我需要一种方法将我的文件从docker备份到主机。

2 个答案:

答案 0 :(得分:16)

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

所以,你有两个选择(可能是三个)。您可以将主机目录挂载到容器中,然后在启动脚本中复制这些文件(或者如果您bring cron into your container,则可以使用cron定期将这些文件复制到该主机目录卷挂载中。)

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

您也可以设置网络传输,但这非常适合您正在做的事情。但是,如果您希望定期为日志文件(或其他)执行此操作,则可以考虑使用rsyslog之类的内容将这些文件从容器中移除。

答案 1 :(得分:2)

  

那么如何将/ var / lib / myapp从容器挂载到主机服务器中的/ var / lib / myapp

恰恰相反:你可以mount an host folder to your container on docker run

  

(不删除当前容器)

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

或者您可以将docker logs <containername>的结果重定向到主机文件 有关更多示例,请参阅this gist

  

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

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> 

(同样,这适用于您启动的容器,而不是现有的运行容器)