严于律己,做一个好爸爸

感恩

已经好一个多月都没有写点东西了,因为我的女儿出生了,整个五月都是在忙碌中度过。

先是在月子中心远程办公了近一个月,出了会所后开始休陪产假,我们两个人在照顾孩子,对于新手爸妈来说还是非常忙碌的。

除了忙碌点之外,谢天谢地这一切都挺顺利的。

计划

在逐渐走上正轨之后我需要找时间来做点自己的事,毕竟很少有机会能一次性休三个月(12周的陪产假),已经快要过去了2周,我要更有计划的来完成一些任务,目前的计划是:

  • 完成《代码整洁之道》、《重构》以及《动手学习深度学习这三本书》的阅读和豆瓣评论
  • 为 pre-commit 写一个 clang-format 和 clang-tidy 的 cpp-linter-hooks
  • 完成每个月 15 节英语课以及 3~4 的体育锻炼(游泳和足球)

从本周(休假的第2周)开始,我会继续在这篇文章的下方更新周报。

周报

第 2 周:

  • 《代码整洁之道》 P26 - P56
  • 创建了 cpp-linter-hooks 仓库,学习别人的代码
  • 计划本周末和乔教练去游泳

转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「DevOps攻城狮」

WSL + VS Code + Docker Desktop 在 Windows 做开发还能这么爽!

许久以来,大部分程序员都遇到过在 Windows 做开发那种不便。

比如不能像 Linux 和 Mac 那样只需要输入一行命令就能安装 openjdk,python,node 等等。因此有的程序员从此转到了 Mac 上开发,也有的干脆就使用 Linux 作为开发机。

只有那些不得不用 Windows 作为开发环境程序员还一直留在了 Windows 上继续凑合中。

直到 WSL 的到来,WSL + VS Code + Docker Desktop 这三剑客的组合,开始让我觉得在 Windows 上做开发是一件很爽的事情。

什么是 WSL

WSL 是 Windows Subsystem for Linux 的缩写。它是 Windows 10 操作系统的一项功能,使你能够在 Windows 上直接运行 Linux 文件系统,以及 Linux 命令行工具和 GUI 应用程序,并与传统的 Windows 桌面和应用程序一起运行。

WSL 的最低版本要求是 Windows 10 version 1903 及更高。

WSL 是专为那些需要使用 Linux 的开发人员所开发的,例如从事网络开发人员、开源项目、以及需要部署到 Linux 服务器环境的开发者。

WSL 适用于喜欢使用 Bash、常用 Linux 工具(sed、awk等)和 Linux 优先框架(Ruby、Python 等),同时也喜欢使用 Windows 作为生产力工具的人。

下面来看看 WSL 和虚拟机相比有哪些优势。

使用 WSL 的几点优势

  1. 与完整的虚拟机相比,WSL需要的资源(CPU、内存和存储)更少
  2. WSL 允许你在 Windows 命令行、桌面和商店应用程序旁边运行 Linux 命令行工具和应用程序,并从 Linux 中访问你的 Windows 文件,有更好的交互体验。
  3. 最最重要的是,使用 WSL 结合 VS Code + Docker 既有 Linux 的完美体验感,也同时拥有在 Windows 上的办公生产力。这是虚拟机或是 Linux 操作系统所办不到。Mac 可以,但并不是所有人都适合 Mac。

下面就来说说如何安装 WSL,以及和 VS Code + Docker 进行搭配使用。

安装 WSL

wsl --install

这个命令将启用所需的可选组件,下载最新的 Linux 内核,将 WSL 2 设置为你的默认值,并为你安装一个 Linux 发行版(默认为 Ubuntu)。

# 查看可用的发行版列表
C:\Users\xshen>wsl --list --online
The following is a list of valid distributions that can be installed.
Install using 'wsl --install -d <Distro>'.

NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
openSUSE-42 openSUSE Leap 42
SLES-12 SUSE Linux Enterprise Server v12
Ubuntu-16.04 Ubuntu 16.04 LTS
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS

安装其他发行版,比如 Debian

wsl --install -d Debian

更详细的请参考官方文档

WSL + VS Code 演示

以下以 Ubuntu 为例,演示从下载代码,并通过 VS Code 打开代码目录进行 Coding。

