Docker:Docker的基本认识

作者 : admin 本文共5661个字,预计阅读时间需要15分钟 发布时间: 2024-06-8 共4人阅读

文章目录

  • 虚拟化和容器
    • 什么是虚拟化和容器化?
    • 为什么要虚拟化和容器化?
    • 如何实现虚拟化和容器化?
      • 虚拟机
      • 容器
      • JVM类虚拟机
  • cgroups
    • 什么是cgroups
    • 为什么要使用cgroups
  • LXC
    • 什么是LXC?
  • Docker
    • Docker是什么?
    • Docker为什么比虚拟机快?
  • Docker架构
  • Docker安装

本篇开始总结的是关于Docker的概念内容

虚拟化和容器化

什么是虚拟化和容器化?

物理机:指的是一般的服务器和计算机,对于虚拟机的一个概念,这是一个实体的计算机,物理机可以提供给虚拟机对应的硬件环境,也被叫做是寄主和宿主的概念

虚拟化:就是通过虚拟技术,把一台计算机虚拟化为多个逻辑的计算机,在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机都可以运行不同的操作系统,并且应用程序都可以独立运行互不干扰,提高运行效率

容器化:这也是一种虚拟化技术,也叫做操作系统虚拟化,这种技术可以把操作系统内核虚拟化,允许用户空间软件被分割为多个独立的单元,在内核运行,而不是一个单一的实例运行,这种软件实例就叫做是容器

为什么要虚拟化和容器化?

资源利用率高

把利用率较低的服务器上的资源进行整合,用更少的硬件资源运行更多的业务,降低一些成本

环境标准化

可以实现执行环境的标准化发布,部署和运维,开发过程中一个常见的问题就是环境一致性问题,而如果使用Docker进行部署,就可以解决这样的问题,避免因为环境导致的bug在实际的生产环境中出现

资源弹性伸缩

使用虚拟化技术,可以根据业务调整所需要的硬件软件资源,比如遇到双11等人流量大的场景,就进行服务器扩容,之后再收回去就可以了

差异化环境提供

使用虚拟化技术,可以把依赖不同操作系统的服务部署在一起

沙箱安全

即使一个服务器上的数据发生了丢失,也不影响整体其他服务器的运行情况,比如…

Docker:Docker的基本认识插图
容器更加轻量级

使用容器进行数据的管理,可以更加轻量级的启动程序,节约了不少部署的时间,相当于不需要windows启动,直接运行内核即可

维护和扩展

Docker使用分层存储和镜像的技术,可以把应用重复部分更加容易的复用,也更加容易进行维护更新,基于基础镜像创建出新的镜像,Docker本身也提供了一大批高质量的官方镜像,可以直接部署在实际的生产环境中,并且进行一个定制,降低了应用服务的镜像制作成本,比如可以直接使用命令拿到下面的环境:

Docker:Docker的基本认识插图(1)

如何实现虚拟化和容器化?

首先先认识一下应用程序执行环境:

Docker:Docker的基本认识插图(2)

虚拟机

那么虚拟机,就是存在于硬件层和操作系统层之间的一种虚拟化技术,它可以伪造一个硬件的接口,把操作系统以及它上面的内容嫁接到硬件上,形成一个好像是真实存在的机器,比如可以在windows机器上嫁接一个Android虚拟机,这样就可以借助Android的操作系统,windows的硬件,正常使用Android上的app了

容器

容器是存在于操作系统层和函数库之间的虚拟化技术,容器伪造出一个操作系统的接口,可以把函数库层以上的功能放在操作系统上,以Docker为例来说,就是基于Linux操作系统实现的一个隔离容器,可以模拟出操作系统的功能,换句话说,如果虚拟机是把整个操作系统实现一个封装隔离,从而实现出跨平台应用,那么容器就是把一个一个的应用进行封装隔离,实现跨平台应用,这也就导致了容器的体积是要比虚拟机小的,理论上来说占据的资源也会更小

容器化本质上就是应用程序级别的虚拟化技术,容器提供了将对应的应用程序代码,运行所需和系统工具等打包到一起,容器就能共享一个操作系统的内核,将其放在硬件上

JVM类虚拟机

这是存在于函数库层和应用程序之间的虚拟化技术,通过不同的版本适应不同的操作系统函数库,从而实现出对外提供统一的运行环境给程序和开发者

cgroups

什么是cgroups

简单来说,它是Linux内核提供的一种机制,这个机制可以根据需求把一系列系统任务和及其子任务整合到按照资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架,也就是说,cgroups可以限制和记录任务组所使用的物理资源

为什么要使用cgroups

