美文网首页
docker 进程间通信验证

docker 进程间通信验证

作者: 硕到做到 | 来源:发表于2023-02-05 11:37 被阅读0次

    需求:

    有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

    验证成功

    相关文章

      网友评论

          本文标题:docker 进程间通信验证

          本文链接:https://www.haomeiwen.com/subject/hsubhxtx.html