如何在 Docker 容器和宿主机之间共享数据
docker容器与宿主机之间共享数据
前言
通常 Docker 的容器不会随时处在运行状态,默认情况下,只能在容器在活跃状态且保持运行的时,才能在容器内部创建数据。如果想要随时访问容器内的信息,我们可以使用 Docker 的卷区,它可以让数据在容器和主机之间共享。
举例说明:假如我们想要使用官方的 Docker Nginx 镜像并保留 Nginx 日志的永久副本文件,供以后分析用。默认情况下,Nginx Docker 镜像会将日志文件存放在 Docker Nginx
容器的 /var/log/nginx
目录中。通常这种情况,我们不能通过宿主机直接访问。如果想在容器暂停状态时,宿主机也可调用这些日志来进行分析,我们应该如何打通宿主机与容器之间的数据?
本教程主要介绍如何打通宿主机与容器之间的数据,让它们可互相访问,方便我们随时调用。
准备工作
要根据本教程学习,首先我们要有一台安装好 Ubuntu 20.04 的服务器:
- 有 sudo 的 root 用户权限,大家可根据《Ubuntu 120.04初始服务器设置》(撰写中,稍后上线)指南来配置自己的服务器。
- Docker 已经按照Docker入门指南:如何在 Ubuntu 20.04 上安装和使用Docker的第1步和第2步中的说明进行安装。
注意: 本篇教程中,我们会在 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容器映射的端口访问容器
接下来,如果我们在主宿机上查看~/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 卷,以及创建的这个卷如何在容器和宿主机之间共享信息。当我们调试开发环境,需要查看日志时,容器与宿主机之间的信息共享能极大提升我们的工作效率。
上一篇: 如何在Ubuntu中安装Docker
下一篇: Linux信号的产生,处理