此时我已经通过 WSL 打开了已经安装好的 Ubuntu 操作系统了。

ubuntu

首选下载代码

ubuntu@CN-L-2680:~$ git clone https://github.com/cue-lang/cue.git --depth 1
Cloning into 'cue'...
remote: Enumerating objects: 1833, done.
remote: Counting objects: 100% (1833/1833), done.
remote: Compressing objects: 100% (1502/1502), done.
remote: Total 1833 (delta 238), reused 1161 (delta 148), pack-reused 0
Receiving objects: 100% (1833/1833), 1.53 MiB | 5.39 MiB/s, done.
Resolving deltas: 100% (238/238), done.

然后到下载好的代码目录下面,输入 code .

ubuntu@CN-L-2680:~$ cd cue/
ubuntu@CN-L-2680:~/cue$ code .

# 只有第一次才会安装 VS Code Server
Installing VS Code Server for x64 (dfd34e8260c270da74b5c2d86d61aee4b6d56977)
Downloading: 100%
Unpacking: 100%
Unpacked 2341 files and folders to /home/ubuntu/.vscode-server/bin/dfd34e8260c270da74b5c2d86d61aee4b6d56977.

第一次会自动下载并安装 VS Code Server,安装完成后会自动启动你本机上的 VS Code,并打开了 Ubuntu 上的代码目录,整个过程非常丝滑。

之后你就可以在 VS Code 上通过命令行 apt-get 命令安装你需要的任何软件了,真爽~

vscode

本机 VS Code 上需要安装微软出的 Remote - WSL 插件;
另外,如果需要在 WSL 中使用 Docker,需要在 Windows 上预先安装 Docker Desktop


转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「DevOps攻城狮」

关于 Docker,containerd,CRI,CRI-O,OCI,runc 的解释以及它们是如何工作在一起的

自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。

比如 Docker, containerd, CRI, CRI-O, OCI, runc,本篇将介绍这些你听过但并不了解的术语,并解释容器生态系统是如何在一起工作的。

容器生态系统

容器生态系统是由许多令人兴奋的技术、大量的专业术语和大公司相互争斗组成的。

幸运的是,这些公司偶尔会在休战中走到一起合作,商定一些标准,这些标准有助于使这个生态系统在不同的平台和操作系统之间更具互操作性,并减少对单一公司或项目的依赖。

这张图显示了 Docker、Kubernetes、CRI、OCI、containerd 和 runc 在这个生态系统中是如何结合的。

其工作流程简单来说是这样的:

  1. Docker,Kubernetes 等工具来运行一个容器时会调用容器运行时(CRI)比如 containerd,CRI-O
  2. 通过容器运行时来完成容器的创建、运行、销毁等实际工作
    • Docker 使用的是 containerd 作为其运行时;Kubernetes 支持 containerd,CRI-O 等多种容器运行时
    • 这些容器运行时都遵循了 OCI 规范,并通过 runc 来实现与操作系统内核交互来完成容器的创建和运行

下面就分别介绍图中所提到的术语和规范。

Read More

How to enable, configure and disable Jenkins LDAP

Introduction

In organizations, using LDAP login very common way for users to log in with their credentials.

How to configure LDAP

Preparation: Installed LDAP Jenkins plugin

About how to configure it, you can refer to Jenkins LDAP Plugin documentation https://plugins.jenkins.io/ldap/

This is my LDAP configuration just for testing.

Can not login with LDAP?

Sometimes, for some reason, there is a problem with your organization’s LDAP server and you can’t log in to Jenkins using LDAP, but you need to use Jenkins now.

You can disable LDAP authentication by changing config.xml.

# Login, cd to jenkins server folder
$ cd /var/lib/jenkins/

# Highly rememend you to backup config.xml before making any change !!!
# If you don't backup config.xml, you'll lost your LDAP configration after reboot service.
$ cp config.xml config.xml.bak

# Modify config.xml from
<useSecurity>true</useSecurity>
# To
<useSecurity>false</useSecurity>

# Restart Jenkins server
sudo service jenkins restart

Then you can log into the Jenkins server again.

Once your organization’s LDAP works again, you can replace config.xml with your backup config.xml file. Then your users can continue to log in via LDAP.

靠谱:在不删除和重建 GitHub 仓库的情况下与父(Fork)仓库分离(Unfork)

