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

Lar*_*Cai 7 c++ lxc docker

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

我们正在尝试使用 docker 服务于不同的 OS 平台来编译源代码,因为 docker 中的技术是共享主机 os 的内核,请参阅相关问题docker 主机 OS 和容器基础映像 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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

c/c++ 代码有什么例外吗?

mba*_*emy 6

在正常情况下,本机编译的代码(C、C++...)也不例外。

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

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

关于内核本身,请注意,即使 Linux 内核内部结构趋向于移动,总是不断发展代码片段,公开公开的内容(用户空间应用程序可访问的 ABI 和libc)在版本之间保持稳定和兼容。在极少数情况下,大多数情况下,这种兼容性已被破坏,并非有意为之。(见这篇文章)。

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