如何在Docker容器和主机之间共享数据
介绍
通常,Docker 容器是短暂的,运行时间与容器中发出的命令完成所需的时间一样长。 默认情况下,在容器内创建的任何数据仅在容器内且仅在容器运行时可用。
Docker 卷可用于在主机系统和 Docker 容器之间共享文件。 例如,假设您想使用官方的 Docker Nginx 映像并保留 Nginx 日志文件的永久副本以供以后分析。 默认情况下,nginx
Docker 镜像将记录到 /var/log/nginx
目录 内 Docker Nginx 容器。 通常它无法从主机文件系统访问。
在本教程中,我们将探讨如何使容器内部的数据在主机上可访问。
先决条件
要阅读本文,您将需要一个 Ubuntu 18.04 服务器,其中包含以下内容:
- 具有
sudo
权限的非 root 用户,遵循 使用 Ubuntu 18.04 的初始服务器设置指南。 - 使用 How To Install and Use Docker on Ubuntu 18.04 的 Step 1 和 Step 2 中的说明安装 Docker。
如果您是 Docker 新手,Docker 生态系统 系列提供了关键概念的详细概述。
注意: 尽管先决条件给出了在 Ubuntu 18.04 上安装 Docker 的说明,但只要安装了 Docker,本文中用于 Docker 数据卷的 docker
命令应该可以在其他操作系统上运行。
第 1 步 — 绑定卷
以下命令将在您当前用户的主目录中创建一个名为 nginxlogs
的目录,并将其绑定到容器中的 /var/log/nginx
:
docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx
让我们花点时间详细研究一下这个命令:
--name=nginx
命名容器,以便我们可以更轻松地引用它。-d
分离进程并在后台运行它。 否则,我们只会看到一个空的 Nginx 提示,并且在我们杀死 Nginx 之前无法使用这个终端。-v ~/nginxlogs:/var/log/nginx
设置绑定挂载卷,将 Nginx 容器内部的/var/log/nginx
目录链接到主机上的~/nginxlogs
目录。 Docker 使用:
将主机路径与容器路径分开,并且主机路径总是在前。-p 5000:80
设置端口转发。 Nginx 容器默认监听端口80
。 此标志将容器的端口80
映射到主机系统上的端口5000
。nginx
指定容器应该从 Nginx 镜像构建,它发出命令 nginx -g "daemon off" 来启动 Nginx。
注意: -v
标志非常灵活。 它可以绑定或命名一个卷,只需稍微调整语法。 如果第一个参数以 /
或 ~/
开头,则您正在创建绑定挂载。 删除它,您将命名该卷。
-v /path:/path/in/container
挂载主机目录,/path
在/path/in/container
-v path:/path/in/container
创建一个名为path
的卷,与主机无关。
有关命名卷的更多信息,请参阅 如何在 Docker 容器之间共享数据
第 2 步 — 访问主机上的数据
现在,我们的机器上的 Docker 容器中运行了 Nginx 的副本,并且我们主机的端口 5000
直接映射到 Nginx 的端口 80
的副本。
使用服务器的 IP 地址或主机名和端口号在 Web 浏览器中加载地址:http://your_server_ip:5000
。 你应该看到:
更有趣的是,如果我们查看主机上的 ~/nginxlogs
目录,我们将看到由容器的 nginx
创建的 access.log
将显示我们的请求:
cat ~/nginxlogs/access.log
这应该显示如下内容:
Output203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"
如果您对 ~/nginxlogs
文件夹进行任何更改,您也可以从 Docker 容器中实时看到它们。
结论
在本教程中,我们演示了如何创建 Docker 数据卷以在容器和主机文件系统之间共享信息。 这在需要访问日志以进行调试的开发环境中很有帮助。 要了解有关在容器之间共享持久数据的更多信息,请查看 如何在 Docker 容器之间共享数据。