背景

有开发者、甚至公司可能会遇到过以下几个问题:

  1. 最开始 Fork 了一个仓库,之后做了大量的修改,从功能到开发语言,已经与父仓库各自发展了
  2. 由于是 Fork 的仓库,在每次提 Pull Request 的默认目标分支是父仓库,一不注意就会提 PR 到父仓库里去了
  3. Fork 的仓库有人贡献并使用了,但不能显示贡献者,以及该项目被哪些其他的项目所使用,这不利于项目的发展

基于这些问题,开发者会考虑与父仓库进行分离,但目前 GitHub 没有提供 Unfork/Detach 的功能。

如果直接删除项目并重建可以达到分离的目的,但这样会丢失一些重要的信息,比如项目中的 Issues,Wikis 以及 Pull Requests 等。

Unfork 跟某节旗下某引擎白嫖 Apache SkyWalking 有本质区别,它更像是 Hudson 和 Jenkins 的分道扬镳。

解决办法

在经过一番调查和测试,目前最可行的办法就是通过 GitHub Support 来处理,具体操作如下:

  1. 打开这个链接:https://support.github.com/contact?tags=rr-forks
  2. 选择你的账户或是组织,然后在 Subject 中输入 “unfork” 会自动弹出虚拟助手,选择虚拟机助手
  3. 然后根据虚拟助手的问题然后选择答案(如下是部分截图)
  4. 最后这些对话会自动转换成文字脚本,然后 Send request,等着 Support 处理就可以了(不会太久)

这里要注意一下,如果你的仓库被其他人 Fork 了,你想跟父仓库分离之后继续保留你的子仓库的 Fork 记录,你应该选择 “Bring the child forks with the repository”。

另外,通过其他方式,比如命令 git clone --baregit push --mirror,可以保留完成的 Git 历史,但不能保留 Issues,Wikis 以及 Pull Requests 等信息。

希望对有需要的你有所帮助。

参考


转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「DevOps攻城狮」

在 Jenkins 上用了这么久的 Groovy,是时候认识一下它了

在使用 Jenkins 和 Groovy 越久,我就这样的疑问:

Groovy 到底是什么语言?
Groovy 有哪些特性?
Groovy 和 Java 有什么区别?
Groovy 和 Java 如何选择?
Groovy 在整个开发语言中占什么位置?要不要学?

本篇我的学习结果的分享,希望也能帮助你解答以上的这些问题。

什么是 Groovy

Apache Groovy 是一种强大的、可选类型的动态语言,具有静态类型和静态编译功能,适用于 Java 平台,旨在通过简洁、熟悉且易于学习的语法提高开发人员的工作效率。
它与任何 Java 程序顺利集成,并立即为你的应用程序提供强大的功能,包括脚本功能、特定领域语言创作、运行时和编译时元编程和函数式编程。

Groovy 的特性

翻译官方的说法,Groovy 有以下六大特性。

  1. 平坦的学习曲线 - 简洁、易读且富有表现力的语法,Java 开发人员易于学习
  2. 强大的功能 - 闭包、构建器、运行时和编译时元编程、函数式编程、类型推断和静态编译
  3. 流畅的 Java 集成 - 与 Java 和任何第三方库无缝、透明地集成和互操作
  4. 领域特定语言 - 灵活可延展的语法,先进的集成和定制机制,在你的应用程序中集成可读的业务规则
  5. 充满活力和丰富的生态系统 - Web 开发、响应式应用程序、并发/异步/并行库、测试框架、构建工具、代码分析、GUI 构建
  6. 脚本和测试胶水 - 非常适合编写简洁和可维护的测试,以及所有构建和自动化任务

