前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker in Action:共享内存命名空间

Docker in Action:共享内存命名空间

作者头像
用户1209583
发布2018-01-15 10:33:26
3.4K0
发布2018-01-15 10:33:26

本文摘自“ Docker in Action ”(Docker实战)一书,将向您展示在容器之间共享内存的方法。

Linux提供了一些在同一台计算机上运行的进程之间共享内存的工具,如果利用这些工具共享内存来实现进程间通信(IPC),将可以达到内存级别的速度。当进程之间的通信由于使用到网络或基于管道(pipe)的IPC时,过大的延迟会导致软件性能低于我们想达到的要求,此时我们经常会使用到共享内存的技术来降低延迟,提高程序性能。最显著的例子是科学计算(要求高性能)的场景和一些流行的数据库技术,如PostgreSQL。

Docker默认为每个容器创建一个唯一的IPC命名空间。Linux系统的IPC命名空间之间共享内存原语,如命名共享内存块、信号量,以及消息队列。如果你不清楚以上提到的这些概念,只需知道它们是Linux系统用于协调进程的工具。IPC命名空间可防止一个容器中的进程访问到物理主机的内存或其他容器中的内存。

在容器之间共享IPC内存原语

下面我们会创建一个名为allingeek / ch6_ipc的镜像,它包含一个生产者进程和一个消费者进程。他们之间使用共享内存进行通信。 List 1是在两个独立的容器中分别运行生产者进程和消费者进程来进行通信的命令。

List 1:启动一对通信程序
代码语言:docker
复制
# 启动生产者进程容器
docker -d -u nobody --name ch6_ipc_producer allingeek/ch6_ipc -producer  
代码语言:docker
复制
# 启动消费者进程容器
docker -d -u nobody --name ch6_ipc_consumer allingeek/ch6_ipc -consumer

List 1 的命令将会启动两个容器。第一个容器将会创建一个消息队列,并开始在队列中增加消息广播出去。第二个将从消息队列中读取消息并写入日志。你可以通过使用以下命令来查看两个容器的日志,来判断两个容器内进程的执行情况:

代码语言:javascript
复制
docker logs ch6_ipc_producer
docker logs ch6_ipc_consumer

执行了List1中的命令并查看日志,将会发现得到的结果和我们预期的不同。消费者进程的日志中永远不会看到生产者进程的消息队列中的任何消息。即便这两个进程使用相同的关键字来标识他们的共享内存资源,但最终却指向了不同的内存空间。原因是每一个容器都有它自己的共享内存命名空间。

如果您需要运行一个程序,在不同容器中之间通过共享内存进行通信,就需要使用--ipc标志来让它们加入同一个IPC命名空间。--ipc标志会使新建容器运行在新的容器模式下,从而在目标容器相同的IPC命名空间中创建一个新的容器。

List 2:加入共享内存命名空间

代码语言:docker
复制
#删除原来的消费者进程docker容器
rm  -v ch6_ipc_consumer
#创建一个新的消费者进程容器并加入生产者进程容器的IPC命名空间
docker -d --name ch6_ipc_consumer --ipc container:ch6_ipc_producer allingeek/ch6_ipc -consumer

List 2重建了消费者进程容器,并重用了ch6_ipc_producer容器的IPC命名空间。这一次,消费者进程应该能够访问生产者进程容器在服务器内存中写入的同一个内存位置。同样,我们可以通过以下命令查看日志观察运行情况:

代码语言:javascript
复制
docker logs ch6_ipc_producer
docker logs ch6_ipc_consumer

最后,在开始下一个课程之前,请记得清理正在运行的容器:

代码语言:docker
复制
#提示:v选项将清理掉容器卷的内容,f选项会在容器运行的时候强制终止容器
#rm命令可以接受一列的容器作为参数来一次性删除列表中的所有容器 
docker rm -vf ch6_ipc_producer ch6_ipc_consumer

重用容器的共享内存命名空间有明显的安全隐患。但是如果有需要的话,是可以通过--ipc标志来实现的(如上所述)。无论如何,在容器之间共享内存也比在物理主机之间共享内存要安全得多。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在容器之间共享IPC内存原语
    • List 1:启动一对通信程序
      • List 2:加入共享内存命名空间
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档