使用cgroups可以对于cpu和内存等资源的精细化的控制,目前的轻量级容器都提供了这样的功能,那这样做的好处是,假设我们把前端后端都部署在了一个四核的服务器上,那么就可以平均分配,使用cgroups把web server可以使用其中的两个核,剩下的留给后端计算模块,这样可以实现资源分配利用

对于使用cgroups,这里就不展开讲述了,后续如果用到了,应该会专门展开进行讲述吧~

LXC

什么是LXC?

LXC,Linux容器,一种操作系统层的虚拟化技术,为Linux内核容器功能的一个用户空间接口,它主要是把应用软件系统打包为一个软件容器,里面包含的是应用软件本身的代码,以及所需要的操作系统核心和库,透过统一的命名空间和共享API,来实现分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以更加容易的创建和管理系统或者是应用容器

从中可以看出,其实Docker就是LXC的增强版~

Docker:Docker的基本认识插图(3)

Docker

Docker是什么?

前面讲了这么多,现在回到主题,Docker是什么?

Docker本质上就是LXC的增强版,它本身不是容器,而是容器的易用工具,容器是Linux内核中的技术,Docker只是把这种技术在使用上简易普及了,Docker在早期的版本其核心就是LXC的二次封装发行版

Docker作为是容器技术的实现,它本身是使用Go语言开发的开源项目,主要目的是要进行组件的封装,分发,部署,运行等生命周期的管理,使得用户可以做到,一次封装,四处运行的效果

在早期的Docker发展中,它是使用LXC来作为容器进行管理引擎的,但是在创建容器的过程中,不再使用模板来进行安装生成,而是通过镜像技术,也就是把操作系统用户空间中所需要用到的组件全部都事先排列完毕,打包为一个.image 文件,然后把镜像文件集中存放在一个仓库当中,当需要进行创建容器的时候,Docker工具就会借助LXC中的工具lxc-create,但不再使用lxc的模板来进行安装,而是连接到了镜像服务器来金下载匹配的镜像文件,之后基于镜像启动容器

所以,Docker极大的简化了容器的使用难度,之后在进行创建启动容器的时候,其实只需要一个命令,docker-run,docker-stop,就可以启动和停止一个容器了

Docker为什么比虚拟机快?

Docker:Docker的基本认识插图(4)
从上图可以看出,在抽象层方面,Docker的抽象层是更少的,运行的实际上是实际的物理机上的硬件资源,所以比虚拟机要快一些

Docker架构

Docker使用的是客户端服务器模式,通过使用远程API来进行创建和管理Docker容器,而Docker容器又可以通过Docker镜像来进行创建

Docker:Docker的基本认识插图(5)
在这个当中存在一些概念要进行声明:

Docker仓库

Docker仓库是用来保存镜像的,可以理解为是代码控制中的代码仓库,Docker Hub中也提供了庞大的镜像集合来进行使用

Docker daemon

Docker daemon是服务器组件,也是Docker最核心的后台进程

Docker客户端

Docker客户端通过命令行或者是其他的方式来和守护进程进行通信

Docker主机

一个物理或者虚拟的机器来用于执行Docker守护进程和容器

Docker镜像

Docker镜像是用于进行创建Docker容器的模板

Docker容器

容器是单独进行运行一个或者一组应用

Docker安装

对于Docker的安装这里不做过多介绍,不过需要注意的是,在安装结束后要尝试运行一下:

sudo docker run hello-world

要看到这样的界面才算完成:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 http://hub.docker.com/

For more examples and ideas, visit:
 http://docs.docker.com/get-started/

如果无法完成,可以换到自己云服务器对应的连接,比如腾讯云的服务器的换源方法如下:

test@VM-24-7-ubuntu:~$ vim /etc/docker/daemon.json
test@VM-24-7-ubuntu:~$ sudo vim /etc/docker/daemon.json
test@VM-24-7-ubuntu:~$ cat /etc/docker/daemon.json
{
   "registry-mirrors": [
   "http://mirror.ccs.tencentyun.com"
  ]
}
test@VM-24-7-ubuntu:~$ sudo systemctl restart docker
test@VM-24-7-ubuntu:~$ sudo docker info
Client: Docker Engine - Community
 Version:    26.1.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 26.1.4
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.15.0-106-generic
 Operating System: Ubuntu 22.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 3.32GiB
 Name: VM-24-7-ubuntu
 ID: 011653a4-e5f0-4c95-9070-b6751236e9a5
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  http://mirror.ccs.tencentyun.com/
 Live Restore Enabled: false

在看到:

 Registry Mirrors:
  http://mirror.ccs.tencentyun.com/

就说明换源成功了

上述是我在安装Docker时遇到的问题,故在此总结下来

本站无任何商业行为
个人在线分享 » Docker:Docker的基本认识
E-->