欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 10:29:33
...

如何在 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