Groovy 和 Java 的区别

 Groovy vs Java

  1. Groovy 是一种编程语言,也支持脚本语言;Java 是一种面向对象的编程语言。
  2. Groovy 支持多方法,运行方法的选择将在运行时选择;Java 提供多方法的声明,在编译时而不是运行时选择。
  3. Groovy 中,自动资源管理机制是不存在的,静态的、匿名的内部类;Java 从 Java7 版本开始就提供了自动资源管理,在内部静态类或匿名类方面占上风。
  4. Groovy 中,有一些函数式编程特性,如 Lambda 函数,函数式接口;而 Java 从 JDK 8 版本开始就有 Lambda 函数、函数式接口和许多其他的流和并行操作功能。
  5. Groovy 可以用单引号或双引号格式定义和声明字符串和字符字面;Java 只有双引号格式来声明和定义字符串字面或字符字面。
  6. Groovy 中所有东西都是一个对象,并且只使用对象。因此,不存在自动装箱或拆箱的概念,也不存在基元的转换;相反,Java 有基元数据类型和 Wrapper 类,可以显式或隐式地进行自动装箱和自动拆箱。
  7. Groovy 中,数据类型的自动拓宽和缩小有很多宽广的范围,有很多转换;而Java在数据类型的缩小或拓宽方面有限制。
  8. Groovy 对其所有类型的类成员或数据都有一个默认的访问修饰符;而Java的默认访问级别是包级,取决于类成员的类型。
  9. Groovy 在其类中自动生成 getters 和 setter 来访问和修改类的成员;而在 Java 中,它们必须在类中明确提到访问修饰符。
  10. Groovy 有 Groovy beans;而Java有Java beans。
  11. Groovy 也被称为 Java 的超集,因为 Java 程序可以在 Groovy 环境中运行。反过来并不一定。
  12. Groovy 在定义类型时有更简单的语法,只需使用 def 来声明一个变量;Java有不同类型的类型名称来声明变量或类的任何方法或成员。
  13. Groovy 不要求任何主方法或方法的入口点来运行类或任何程序;而 Java 则要求类中的 main 方法来运行程序。

Read More

Resolved - The Pip Inspector tree parse failed to produce output

Details

Failure: PIP - Pip Inspector
The Pip Inspector tree parse failed to produce output.

Overall Status: FAILURE_DETECTOR - Detect had one or more detector failures while extracting dependencies.

For more output please click to expand.

👉 Click to see more output 👈
[main] --- ======== Detect Issues ========
[main] ---
[main] --- DETECTORS:
[main] --- Detector Issue
[main] --- /workdir/test
[main] --- Failure: PIP - Pip Inspector
[main] --- The Pip Inspector tree parse failed to produce output.
[main] ---
[main] --- ======== Detect Result ========
[main] ---
[main] --- Black Duck Project BOM: https://org.blackducksoftware.com/api/projects/246c8952-7cb8-40e9-9987-35f7d4602ae1/versions/e1cb4204-42d0-4445-8675-978df62b150d/components
[main] ---
[main] --- ======== Detect Status ========
[main] ---
[main] --- GIT: SUCCESS
[main] --- PIP: FAILURE
[main] ---
[main] --- Signature scan / Snippet scan on /workdir/test: SUCCESS
[main] --- Overall Status: FAILURE_DETECTOR - Detect had one or more detector failures while extracting dependencies. Check that all projects build and your environment is configured correctly.
[main] ---
[main] --- If you need help troubleshooting this problem, generate a diagnostic zip file by adding '-d' to the command line, and provide it to Synopsys Technical Support. See 'Diagnostic Mode' in the Detect documentation for more information.
[main] ---
[main] --- ===============================
[main] ---
[main] --- Detect duration: 00h 00m 54s 951ms
[main] --- Exiting with code 5 - FAILURE_DETECTOR

ENVIRONMENT:

  • Product: synopsys-detect-7.11.1.jar
  • Others: OpenJDK 11, Python 3.6 and Python 2.7.5

Root cause

More output of this run, I see it used python (which is python2) not python3,
so run pip-inspector.py failed.

DEBUG [main-Executable_Stream_Thread] --- Python 2.7.5

...

[main] --- Running executable >/usr/bin/python /home/****/blackduck/runs/2022-03-01-07-45-05-986/shared/pip/pip-inspector.py --projectname=test

Solution

Link python to python3, it works in my case.

For example

# save python to other name
sudo mv /usr/bin/python /usr/bin/python.old
# link python3 to python
sudo ln -s /usr/bin/python3 /usr/bin/python

