专栏首页云计算Docker in Action:共享内存命名空间

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

摘自“Docker in Action”一书,在本文中,我将展示如何在容器之间共享内存空间。

Linux为在同一台计算机上运行的进程之间提供了一些共享内存的工具。进程间通信(IPC)这种形式的性能表现基于存取速率。当与网络或基于管道的IPC相关等延时拖累的软件性能低于要求时,我们才经常使用它。基于共享内存的IPC应用中最好例子是科学计算和一些流行的数据库技术,如PostgreSQL。

Docker默认为每个容器创建一个专属的IPC命名空间。Linux IPC命名空间分区共享内存原语,如命名共享内存块和信号量,以及消息队列。如果你不懂这些是什么,也没关系。只要知道这些是Linux程序用于协调处理的工具就好了。IPC命名空间可防止一个容器中的进程访问主机或其他容器中的内存。

#在容器之间共享IPC原语

我创建了一个名为allingeek / ch6_ipc的镜像,它包含一个服务提供方和一个服务调用方。他们使用共享内存进行通信。表1将通过在单独的容器中运行实例来帮助您理解这些问题。

表1:启动一对通信程序

# 运行服务提供者

docker -d -u nobody --name ch6\_ipc\_producer \ 

  allingeek / ch6\_ipc -producer 

# 运行服务调用者

docker -d -u nobody --name ch6\_ipc\_consumer \ 

  allingeek/ch6\_ipc -consumer

表1启用了两个容器。第一个容器创建了一个消息队列,并开始在其上广播消息。第二个应该从消息队列中拉出并将消息写入日志。你可以通过使用以下命令来查看每个日志的执行情况:

docker logs ch6\_ipc\_producer

docker logs ch6\_ipc\_consumer

如果您执行了表1中的命令,应该会发现错误,那就是服务调用方永远看不到队列中的任何消息。他们每个进程都了使用相同的密钥来标识共享内存资源,但他们引用了不同的内存,归根结底就是每个容器都有专属自己的共享内存命名空间。

如果您需要运行与容器间共享内存进行通信的程序,则需要使用--ipc标志来引入它们的IPC命名空间。--ipc标志有一个容器模式,将在与另一个目标容器相同的IPC名称空间中创建一个新的容器。

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

# 删除原服务调用者Docker

rm  -v ch6\_ipc\_consumer

# 引入IPC命名空间并启用一个新的服务调用者Docker

docker -d --name ch6\_ipc\_consumer \

  --ipc container:ch6\_ipc\_producer \

  allingeek/ch6\_ipc -consumer

表2重建了服务调用方的容器并重用了ch6_ipc_producer容器的IPC命名空间。这一次服务调用方应该能够访问服务器正在写入的同一个内存位置。你可以通过使用以下命令检查日志来检视其生效:

docker logs ch6\_ipc\_producer

docker logs ch6\_ipc\_consumer

请记住,在继续之前清理正在运行的容器:

#记住:V选项将清理卷标

# F选项关闭容器如果正在运行

# rm命令将会对容器列表

docker rm -vf ch6\_ipc\_producer ch6\_ipc\_consumer

重用容器的共享内存命名空间有明显的安全隐患。但是如果你还是需要这样的做话,这是可行的。并且在容器之间共享内存比与主机共享内存更安全。

本文的版权归 InF1n 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 业务流程的概述以及用处

    [本文由Yaron Parasol编写]

    Techeek
  • Docker for Devs:创建一个开发版镜像

    Docker for Devs 系列包括以下6篇文章,这是第二篇。

    Techeek
  • 容器只是一个起点

    容器,Docker,Kubernetes已经出现有四年了。以致于有些人甚至认为这项技术是成熟的!但是,我强烈认为,容器基础设施的构造任然处于成长阶段。

    Techeek
  • Docker in action: 共享内存命名空间

    本文摘自“ Docker in Action ”一书,在此文中,我将向您展示如何打开对容器之间共享内存的访问。

    QiqiHe
  • NET Core+MySql+Nginx 容器化部署

    1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容...

    企鹅号小编
  • .NET和Docker ,比翼双飞

    DockerCon 2019本周将在旧金山举行 ,DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团...

    张善友
  • 2018-07-04 .NET及相关开发资讯速递

    2.Injecting Services to ASP.NET Core Controller Actions

    Rector
  • 「web应用架构」有原则GraphQL

    尽管名为GraphQL,但它并不是一种简单的查询语言。这是一个全面解决现代应用与云服务之间连接问题的方案。因此,它构成了现代应用程序开发堆栈中一个新的重要层的基...

    首席架构师智库
  • 利用AI技术改变视频中的环境

    人工智能(AI)作为科技领域冉冉升起的一颗新星,其发展一直备受业界的关注。许多我们熟知的科技公司也都在各自的领域深挖人工智能所带来的潜力,而Nvidia就是其中...

    企鹅号小编
  • 在Azure DevOps上编译.NET Core 2.2工程

    .NET Core 2.2 已经推出几周了,然而Azure DevOps的编译管道至今还在爆。微软还没有给Hosted VS2017的Agent安装.NET C...

    Edi Wang

扫码关注云+社区

领取腾讯云代金券