Ken的杂谈
  • Ken的杂谈 (current)
  • 关于
  • 杂谈
    Java Spring Spring Boot Spring Cloud MyBatis C# .NET Core .NET ASP.NET Core ASP.NET ClassLibrary Mono 数据库 MySQL SQL Server 网络 缓存 Web Linux CentOS Ubuntu macOS Nginx Windows ServiceStack JS/JQ 正则 工具 IDE Grafana Exceptions CI/CD Solution 微服务 Arch Docker 杂谈
  • 系列
    Java 快速入门系列教程 Spring Boot 入门教程 Spring Boot 2.x 入门教程 Spring Cloud 入门教程 .NET Core 快速入门教程 ASP.NET Core 2.1 入门教程 CentOS 7 快速上手教程 Ubuntu快速上手入门教程 Hyper-V基础教程 Docker入门教程
  • GitHub

Docker入门:带你了解Docker的特性和优缺点

Linux Docker @ 2022-11-25 00:05:35 · 阅读:(430)

一、 从虚拟化说起

在日常使用计算机过程中,通常是一组硬件(CPU、内存、磁盘空间等)同时运行1个操作系统,这对于个人计算机来说完全OK,但是对于大型计算机来说,硬件资源非常强大,如果同时只有1个操作系统,就无法满足多用户同时使用,程序也无法做到完全隔离运行,这就会导致资源浪费、或者由于资源竞争、环境冲突带来程序运行问题,所以虚拟化技术应运而生,虚拟化软件(KVM、VMware、VirtualBox、Hyper-V等)可以把硬件资源(CPU、内存、磁盘空间等)作为逻辑资源管理起来,这样就可以把硬件资源进行逻辑分割并安装独立的操作系统也通常称为虚拟机,这样就可以把一套硬件资源提供给多个用户使用,各自运行的程序互不干扰,这也为云技术的发展提供了基础,云厂商基于KVM或者自己的虚拟化技术把云服务发展的一路向好

二、Docker的出现

虚拟化/虚拟机技术非常好用也非常方便,但总归还是多运行了一层操作系统,这会带来性能的损耗,但随着Linux内核的发展带来了Cgroup和namespaces两个功能,这两个功能的组合为Linux带来了较为完善的以进程/进程组为纬度的资源隔离方式,在PaaS云厂商的激烈竞争中,Paas平台dotCloud(现已更名为Docker)推出了开源的容器技术Docker,Docker基于Cgroup+namespace,但是相较于原生使用Cgroup+namespace,Docker抽象了镜像、容器等概念,可以让开发者忘记Cgroup+namespace,开发者可以便捷的把自己的应用以及应用依赖的环境制作成镜像,并把镜像作为容器运行在Docker引擎上,开发者可以不再考虑部署环境的差异问题~这使得Docker收到了开发者们的追捧,成为了现在炙手可热的容器技术

三、Docker跟传统虚拟化的区别

Docker/容器技术跟传统虚拟化都是一种虚拟化技术,但Docker相较于对硬件资源虚拟化的传统虚拟化技术来说更加轻量级。传统虚拟化技术通过Hypervisor(虚拟机监视器)对硬件资源进行虚拟化分割后必须要安装操作系统,这在前面也提到了,会有额外的性能损耗,另外操作系统的启动、运行是一套复杂的机制,这就导致虚拟机相较于Docker容器的启动来说是过慢的,虚拟机中的操作系统本身也要消耗CPU、内存、硬盘等资源(以比较节省资源的服务器操作系统Debian为例,运行起来至少需要128Mb内存和4Gb磁盘),而如果使用Docker,这些资源都可以节省下来。如果以传统虚拟化的视角跟容器技术->Docker做一下对比,差不多是下图这样

image.png

四、进程隔离初探

前面多次提到了进程隔离,为了更好的理解Docker的运行机制,这里用Docker创建容器进程,然后基于容器进程我们一起看下这个进程隔离到底是怎么样的

1、环境准备

Docker CE 20.10.21 on CentOS 7

Docker环境的部署以及相关命令的介绍此处略过,后续会介绍

2、运行一个Ubuntu容器

#拉取ubuntu最新版本镜像
docker pull ubuntu
#启动一个名为ubuntu-ken的ubuntu容器
docker run -itd --name ubuntu-ken ubuntu

3、 进入Ubuntu容器并查看系统&进程信息

#进入ubuntu-ken容器
docker exec -it ubuntu-ken /bin/bash

#查看操作系统版本
root@acd249c669c5:/# cat /etc/os-release

PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
…………

#查看所有进程
root@acd249c669c5:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 17:42 pts/0    00:00:00 bash
root         9     0  0 17:44 pts/1    00:00:00 /bin/bash
root        18     9  0 17:51 pts/1    00:00:00 ps -ef

执行完这些命令,我们可以发现,容器运行在CentOS(HostOS)之上,但是可以拥有自己的环境->Ubuntu,而且容器本身的进程做到了隔离,在容器内部只能看到跟本容器相关的进程,宿主机(HostOS)上的其他进程不可见

4、在宿主机上查看进程

为了保持Ubuntu容器当前的进程,我们新建立一个SSH链接并查看Docker相关进程

#查看Docker相关进程
ps -ef | grep "docker"

#从结果中可以发现这里面新增了Docker进程
root      1747     1  0 02:22 ?        00:00:49 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root     16850 16686  0 12:44 pts/1    00:00:00 docker exec -it ubuntu-ken /bin/bash
root     17028 16902  0 13:03 pts/2    00:00:00 grep --color=auto docker

这里能可以看到一个Ubuntu容器,其实就是有Docker创建的运行在宿主机上的实实在在的进程

当然,除了我们看到的这些信息,Docker还默默通过Cgroup做了进程的资源使用限制,并通过cgroup做了进程分组和资源隔离等等

五、总结

Docker是一种基于Linux内核Cgroup+namespace功能的进程级虚拟化技术

image.png

由于容器并未实际运行在Docker Engine之上,所以用此图来描述Docker更加合适

1、Docker的优点

  • Docker可以把环境&应用打包成镜像(Image),可以做到非常小的体积,方便应用的部署、复制、迁移等
  • Docker容器作为进程运行,相较于传统虚拟化技术,少了操作系统以及Hypervisor性能的消耗,更加轻量级,节省资源
  • Docker不再跟操作系统强绑定,启动速度取决于应用的启动速度,速度费款

2、Docker的缺点

  • 但是Docker毕竟是进程级别的隔离,所以Docker的隔离并不彻底,例如:宿主机一旦修改时间,那么容器中的时间也会改变

  • 系列名称:Docker入门教程
  • 下一篇:Docker入门:Docker安装与基本使用

Ken的杂谈

本文由 ken.io 创作,采用CC BY 3.0 CN协议 进行许可。 可自由转载、引用、甚至修改,但需署名作者且注明出处。

Linux Docker

随笔目录


    © Copyright 2012-2023 Ken的杂谈

    豫ICP备10025012号-1

    ASP.NET Core(6.0) on Linux