c++ - 在docker中编译不同内核的代码会受到什么影响?

标签 c++ docker lxc

我可以信任在 Ubuntu 14.04 主机中为 redhat6.4 构建的 docker 容器中的 c/c++ 源代码吗?或者我需要考虑的任何限制?

我们正在尝试使用 docker 服务于不同的操作系统平台来编译源代码,因为 docker 中的技术是共享主机操作系统的内核,请参见相关问题 What is the relationship between the docker host OS and the container base image OS?

  • 我的主机操作系统是 ubuntu 14.04(易于安装 docker),内核是 3.13.0-24-generic
  • 我的应用平台是redhat 6.4(内核是2.6.32-358.el6.x86_64)

当我为 Ubuntu 的 RHEL 创建容器时,内核也更新为 3.13.0-24-generic

我的应用程序是基于 c/c++ 和 java 的。

我认为 java 对于编译的 .jar 文件不会有任何问题,因为它是基于 jvm 的。

而对于 c/c++ 代码,我的理解主要是它依赖于 libc 类共享库,而不依赖于内核,因此是否可以将编译后的代码用于真正的 redhat 环境。

此设置仅用于开发,不用于生产,生成的二进制文件应该安装在带有 RHEL 或 VM 的真实独立机器上。

那么我需要考虑什么吗?

可能是更多 lxc 相关的问题。

已更新以添加一些示例

我下载了gameoflife代码https://github.com/rvsjoen/game-of-life , 并在两个系统中编译,寻找这种情况,因为 md5 是相同的,结果是相同的并且是可信的。

这是VM中的redhat 6.4系统

[root@redhat game-of-life-master]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
[root@redhat game-of-life-master]# uname -a
Linux redhat 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64x86_64 GNU/Linux
[root@redhat]# ldd gol
    linux-vdso.so.1 =>  (0x00007fffaeaa8000)
    libncurses.so.5 => /lib64/libncurses.so.5 (0x00000033fa000000)
    libc.so.6 => /lib64/libc.so.6 (0x00000033f9c00000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000033fb800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000033f9800000)
    /lib64/ld-linux-x86-64.so.2 (0x00000033f9400000)
[root@redhat]# md5sum gol
4f3245d3d61b1c73e48537dd612d37c3  gol

这是docker容器中的redhat

bash-4.1# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
bash-4.1# uname -a
Linux f51c7b4e80aa 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash-4.1# ldd gol
    linux-vdso.so.1 =>  (0x00007fff5e3c2000)
    libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f2e84863000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f2e844d0000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f2e842ae000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f2e840aa000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2e84a8e000)
bash-4.1# md5sum gol
4f3245d3d61b1c73e48537dd612d37c3  gol

c/c++ 代码有什么异常(exception)吗?

最佳答案

在正常情况下,本地编译代码(C、C++...)也不异常(exception)。

如您所写,程序与 libc 交互,而不是内核,除非非常特殊的情况。

libc 库不会在您的 Ubuntu 主机和您的 Redhat 容器之间共享。您的容器有自己的 libc,可将系统调用抽象到内核。

关于内核本身,请注意,即使 Linux 内核内部结构趋向于移动,总是不断演化代码片段,但公开公开的内容(ABI,用户空间应用程序和 libc 可访问)是在版本之间保持稳定和兼容。在极少数情况下,这种兼容性已被打破,大多数时候,不是故意的。 (参见 this article)。

所以,是的,使用 RHEL 开发人员是绝对安全的。 Ubuntu 主机上的环境,并信任从此容器生成的构建。

关于c++ - 在docker中编译不同内核的代码会受到什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23945109/

相关文章:

docker - 链接Docker容器(Drupal和MariaDB)

posix - "posix isolation"是什么?

linux - LXC 是如何实现网络命名空间的?

c++ - VS 2015 c++ 编译问题

c++ - 为什么 sizeof(*node) 给出结构的大小而不是指针的大小

c++ - 如何修复我的代码以删除字符串中的空格?

c++ - 从函数返回对内的unique_ptr后的段错误

Makefile - 附加到命令

python - 使用最少的依赖关系/权限将Docker容器镜像镜像到Google Container Registry

linux - LXC:是来自linuxcontainers.org还是Linux内核的一部分?