Then try to run bash <(curl -s -L https://detect.synopsys.com/detect7.sh) again, my test commands:

bash <(curl -s -L https://detect.synopsys.com/detect7.sh) --blackduck.url=https://org.blackducksoftware.com --blackduck.api.token=MmMwMjdlOTctMT --detect.project.name=HUB --detect.project.version.name=TEST_v1.1.1 --detect.source.path=/workdir/test --logging.level.com.synopsys.integration=DEBUG --blackduck.trust.cert=TRUE --detect.tools.excluded=POLARIS --detect.blackduck.signature.scanner.snippet.matching=SNIPPET_MATCHING

If you want to use Docker to do Blackduck scan, you can create a Docker image. like this

Read More

2022 年最值得关注的 DevOps 趋势和问答

DevOps 是 IT 界最近几年的一个热门话题,而且还会越来越热。

最近有幸和一位做传播咨询的读者朋友交流关于 2022 年最值得关注的 DevOps 趋势以及一些问题和回答,分享给大家。

行业趋势

趋势一:转向无服务器计算

无服务器计算是一种新兴趋势,实际上已经存在了十多年。企业购买无服务器框架需要一段时间,主要是因为对行业支持和对投资回报的担忧。

无服务器具有许多越来越难以忽视的优势,主要的两个最大好处是效率和可靠性。没有基础设施管理的负担,企业可以将资源集中在正重要的事项上。此外,无服务器还降低了传统框架可能出现的潜在维护问题的风险。

无服务器提供固有的可扩展性和可靠性并自动化开发人员不喜欢的日常操作任务,2022 年无服务器计算会经历下一次发展。

趋势二:微服务架构增长

随着无服务器计算在 2022 年的发展,微服务也将如此。

微服务架构是将单体应用分化为小的独立单元,或服务,从而为大型团队提供了更大的灵活性。它有以下优势:

  • 为企业提供比单体应用程序更好的可扩展性和敏捷性
  • 开发人员可以使用他们熟悉的编程语言和工具,消除传统应用程序开发的局限
  • 开发人员能够在不破坏整个代码库的情况下部署小的特性或功能
  • DevOps 团队可以根据业务需求来扩展每个应用部分,而不是一次性扩展整个应用
  • 出现问题微服务可以轻松控制问题,而不会中断整个应用程序

当然也必须认识到微服务的一个弊端,如果实施不佳可能导致严重问题,包括数据丢失、可靠性差和安全风险。

趋势三:Kubernetes 成为基础架构

Kubernetes,也称 K8s,是容器编排开源平台,它能够与容器组交互,同时管理更多集群。除了容器管理,还提供安全、网络和存储服务,自我监控,节点和容器的健康状况检查。它可以处理从虚拟机集群管理到负载平衡等所有方方面面,提高生产力,简化 DevOps 开发、测试和部署流程。

根据 Flexera 的 2021 年云计算状况报告,48% 的企业使用 Kubernetes,另有 25% 的企业计划使用它。另外 53% 的组织使用 Docker,21% 的组织计划使用。

趋势四:DevSecOps 成为重要组成部分

安全性正在成为 DevOps 领域的另一个日益关注的问题。

为了避免网络攻击,许多大型企业正在将安全性集成到他们的 DevOps 流程中。从 DevOps 到 DevSecOps 的转变预计在 2022 会有更多公司在软件开发生命周期的早期加入安全控制。
这使 DevOps 团队能够在开发阶段持续监控和修复安全缺陷,从而提高交付速度和质量。DevSecOps 正在成为许多公司组织结构图的重要组成部分。

行业问答

Read More

从QA到DEV到DEVOPS,码字五年有哪些收获

在写博客和公众号这件事上,不知不觉已经是我的第五个年头了,没想过能这么久。

借此分享一下这些年我的职业线路的变化,以及写博客&公众号有什么收获,算是自己过去的一个总结,如果能有点共鸣和帮助就更好了。

从QA到DEV到DEVOPS

最早关注我公众号读者朋友大概都是因为软件测试而结缘的。是的,我做了近 10 的软件测试工作,先后在 SIMcom、东软、京东商城、外企从事过功能&自动化&性能测试工作。

从功能测试入行开始,我慢慢地感受到编程不是开发的独门武功,它也是测试工程师的必备技能,只有具备良好的编码能力,才能去做自动化、Unittest、以及测试开发等工作。

当我做了自动化测试工程师,我又发现相对于“发现”问题,“解决”问题更令我愉悦。我开始梦想有机会能去做开发,这样不但可以提高自己的编程能力,另外开发、测试都懂也能为自己今后的职业发展找到更多可能性。

最终是因为有这样的机会+自己的主动+编码过得去,我从测试转到了开发。起初的艰难和压力都是我工作近 10 年来前所未有的,白天看代码、晚上看代码、周末看代码… 天天如此。经过了半年多的努力,才终于上岸,可以做 C/C++ 项目的 Bugfix 了。

也正是因为有开发、自动化、持续集成的经验,在团队需要一名 Build/Release 工程师的时候,我知道这就是我最适合的岗位,负责产品的自动化构建、发布、基础设施建设、CI/CD 以及提高研发效能的相关开发工作。

就这样我从 QA 到 DEV 到 DEVOPS。公众号的更名记录也记录了我的职业路线变化:

  • 2019年07月28日 “软件测试与开发”改名“DevOps攻城狮”
  • 2018年12月29日 “DevQA”改名“软件测试与开发”
  • 2018年12月26日 “软件测试QA”改名“DevQA”
  • 2017年08月01日 注册“软件测试QA”

写作五年有哪些收获

写作是一项长期收益远超短期收益的事情

对于绝大多数人在短期内几乎不会有什么实质性的收益,还会花费大量的业余时间,妥妥的是用爱在发电。从金钱角度来衡量这件事,这是一件投入和产出完全不成比例的事情,很难坚持。

如果从长期来看,坚持写作一定会带来价值的,我总结有以五个方面的好处:

  1. 好记性不如烂笔头 - 当我们弄明白了一个技术难题,虽然当时明白了,但如果没记录下来,很有可能以后遇到同样的问题又不知道该如何解决。
  2. 让别人听懂才是真的懂 - 有时候对于一个问题我们认为自己明白了,当分享给别人的时候,才发现其中有的逻辑说不通,因此不得不继续思考并彻底搞清楚。
  3. 打造学习飞轮 - 当你坚持分享并有人关注到你并与你互动的时候,你就会有动力继续分享,学习新的知识然后再分享,一旦学习的飞轮造好了,坚持下去就变得容易。
  4. 间接收益 - 但凡坚持写点东西,对于以后找工作都或多或少会有些帮助,至少说明你是一个爱学习的人。如果你的分享让同行、未来你的面试官觉得很不错,很可能会给你带来一次新的工作机会。
  5. 直接收益 - 直接利益包括平台流量和广告收益、以及卖专栏、做咨询等。这要求就很高了,不但需要会自媒体运营,还有要超强的输出功力,这背后就是比别人更多的付出。

Read More

Vagrant 和 Docker 的区别,该如何选?

关于 Vagrant 的介绍,可以参看前一篇文章:什么是 Vagrant? Vagrant 和 VirtualBox 的区别

什么是 Vagrant

关于 Vagrant 的介绍,可以参看前一篇文章:什么是 Vagrant? Vagrant 和 VirtualBox 的区别

Vagrant 和 Docker 区别

关于 Vagrant 被问到最多的问题:Vagrant 和 Docker 之间有什么区别。

如果不分场景的直接比对 Vagrant 和 Docker 是不恰当的。在一些简单场景中,它们的作用是重复的,但在更多场景中,它们是无法相互替代的。

那么什么情况下应该用 Vagrant,什么情况下用 Docker 呢?

所以如果你仅仅是想管理虚拟机,那么你应该使用 Vagrant;如果你想快速开发和部署应用,那么应该使用 Docker。

下面具体来说说为什么。

Vagrant 是 VM 的管理工具,或是说编排工具;Docker 是用来构建、运行、管理容器的工具。那么这个问题其实落在了虚拟机(VM)和 容器(Container)的区别。

引用网络上一组照片来感受一下物理机(Host),虚拟机(VM)和 容器(Container)之间的区别。

物理机(Host)

物理机

虚拟机(VM)

虚拟机

容器(Container)

Docker

从图上我们更容易理解虚拟机(VM)和容器(Container)的这些不同:

特性 虚拟机 容器
隔离级别 操作系统级 进程级别
隔离策略 Hypervisor CGROUPS
系统资源 5 - 15% 0 - 5%
启动时间 分钟级 秒级
镜像存储 GB MB

总结:Vagrant 和 Docker 的使用场景区别

Read More