我正在尝试了解连接到主机并连接到Docker容器内的应用程序的网络数据包所发生的情况.
如果它是一个经典的虚拟机,我知道到达主机的数据包将由虚拟机管理程序(比如VMware,VBox等)传输到虚拟机的虚拟网卡,并从那里通过客户机操作系统的TCP/IP堆栈传输,终于达到了申请.
在Docker的情况下,我知道主机上的数据包从主机的网络接口转发到docker0
网桥,该网桥连接到容器内veth
虚拟接口上的一对eth0
.但那之后呢?由于所有Docker容器都使用主机内核,假设数据包是由主机内核的TCP/IP堆栈处理的,这是正确的吗?如果是这样,怎么样?
我真的想阅读一个详细的解释(或者如果你知道一个资源可以随意链接它)关于真正发生的事情.我已经仔细阅读了这个页面,但它没有说明一切.
在此先感谢您的回复.
我处理具有不同进程的应用程序,并且我被要求包含这些进程以实现更多隔离.
问题是进程与单个"管理程序"进程共享内存以交换数据(它们使用经典的共享缓冲区).此解决方案是为了性能要求而实现的,因为它在用户空间中运行,因此用户空间和内核空间之间没有内容切换.
如果我没有错,则无法在单个IPC命名空间内运行多个docker容器,但我不知道单个docker容器是否可能属于不同的IPC命名空间,这可以解决我的问题.
其他解决方案是受欢迎的,请记住,性能是一项要求,提前谢谢.
我有一台主机,多个IP地址分配给一个网络接口.我想配置Docker,以便让容器"响应"每个容器到分配给主机的这些IP地址的单个IP.
这可以用libcontainer完成,还是必须使用LXC驱动程序并运行我的容器--lxc-conf="lxc.network..."
?
提前致谢.
UPDATE
我希望每个容器都可以从外面到达; 使用默认的Docker配置,我只能暴露一个端口并通过host_ip:exposed_port
而不是通过它到达容器container_ip:port
.可以通过某种方式配置第二个选项吗?
我正在尝试将多进程应用程序迁移到 Docker。不同的进程会被放置在不同的Docker容器中。
应用程序使用共享内存来交换数据并使用信号量来进行同步。我已经重新编译了 Docker,以便不使用 IPC 命名空间,并且我有效地检查了sudo ipcs -m
共享内存缓冲区是否可以从不同的容器访问。
问题是信号量不起作用。我编写了这些简单的程序来检查 Docker 中 POSIX 信号量的行为:
/* To be compiled with -lpthread */
#include <stdio.h>
#include <fcntl.h>
#include <semaphore.h>
int main(void) {
int ret, val;
sem_t * mySem;
printf("[ONE] Opening the semaphore...\n");
mySem = sem_open("sem1", O_CREAT, 0777, 0);
if (mySem == SEM_FAILED) {
printf("[ONE] Error on sem_open()\n");
return -1;
}
ret = sem_post(mySem);
getchar(); // Awful way to block execution of [ONE] for a while...
printf("[ONE] Waiting for [TWO]...\n");
ret = …
Run Code Online (Sandbox Code Playgroud) 我有一些重复运行的代码:
printf(“您要继续吗?是/否:\ n”);
keepplaying = getchar();
在下一个我的代码正在运行时,它不会等待输入。我发现第二个时间的getchar使用'\ n'作为字符。我在说这是由于sdio有一些缓冲区,所以它保存了最后一个输入“ Y \ n”或“ N \ n”。
我的问题是,在使用getchar之前如何刷新缓冲区,这会使getchar等待我的回答?
我正在编写一个 WSDL 文件,但无法从 Eclipse 验证器中消除此警告:
WS-I: (BP2208) wsdl:operation was not a request/response or one-way operation.
Run Code Online (Sandbox Code Playgroud)
这是我写的 WSDL 源代码:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="Master"
targetNamespace="http://pad.polito.it/ACSAuth"
xmlns:tns="http://pad.polito.it/ACSAuth"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
targetNamespace="http://pad.polito.it/ACSAuth"
xmlns:tns="http://pad.polito.it/ACSAuth">
<xs:element name="AccessDB" type="tns:AccessDBType">
<!-- OMITTED COMPLEX TYPE AccessDBType -->
<xs:element name="passThrough" type="tns:passThroughType"/>
<!-- OMITTED COMPLEX TYPE passThroughType -->
</xs:schema>
</types>
<message name="updatedDB">
<part name="db" element="tns:AccessDB"/>
</message>
<message name="passThroughNotice">
<part name="info" element="tns:passThrough"/>
</message>
<portType name="myPorts">
<operation name="updateManager">
<output name="newUpdate" message="tns:updatedDB"/>
</operation>
<operation name="noticeManager">
<input name="newNotice" message="tns:passThroughNotice"/>
</operation>
</portType> …
Run Code Online (Sandbox Code Playgroud) 我正在运行这个非常简单的程序:
class helloWorld {
public static void main(String[] args) throws InterruptedException {
while(true) {
System.out.println("Hello World!");
Thread.sleep(1000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么java虚拟机分配了这么多进程(它们有不同的PID),你能看到这里(htop_java_helloworld.png
):
java
jvm