ClearContainer 网络部分源码分析
// cc-oci-runtime/src/oci.c
/*!
* Create the state file, apply mounts and run hooks, but do not start the VM
*/
gboolean cc_oci_create(struct cc_oci_config *config)
(1)、依次调用cc_oci_config_file_parse(config),cc_oci_config_check(config),cc_oci_runtime_dir_setup(config)和cc_oci_handle_mounts(config)
(2)、当cc_pod_is_vm(config)为true时,调用cc_oci_vm_launch(config),否则调用cc_pod_container_create(config)
// cc-oci-runtime/src/process.c
/*!
* Start the hypervisor as a child process.
* Due to the way networking is handled in Docker, the logic here is unfortunately rather complex.
* \param config \ref cc_oci_config.
* \return \c true on success, else \c false.
*/
gboolean cc_oci_vm_launch(struct cc_oci_config *config)
(1)、调用setup_networking = cc_oci_enable_networking(); --->仅仅只是确定是否是root,因为要创建interface
...
(2)、调用config->state.status = OCI_STATUS_CREATED;
/* The namespace setup occurs in the parent to ensure the hooks run successfully. The child will
* automatically inherit the namespaces.
*/
(3)、调用cc_oci_ns_setup(config)
/* Connect to the proxy before launching the shim so that the proxy socket fd can be passed to the shim*/
(4)、调用cc_proxy_connect(config->proxy)
/* Set up comms channels to the child:
* - one to pass the full list of expanded hypervisor arguments.
* - one to allow detection of successful child setup: if the child closes the pipe,
* it was successful, but if it writes data to the pipe, setup failed.
*/
(5)、调用pipe2(child_err_pipe, O_CLOEXEC)和pipe2(hypervisor_args_pipe, O_CLOEXEC)
(6)、fork()一个子进程,在子进程中最终运行cc_oci_setup_child(config)以及execvp(args[0], args)
....
/* Run the pre-start hooks.
* Note that one of these hooks will configure the networking in the network namespace.
* If a hook returns a non-zero exit code, then an error including the exit code and the stderr is
* returned to the caller and the container is torn down.
*/
(7)、hook_status = cc_run_hooks(config->oci.hooks.prestart, config->state.state_file_path, true)
// add network config bits to following functions:
// - cc_oci_container_state()
// - oci_state()
// - cc_oci_update_options()
(8)、如果setup_networking为true,则依次调用hndl = netlink_init(),cc_oci_vm_netcfg_get(config, hndl)和cc_oci_network_create(config, hndl)
.......
// cc-oci-runtime/src/netlink.c
/*!
* Setup the netlink socket to use with netlink transactions.This handle should be used for all netlink
* transactions for a given thread.
*/
struct netlink_handle *netlink_init(void)
初始化一个netlink_handle实例
// cc-oci-runtime/src/process.c
/*!
* Obtain the network configuration by quering the network namespace.
* \param[in, out] config \ref cc_oci_config.
* \param hndl handle returned from a call to \ref netlink_init().
*/
private gboolean cc_oci_vm_netcfg_get(struct cc_oci_config *config, struct netlink_handle *hndl)
仅仅调用cc_oci_network_discover(config, hndl)
// cc-oci-runtime/src/networking.c
/*!
* Obtain the networking configuration of the container
* Currently done by scanned the namespace
* Ideally the OCI spec should be modified such that
* these parameters are sent to the runtime
*/
gboolean cc_oci_network_discover(struct cc_oci_config *const config, struct netlink_handle *hndl)
...
(1)、调用getifaddrs(&ifaddrs) --> discover container interfaces
....
/*!
* Request to create the networking framework that will be used to
* connect the specified container network(veth) to the VM
*
* The container may be associated with multiple networks and function has to be invoked
* for each of those networks
* Once the OCI spec supports the creation of VM compatible tap interfaces in the network plugin
* this setup will not be required
*/
gboolean cc_oci_network_create(const struct cc_oci_config *const config, struct netlink_handle *const hndl)
/* Each container has its own namespace. Hence we use the same mac address prefix
* for tap interfaces on the host side. This method scales to support upto 2^16 networks
*/
遍历config->net.interfaces,
// cc-oci-runtime/src/namespace.c
/**
* Setup namespace.
* This should not strictly be required (since the runtime does not implement a "traditional linux" container).
* Howerver, namespace are used to pass network configuration to the runtime so the network namespace
* must be supported.
* \param config \ref cc_oci_config.
* \return \c true on success, else \c false.
* \todo Show the namespace path. For unshare, the strategy should be to call cc_oci_resolve_path (),
* passing it the value of ."/proc/self/ns/%s". The complication is that %s does *NOT* match the
* namespace names chosen by OCI, hence oci_ns_map will need to be extended to add a "gchar *proc_name" element
* \note in the case of error, check the value of errno immediately after this call to determine the reason.
*/
gooblean cc_oci_ns_setup(struct cc_oci_config *config)
从config中解析出network space的ns->path,并调用fd = open(ns->path, O_RDONLY),最后调用setns(fd, ns->type)加入该network namespace
ClearContainer 网络部分源码分析的更多相关文章
- docker网络部分源码分析
daemon初始化network controller daemon的配置,网络部分的内容在cmd/dockerd/config_common_unix.go中指定,默认设置一般都为空 // daem ...
- Docker源码分析(八):Docker Container网络(下)
1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
随机推荐
- 用c#开发的一款webservice调用小工具,方便测试
本人经常与webservice打交道,webservice调用工具有soap ui,使用起来不是那么方便,所以我花了很长时间特意写了个小工具来调用Webservice方便测试,还有待进一步完善.使用方 ...
- java多线程-信号量
Semaphore(信号量)是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域.自从 5.0 开始,jdk 在 java.util.concurrent 包 ...
- (原)3.3 Zookeeper应用 - 负载均衡
本文为原创文章,转载请注明出处,谢谢 负载均衡 1.原理 服务端启动创建临时节点(下图中servers下节点),临时节点数据包含负载信息 客户端启动获取服务器列表,并根据负载去连接一个负载较轻的服务器 ...
- 【翻译】jQuery是有害的
原文:http://lea.verou.me/2015/04/jquery-considered-harmful/**(第一次翻译,望大家多批评指正) jQuery是有害的 嗨,我总想写一个“X”是有 ...
- 使用 Jquery-UI 实现一次拖拽多个选中的元素操作
项目需要,实现一个拖放操作,要求每次可以拖拽选中的多个元素,释放到目标容器后可排序.考虑了一下,觉得jquery-ui比较合适,毕竟它提供了项目需要的交互性事件机制.拖拽.释放.排序.选择等效果.而在 ...
- 开发培训及技术研讨会PPT下载链接
8月到9月,我们做了一圈巡回演出,脚步踏遍祖国大江南北,包括沈阳.武汉.深圳.香港.上海和北京等几个城市,给大家带来Autodesk最新的云技术和桌面产品技术动态,得到了大家的热烈响应.感谢各位合作伙 ...
- iOS之App加急审核详细步骤
申请加急网址:https://developer.apple.com/appstore/contact/appreviewteam/index.html 补充:加急审核说明是可以写中文的 提交加急审核 ...
- iOS之应用发布中的一些细节
Bundle identifier Xcode中 Target -> General中的bundle identifier ; info.plist中的Bundle identifier; 证书 ...
- Google C++单元测试框架GoogleTest---TestFixture使用
一.测试夹具(Test Fixtures):对多个测试使用相同的数据配置 如果你发现自己写了两个或更多的测试来操作类似的数据,你可以使用测试夹具.它允许您为几个不同的测试重复使用相同的对象配置. 要创 ...
- iOS UIPageViewController
UIPageViewController是App中常用的控制器.它提供了一种分页效果来显示其childController的View.用户可以通过手势像翻书一样切换页面.切换页面时看起来是连续的,但静 ...