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

卡拉先生
发布于 2020年07月16日 | 上次编辑:2020年07月19日

docker容器与宿主机之间共享数据
docker容器与宿主机之间共享数据

前言

通常 Docker 的容器不会随时处在运行状态,默认情况下,只能在容器在活跃状态且保持运行的时,才能在容器内部创建数据。如果想要随时访问容器内的信息,我们可以使用 Docker 的卷区,它可以让数据在容器和主机之间共享。

举例说明:假如我们想要使用官方的 Docker Nginx 镜像并保留 Nginx 日志的永久副本文件,供以后分析用。默认情况下,Nginx Docker 镜像会将日志文件存放在 Docker Nginx 容器的 /var/log/nginx 目录中。通常这种情况,我们不能通过宿主机直接访问。如果想在容器暂停状态时,宿主机也可调用这些日志来进行分析,我们应该如何打通宿主机与容器之间的数据?

本教程主要介绍如何打通宿主机与容器之间的数据,让它们可互相访问,方便我们随时调用。

准备工作

要根据本教程学习,首先我们要有一台安装好 Ubuntu 20.04 的服务器:

注意: 本篇教程中,我们会在 Ubuntu 20.04 系统上安装和调试 Docker ,但这不妨碍各位读者使用其他安装有 Docker 的 Linux 系统跟随本教程学习。

第1步:绑定挂载卷

使用以下命令将 Nginxlogs 在当前用户的主目录中创建一个目录,并将其绑定挂载到 /var/log/nginx 容器中。

docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

让我们来逐个分析一下,以上这一串流畅的命令到底在干什么。

  • --name=nginx: 把Docker run命令运行起来的容器命名为 nginx,以便我们之后使用时,能够轻松找到它。
  • -d :在后台运行一个容器。
  • -v ~/nginxlogs:/var/log/nginx :设置一个绑定挂载 ( bindmount ) 的卷,这个卷将/var/log/nginx 目录从 Nginx 容器内部链接到~/nginxlogs 主机上的目录。Docker 命令用: 来将主机路径和容器路径分开,请注意前后顺序。前面为主机路径,后面为容器路径。
  • -p 5000:80 :设置端口转发。Nginx 容器默认监听 80 端口。这个参数是让容器映射 80 端口到主机的 5000 端口上。
  • 指定nginx 从 Nginx 镜像创建容器,此镜像将执行 nginx -g "daemon off" 启动 Nginx 的命令。

注1:当主机中没有Nignx镜像时,我们执行 docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx 命令后,主机没有正确从 Docker 官网下载 Nginx 镜像。那么请手动下载。

我们假设您已经完全掌握了 《如何在 Ubuntu 上安装和使用 Docker》 教程中所提到的从 Docker 官网下载镜像等技能。如果您还不了解,请首先阅读 这篇教程 ,再继续。

注2:-v 参数在使用上有一个很容易出错的点,请注意。如果-v 后面的路径是以/~/ 开头,则说明我们正在创建一个挂载卷。如果没有这个/ ,则说明我们正在给容器创建一个卷,它指向后面的路径。

让我们来看个例子就明白了。

例:

  • -v /path:/path/in/container 这是将宿主机的/path目录与容器的/path/in/container目录挂载。
  • -v path:/path/in/container 这段语句的意思是在容器里挂载名为path的卷,它的存放位置是/path/in/container

第2步:在主机上访问数据

现在,我们可以在主机上的 Docker 容器里运行 Nginx 的副本,并且通过上面的第 1 步我们已经将主机的 5000 端口映射到了容器内 Nginx 中的 80 端口上。

我们可以通过浏览器访问 http://`your_server_ip`:5000 ,会看到以下内容:

在宿主机上通过Docker容器映射的端口访问容器
在宿主机上通过Docker容器映射的端口访问容器

接下来,如果我们在主宿机上查看~/nginxlogs 目录,我们可以看到由 Nginx 容器创建的 access.log 文件

当我们打开 access.log

cat ~/nginxlogs/access.log

我们可以看到:

192.168.180.1 - - [16/Jul/2020:09:12:45 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" "-"
192.168.180.1 - - [16/Jul/2020:09:12:46 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.180.134:5000/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" "-"

如果我们对 ~/nginxlogs 文件夹里的内容做任何改动,都可以在 Docker 容器中实时查看到变化。

总结

在本教程中,我们学习了如何创建 Docker 卷,以及创建的这个卷如何在容器和宿主机之间共享信息。当我们调试开发环境,需要查看日志时,容器与宿主机之间的信息共享能极大提升我们的工作效率。

扩展阅读:Docker系列教程

© 2020, 卡拉搜索, Built with ❤️ in San Francisco + Beijing

京ICP备15049164号-3