需求:
有2个容器,容器A和容器B需要进行IPC通信,容器A的图片buffer传输给容器B
现在需要验证:1 容器A 和 容器B 共享内存的可行性
方式一 容器间都共享宿主机的内存 :
//所有容器启动时加入该参数docker run--ipc=host
1 docker容器间共享内存的可行性:
启动docker B
docker run --privileged --net=host --pid=host --ipc=host --name='dockerA' -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /userdata:/userdata -itd hy_biaoji:v0.2.2 /bin/bash
启动docker B
docker run --privileged --net=host --pid=host --ipc=host --name='dockerB' -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /userdata:/userdata -itd hy_biaoji:v0.2.2 /bin/bash
注意参数--ipc=host docker中的进程要与宿主机使用共享内存通信,需要在启动容器的时候指定“--ipc=host”选项。然后再编写相应的共享内存的程序
docker A容器中写内存,docker B中读内存。
先将A容器中的写内存函数编译出来:
vim write.c 将写代码存入
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char name[5];
int age;
}people;
int main(int argc, char** argv)
{
int shm_id, i;
shm_id = shmget(0x1234, 4096, IPC_CREAT);
if (shm_id < 0)
{
perror("shmget error");
exit(1);
}
people* p_map;
p_map = (people*)shmat(shm_id, NULL, 0);
char temp = 'a';
for (i = 0; i<8; i++)
{
temp = temp+1;
memcpy((*(p_map +i)).name, &temp, 1);
(*(p_map +i)).age = 18 + i;
}
if (shmdt(p_map) == -1)
{
perror("shmdt eeror");
exit(1);
}
return 0;
}
vim write.c 将写代码存入
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char name[5];
int age;
}people;
int main(int argc, char** argv)
{
int shm_id, i;
key_t key;
shm_id = shmget(0x1234, 4096, IPC_CREAT);
if (shm_id == -1)
{
perror("shmget 1111 ");
exit(1);
}
people* p_map;
p_map = (people*) shmat(shm_id, NULL, 0);
char temp = 'a';
for(i = 0; i < 8; i++)
{
printf("name : %s age = %d\n",(*(p_map + i)).name, (*(p_map +i)).age)
}
if (shmdt(p_map) == -1)
{
perror("shmdt");
exit(0);
}
return 0;
}
编译这2个文件:
gcc -o write write.c
gcc -o read read.c
然后将生成的bin文件拷贝到容器中
docker cp ./write dockerA:/app/
docker cp ./read dockerB:/app/
进入到容器A中:进行write操作:
docker exec -it dockerA /bin/bash
进入到容器B中:进行read操作:
docker exec -it dockerB /bin/bash
验证成功
方式二 :共享其中某个容器的内存:
示例:假设使用容器A的内存
//启动容器A,将其设置为共享模式:
--ipc=shareable
//启动容器2,连接到容器1的内存
--ipc=container:dockerA
根据上面方式二创建容器A
docker run --privileged --net=host --pid=host --ipc=host --ipc=shareable --name='dockerA' -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /userdata:/userdata -itd hy_biaoji:v0.2.2 /bin/bash
根据上面方式二创建容器B
docker run --privileged --net=host --pid=host --ipc=host --ipc=container:dockerA --name='dockerB' -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /userdata:/userdata -itd hy_biaoji:v0.2.2 /bin/bash
然后将生成的bin文件拷贝到容器中
docker cp ./write dockerA:/app/
docker cp ./read dockerB:/app/
进入到容器A中:进行write操作:
docker exec -it dockerA /bin/bash
进入到容器B中:进行read操作:
docker exec -it dockerB /bin/bash
验证成功
网友评论