CINXE.COM
A Deep Insight of Alibaba Open Source Project - Pouch - Alibaba Cloud Community
<!DOCTYPE html> <html lang="en" class="sub-site-nav alicloud-header alicloud-footer"> <head> <meta charset="UTF-8"> <title>A Deep Insight of Alibaba Open Source Project - Pouch - Alibaba Cloud Community</title> <link rel="shortcut icon" href="https://img.alicdn.com/tfs/TB1ugg7M9zqK1RjSZPxXXc4tVXa-32-32.png" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="keywords" content="Pouch,OCI" /> <meta name="description" content="Pouch is an open-source project created by Alibaba Group to promote the container technology movement."> <meta name="csrf-param" content="yunqi_csrf"/> <meta name="csrf-token" content="H4JZ6W40FI"/> <meta name="data-spm" content="a2c65"> <meta name="aplus-rhost-v" content="sg.mmstat.com"> <meta name="aplus-rhost-g" content="sg.mmstat.com"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" type="text/css" href="//g.alicdn.com/??alicloud-components/alicloud-ui3/0.0.7/acUI.css,alicloud-components/acApp/0.0.3/app.css,alicloud-components/i18n/0.0.29/css/en-us/index.css,alicloud-components/iconfont/0.0.7/product-icon.css"> <link rel="stylesheet" type="text/css" href="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/css/detail.css"> <link rel="stylesheet" type="text/css" href="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/css/nav.css"> <link rel="stylesheet" type="text/css" href="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/fonts/iconfont.css"> <link rel="stylesheet" type="text/css" href="https://g.alicdn.com/ali-mod/b-alicloud-v3-bottom/0.0.19/index.css"> <link rel="stylesheet" type="text/css" href="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/fonts/iconfont.css"> <meta property="og:url" content="https://www.alibabacloud.com/blog/a-deep-insight-of-alibaba-open-source-project---pouch_295733"> <meta property="og:site_name" content="Alibaba Cloud Community"> <meta property="og:title" content="A Deep Insight of Alibaba Open Source Project - Pouch"> <meta property="og:description" content="Pouch is an open-source project created by Alibaba Group to promote the container technology movement."> <meta property="og:image:type" content="image/png"> <meta property="twitter:creator" content="Alibaba Cloud Community"> <meta property="twitter:card" content="summary_large_image"> <meta property="twitter:title" content="A Deep Insight of Alibaba Open Source Project - Pouch"> <meta property="twitter:description" content="Pouch is an open-source project created by Alibaba Group to promote the container technology movement."> <script src="//g.alicdn.com/??alicloud-components/kloud/0.0.31/vendor/requirejs/require.js,alicloud-components/kloud/0.0.1/scripts/vendor/jquery/jquery.min.js,alicloud-components/common/scripts/layout.js,alicloud-components/alicloud-ui3/0.0.7/acUI.js"></script> <script src="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/js/layout.js"></script> </head> <body data-spm="11461447"><script type="text/javascript"> (function (d) { var t=d.createElement("script");t.type="text/javascript";t.async=true;t.id="tb-beacon-aplus"; t.setAttribute("exparams","category=&userid=&aplus&yunid=&yunpk=&channel=&cps="); t.src="//g.alicdn.com/alilog/mlog/aplus_v2.js"; d.getElementsByTagName("head")[0].appendChild(t); })(document); </script> <div class="blog-nav"> <div class="container"> <div class="row"> <h1> Community </h1> <main class="blog-nav-center"> <a href="https://www.alibabacloud.com/blog/" class="bg"> Blog </a> <a href="https://resource.alibabacloud.com/event/index"> Events </a> <a href="https://resource.alibabacloud.com/webinar/index.htm"> Webinars </a> <a href="https://community.alibabacloud.com/tags/type_blog-tagid_28404/"> Tutorials </a> <a href="https://www.alibabacloud.com/forum"> Forum </a> </main> <ul class="blog-nav-right"> <li class="search"><input type="text" placeholder="Search" id="search"> <i class="search-btn k-iconfont icon-sousuo1"></i> <div class="close-box"><img data-original="https://img.alicdn.com/tfs/TB1BIBBsbPpK1RjSZFFXXa5PpXa-24-24.png" data-toggle="lazy-loading" class="off" /><img data-original="https://img.alicdn.com/tfs/TB1vrJ2shnaK1RjSZFBXXcW7VXa-24-24.png" data-toggle="lazy-loading" class="on" /></div> </li> </ul> <div class="blog-nav-right-m"> <i class="k-iconfont icon-sousuo1 show-search"></i> <i class="show-more"></i> </div> </div> <div class="blog-nav-main-m"> <ol> <li><a href="https://community.alibabacloud.com">Blog</a></li> <li> <a href="https://resource.alibabacloud.com/event/index"> Events </a> </li> <li> <a href="https://resource.alibabacloud.com/webinar/index.htm"> Webinars </a> </li> <li> <a href="https://www.alibabacloud.com/getting-started/projects"> Tutorials </a> </li> <li> <a href="https://www.alibabacloud.com/forum"> Forum </a> </li> </ol> <div class="btn-box"> <a href="https://account.alibabacloud.com/register/register.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fwww.alibabacloud.com%2Fblog%2Fa-deep-insight-of-alibaba-open-source-project---pouch_295733%3Fdo%3Dlogin" class="free" style="display: block;"> Create Account </a> <a href="https://account.alibabacloud.com/login/login.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fwww.alibabacloud.com%2Fblog%2Fa-deep-insight-of-alibaba-open-source-project---pouch_295733%3Fdo%3Dlogin" class="login" style="display: block;"> Log In </a> </div> </div> <div class="container blog-nav-search-m"> <div class="blog-nav-search-m-top"> <input type="text" placeholder="Search" class="int-search"> <button> <i class="k-iconfont icon-sousuo1"></i> </button> <span> × </span> </div> </div> </div> </div> <div class="wrap container"> <div class="wrap-top"> <a href="https://community.alibabacloud.com">Community</a> <i class="icon icon-more"></i> <a href="https://www.alibabacloud.com/blog/">Blog</a> <i class="icon icon-more"></i> A Deep Insight of Alibaba Open Source Project - Pouch </div> <div class="wrap-main"> <div class="col-md-8"> <div class="wrap-main-left"> <h1> A Deep Insight of Alibaba Open Source Project - Pouch </h1> <aside> <main> <a href="https://community.alibabacloud.com/users/5040995529404844">Alibaba Clouder</a> <span>December 20, 2017</span> <span> <img src="https://img.alicdn.com/tfs/TB19L9AbXuWBuNjSspnXXX1NVXa-40-26.png" alt=""> 34,796 </span> <a href="#comment"> <i class="icon icon-pinglun"></i><b class="comments-num">0</b> </a> </main> <div> </div> </aside> <div class="wrap-main-left-abstract"> Pouch is an open-source project created by Alibaba Group to promote the container technology movement. </div> <div class="wrap-main-left-article markdown-body"> <p><img src="https://yqfile.alicdn.com/0bf7fad222f33672e283e886d166247b812e06f2.png" alt="1" title="1"></p> <p>By Allen Sun, Senior Engineer at Alibaba Group</p> <p>Pouch's vision is to advance container ecosystem and promote container standards <a href="https://github.com/opencontainers">OCI (Open Container Initiative)</a>, so that container technologies could become the foundation for application development in the Cloud era.</p> <p>Pouch can pack, deliver, and run any applications. It provides applications with a lightweight runtime environment with strong isolation and minimal overhead. Pouch isolates applications from varying runtime environment, and minimizes operational workload. Meanwhile, Pouch minimizes the effort for application developers to write Cloud-native applications, or to migrate legacy ones to a Cloud platform.</p> <p></p> <h2>Features</h2> <p>Here we listed several important features of Pouch:</p> <p>• <b>Security</b>: Pouch is designed to be secure by default. It includes a lot of security features, such as hypervisor-based container technology, lxcfs, patched Linux kernel and so on.<br>• <b>P2P distribution</b>: Pouch utilizes <a href="https://github.com/alibaba/dragonfly">Dragonfly</a>, a P2P-base distribution system, to achieve lightning-fast container image distribution.<br>• <b>Rich container</b>: Besides the common ways of running container, Pouch includes a rich container mode, which integrates more services, hooks, and many others container internals to guarantee container's running like usual.<br>• <b>Kernel compatibility</b>: Enables OCI-compatible runtimes to work on old kernel versions, like Linux kernel 2.6.32+.<br>• <b>Simplicity</b>: You can set up Pouch in just a few steps.</p> <p>From these features, we could conclude that Pouch is designed to fit very large-scale and production application scenarios. Container technology brings convenience to pack applications, but applications in containers are less secure as compared to applications in VMs. It will definitely be a concern of decision makers to choose container technology on the market. However, Pouch is developed by Alibaba, one of the largest e-commerce company in the world. Alibaba has faced a wide variety of security issues and have successfully coped with these issues. A lot of these issues are solved using hypervisor-based container and security-patched kernels.</p> <p>P2P image distribution is one of the most practical thoughts we can think of for businesses as large as Alibaba. Tools like Dragonfly are the essentials in large companies. Unlike P2P image distribution, rich container is the one that confuses many at first glance. It works in the opposite way as compared with the ones that the container community advocates. </p> <p>Pouch’s reason is quite simple; no one is willing to adopt a technology at once if it appears to be invasive, even if it brings huge benefits. This also confirms Pouch’s practical point of view. Kernel Compatibility is the reality almost every enterprise would face, but community seems to consider it less. How to make it in current kernel system is the key point that may be revealed in the future.</p> <p></p> <h2>Architecture</h2> <p>Knowing the feature of Pouch and the benefits it brings, we take a deep dive into its architecture. Pouch has two kinds of architectures from two dimensions: <b>ecosystem architecture and inner component architecture</b>.</p> <p></p> <h3>Ecosystem architecture: illustrates how Pouch fits into the container ecosystem</h3> <p><img src="https://yqfile.alicdn.com/d797b62991b84da3d61b3b950140203af7c89356.jpeg" alt="2" title="2"></p> <p>The ecosystem architecture may be a little bit complicated at first glance. Take it easy. We can get a thorough understanding of it from the following three dimensions.</p> <p></p> <h4>Runtime Layer</h4> <p>Runtime layer is located on the top-right in the architecture picture. This dimension mainly focuses on OCI-compatible runtimes supported in Pouch. These runtimes unify specifications for standards on operating system process and application containers. Currently, Pouch supports four kinds of OCI-compatible runtimes:</p> <p>• runC<br>• runlxc<br>• runV<br>• clear containers</p> <p>With runC, Pouch creates common containers like other container engine does, for example Docker. With runlxc, Pouch creates containers based on LXC. runlxc helps a lot when users need to run containers on a wide variaty of Linux kernels with the ability to be compatible with kernel 2.6.32+. Hypervisor-based containers have many application scenarios as well. Pouch will support it with runV and clear container.</p> <p>All these four runtimes mentioned above are supported under containerd. Containerd takes over all detailed container management, including creation, start, stop, deletion and so on.</p> <p></p> <h4>Orchestration Layer</h4> <p>Pouch is always active on supporting Kubernetes since the first day of its conception. We illustrate this part on the top half of the architecture diagram. First, Pouch will integrate cri-containerd inside, so Kubernetes can easily dominate Pouch to manage Pod. The workflow will pass cri-containerd, containerd client, containerd, runC/runV and pod. When configuring network of Pod, cri-containerd will take advantage of network plugins that implement CNI interface.</p> <p></p> <h4>Container Layer</h4> <p>We support not only Pod in Kubernetes cluster, but also simple container management for users. This is especially useful for developers. In other words, Pouch supports single container API. In this way, workflow passes pouchd, containerd client, containerd, runC/runV and container. On the aspect of network, Pouch uses libnetwork to construct container's network. What's more, lxcfs is also used to guarantee the isolation between containers and between containers and host.</p> <p></p> <h3> Component architecture: describes the interactions between various components inside Pouch. </h3> <p><img src="https://yqfile.alicdn.com/af51ca20425fb236fa3ad5a5e371f10f72f96aa8.jpeg" alt="3" title="3"></p> <p></p> <h4>Pouch CLI</h4> <p>There are lots of different commands encapsulated in Pouch CLI, like create, start, stop, exec and so on. Users can interact with Pouchd by Pouch CLI. When executing a command, Pouch CLI will translate it into Pouchd API calls to satisfy users' demand. Pouch Client API is a well-encapsulated package in Pouch CLI. It is very easy for others to integrate Pouch Client Package into third-party software. And this package currently only supports Golang language. When calling Pouchd via Pouch Client Package, the communication is over HTTP.</p> <p></p> <h4>Pouchd</h4> <p>Pouchd is designed decoupled from the very beginning. It makes Pouchd quite easy to understand. And it helps a lot for us to hack on Pouch. In general, we treat that Pouchd can be split into the following pieces:</p> <p>• HTTP server<br>• bridge layer<br>• Manager(System/Network/Volume/Container/Image)<br>• ctrd</p> <p><b>HTTP Server</b> receives API calls directly and replies to client side. Its job is to parse requests and construct correct struct, which is supposed to be passed to bridge layer, and to construct response no matter server succeeds in handling request or fails.</p> <p><b>bridge layer</b> is a translation layer which handles objects from client to meet managers or containerd's demand and handles objects from managers and containerd to make response compatible with Moby's API.</p> <p><b>Manager</b> is main processor of Pouchd. It deals proper object from requests, and does the corresponding work. There are five managers currently in Pouchd: container manager, image manager, network manager, volume manager and system manager.</p> <p><b>ctrd</b> is containerd client in Pouchd. When managers need to communicate with container, ctrd is the right thing to do this work. Managers call functions in ctrd and send request towards containerd. In addition, when state of container changes, containerd is the first component to be aware of this, and ctrd has container watch goroutines to detect this and update inner data stored in cache.</p> <p></p> <h2>Conclusion</h2> <p>Although Pouch technology is widely used in Alibaba, there is still a long road ahead for a fully stable and open source version of Pouch. We will focus our efforts on developing Pouch together with the community.</p> <p>Personal Profile:</p> <p>Allen Sun, Senior Engineer at Alibaba Group, is currently responsible for the open source construction of the Pouch container project at Alibaba. He has been involved in cloud computing for over 5 years, and is one of the first batch of researchers and practitioners of container technology. Allen played a central role in the evangelism of container technology. He is the author of the book <span style="font-style:italic;">The Source Code Analysis of Docker</span> and a personal advocate of the open source spirit, as well as a Maintainer of the Docker Swarm Project.</p> <p>You can visit Allen's LinkedIn page through <a target="_blank" href="https://www.linkedin.com/in/hongliang-sun-b079735a/">this link</a>.</p> </div> <div class="wrap-main-left-bar"> <span><a href="https://community.alibabacloud.com/tags/type_blog-tagid_24237/">Pouch</a></span> <span><a href="https://community.alibabacloud.com/tags/type_blog-tagid_24895/">OCI</a></span> </div> <div class="wrap-main-left-action"> <main> <a href="#comment"> <i class="icon icon-pinglun"></i> 0 </a> <span class="action-zan" data-islogin="false" data-id="295733" data-already="false" rel="nofollow"> <i class="icon icon-zan"></i> <b>0</b> </span> <span class="action-love" data-islogin="false" data-id="295733" data-already="false" rel="nofollow"> <i class="icon icon-love"></i> <b>0</b> </span> </main> <div> <b>Share on</b> <a href="javascript:;" class="sharer" data-sharer="linkedin" data-url="" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-linkedin1"></i> </a> <a href="javascript:;" class="sharer" data-sharer="facebook" data-url="" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-lianshu1"></i> </a> <a href="javascript:;" class="sharer" data-sharer="twitter" data-url="" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-twitter1"></i> </a> </div> </div> <div class="wrap-main-left-read"> <main> <h2> Read previous post: </h2> <p> <a href="/blog/how-to-setup-a-minecraft-server-on-debian-or-ubuntu-os_293660"> How to Setup a Minecraft Server on Debian or Ubuntu OS </a> </p> </main> <main> <h2> Read next post: </h2> <p> <a href="/blog/web-application-firewall-cloud-options-alibaba-cloud-waf-%26-aws-waf_304201"> Web Application Firewall Cloud Options: Alibaba Cloud WAF & AWS WAF </a> </p> </main> </div> <div class="wrap-main-right-user wrap-main-right-user-mobile"> <dl> <dt> <a href="https://community.alibabacloud.com/users/5040995529404844"> <img src="https://yqintl.alicdn.com/img_572d495de1d399a4388a7656634ed8c7.png?x-oss-process=image/resize,m_fixed,h_64,w_64" alt=""> </a> </dt> <dd> <h1> <a href="https://community.alibabacloud.com/users/5040995529404844"> Alibaba Clouder </a> </h1> <p> 2,599 posts | 769 followers </p> <a href="#" class="follow-btn" data-islogin="false" data-uid="5040995529404844" data-isfollowed="false" id="follow-btn" rel="nofollow">Follow</a> </dd> </dl> </div> <h3> You may also like </h3> <ul class="wrap-main-left-list"> <li> <span></span> <a href="/blog/12-open-source-projects-by-alibaba-part-1_582638"> 12 Open Source Projects by Alibaba – Part 1 </a> <p> Alibaba Clouder - April 18, 2018 </p> </li> <li> <span></span> <a href="/blog/open-container-initiative-welcomes-alibaba-cloud-as-newest-member_593963"> Open Container Initiative Welcomes Alibaba Cloud as Newest Member </a> <p> Alibaba Developer - September 3, 2018 </p> </li> <li> <span></span> <a href="/blog/using-pouchcontainer-to-deploy-a-node-site-in-alibaba-cloud_594712"> Using PouchContainer to Deploy a Node Site in Alibaba Cloud </a> <p> Alibaba Clouder - April 19, 2019 </p> </li> <li> <span></span> <a href="/blog/pouchcontainer-goroutine-leak-detection-practices_593882"> PouchContainer Goroutine Leak Detection Practices </a> <p> Amber Wang - August 6, 2018 </p> </li> <li> <span></span> <a href="/blog/pouchcontainer-engineering-quality-practice_593906"> PouchContainer Engineering Quality Practice </a> <p> Alibaba System Software - August 14, 2018 </p> </li> <li> <span></span> <a href="/blog/insight-into-the-future-of-cloud-native-cncf-x-alibaba-cloud-native-technology-course_594623"> Insight into the Future of Cloud Native: CNCF x Alibaba Cloud Native Technology Course </a> <p> Alibaba Developer - March 25, 2019 </p> </li> </ul> <h3 id="comment"> Comments </h3> <div class="wrap-main-left-comments"> <span class="hidden" id="pageCount" data-pageCount="0"></span> </div> <div class="page parent-page"></div> <div class="write-comments"> <textarea name="" id="" cols="30" rows="10" placeholder="Write your comment..."></textarea> <div class="write-comments-btn"> <button class="btn btn-primary add-parent-comment">Post</button> </div> </div> </div> <div class="wrap-main-iconBox"> <a href="javascript:;" class="bg sharer" data-sharer="linkedin" data-url="https://www.alibabacloud.com/blog/a-deep-insight-of-alibaba-open-source-project---pouch_295733" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-linkedin1"></i> </a> <a href="javascript:;" class="sharer" data-sharer="facebook" data-url="https://www.alibabacloud.com/blog/a-deep-insight-of-alibaba-open-source-project---pouch_295733" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-lianshu1"></i> </a> <a href="javascript:;" class="sharer" data-sharer="twitter" data-url="https://www.alibabacloud.com/blog/a-deep-insight-of-alibaba-open-source-project---pouch_295733" title="A Deep Insight of Alibaba Open Source Project - Pouch"> <i class="icon icon-twitter1"></i> </a> </div> </div> <div class="wrap-main-right col-md-4"> <div class="wrap-main-right-user wrap-main-right-user-pc"> <dl> <dt> <a href="https://community.alibabacloud.com/users/5040995529404844"> <img src="https://yqintl.alicdn.com/img_572d495de1d399a4388a7656634ed8c7.png?x-oss-process=image/resize,m_fixed,h_64,w_64" alt=""> </a> </dt> <dd> <h1> <a href="https://community.alibabacloud.com/users/5040995529404844"> Alibaba Clouder </a> </h1> <p> 2,599 posts | <span class="followers-num">769</span> followers </p> <a href="#" class="follow-btn" data-islogin="false" data-uid="5040995529404844" data-isfollowed="false" id="follow-btn" rel="nofollow">Follow</a> </dd> </dl> </div> <div class="wrap-main-right-box"> <h1> Related Products </h1> <ul> <li> <h2> <a href="https://community.alibabacloud.com/go/1/349"> <img src="https://yqintl.alicdn.com/img_993d845c1b15c792df734543396954e8.png" alt=""> DAS(Database Autonomy Service) </a> </h2> <p> Self-driving Database Platform: Self-repair, Self-optimization, and Self-security </p> <a href="https://community.alibabacloud.com/go/1/349" class="btn btn-default"> Learn More </a> </li> </ul> </div> <div class="wrap-main-right-list"> <div> <p> <b> More Posts </b> <span> by Alibaba Clouder </span> </p> <main> <span> <a href="https://community.alibabacloud.com/users/5040995529404844/article">See All</a> </span> <i class="icon icon-more"></i> </main> </div> <ul> <li> <a href="/blog/mybatis-with-a-more-fluent-experience_598062">MyBatis with a More Fluent Experience</a> </li> <li> <a href="/blog/alibaba-cloud-sustainability-report-2021_598055">Alibaba Cloud Sustainability Report 2021</a> </li> <li> <a href="/blog/comparing-cni-models-in-container-service-for-kubernetes-%E2%80%94-alibaba-cloud-series-part-1_598052">Comparing CNI Models in Container Service for Kubernetes — Alibaba Cloud Series Part 1</a> </li> <li> <a href="/blog/infographic-5-steps-to-accelerate-your-digitalization-in-asia_598049">[Infographic] 5 Steps to Accelerate Your Digitalization in Asia</a> </li> <li> <a href="/blog/attackers-use-the-vulnerability-of-showdoc-to-spread-botnets_598047">Attackers Use the Vulnerability of ShowDoc to Spread Botnets</a> </li> <li> <a href="/blog/powerful-mybatis-and-three-streaming-query-methods_598037">Powerful: MyBatis and Three Streaming Query Methods</a> </li> <li> <a href="/blog/what-is-the-difference-between-spring-boot-and-spring_598036">What is the Difference between Spring Boot and Spring?</a> </li> <li> <a href="/blog/what-are-the-differences-and-functions-of-the-redo-log-undo-log-and-binlog-in-mysql_598035">What are the Differences and Functions of the Redo Log, Undo Log, and Binlog in MySQL?</a> </li> <li> <a href="/blog/on-the-in-depth-cluster-scheduling-and-management_598012">On the In-Depth Cluster Scheduling and Management</a> </li> <li> <a href="/blog/alibaba-technological-practices-experiences-in-cloud-resource-scheduling_598011">Alibaba Technological Practices: Experiences in Cloud Resource Scheduling</a> </li> </ul> </div> </div> </div> </div> <script type="text/javascript" nonce="KZ5LZDUHTC"> window.localconfigs = { 'aid': 295733 }; </script> <script type="text/javascript" nonce="KZ5LZDUHTC"> window.configs = { "csrf-param": "yunqi_csrf", "csrf-token": "H4JZ6W40FI", "islogin": false, "registerurl": "https://account.alibabacloud.com/register/register.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fwww.alibabacloud.com%2Fblog%2Fa-deep-insight-of-alibaba-open-source-project---pouch_295733%3Fdo%3Dlogin", "loginurl": "https://account.alibabacloud.com/login/login.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fwww.alibabacloud.com%2Fblog%2Fa-deep-insight-of-alibaba-open-source-project---pouch_295733%3Fdo%3Dlogin", "isNeedNickname": false, "baseurl": "/blog" }; </script> <script src="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/js/detail.js"></script> <script src="//g.alicdn.com/aliyun-international/blog-assert/0.0.23/js/nav.js"></script> <script type="text/javascript" nonce="KZ5LZDUHTC"> (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); ga('create', 'UA-86123020-1', 'auto'); ga('send', 'pageview'); </script> </body> </html>