如何在Docker容器和主机之间共享数据

来自菜鸟教程
跳转至:导航、​搜索

介绍

通常,Docker 容器是短暂的,运行时间与容器中发出的命令完成所需的时间一样长。 默认情况下,在容器内创建的任何数据仅在容器内且仅在容器运行时可用。

Docker 卷可用于在主机系统和 Docker 容器之间共享文件。 例如,假设您想使用官方的 Docker Nginx 映像并保留 Nginx 日志文件的永久副本以供以后分析。 默认情况下,nginx Docker 镜像将记录到 /var/log/nginx 目录 Docker Nginx 容器。 通常它无法从主机文件系统访问。

在本教程中,我们将探讨如何使容器内部的数据在主机上可访问。

先决条件

要阅读本文,您将需要一个 Ubuntu 18.04 服务器,其中包含以下内容:

如果您是 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 容器之间共享数据