> 文章列表 > Docker原理与镜像管理

Docker原理与镜像管理

Docker原理与镜像管理

目录

一、虚拟化概述

虚拟架构

1、寄居架构

2、原生架构

两者的区别

虚拟化产品

虚拟化类型

二、Docker概述

Logo含义

Docker的设计宗旨

Docker与虚拟机的区别

Docker核心概念

镜像

容器

仓库

Docker Engine(引擎)

Docker运行的原理

docker容器的生命周期

docker容器主要7个状态

暂停和停止状态区别

三、安装Docker

查看Docker版本信息

 查看docker信息

Docker镜像管理

1、配置镜像加速器(阿里云)

2、查看镜像信息

3、查看下载的镜像文件信息

4、查看下载到本地的所有镜像

5、搜索镜像

6、获取镜像

7、根据镜像的唯一标识ID号,获取镜像详细信息

8、为本地镜像添加新标签

9、删除镜像

10、批量删除镜像

11、存储镜像---将镜像保存成为本地文件

12、导入镜像---将镜像文件导入到镜像库中

13、上传镜像


一、虚拟化概述

将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率

虚拟架构

1、寄居架构

本机(真实操作系统)--> 虚拟化产品 --> 虚拟化操作系统或软件

虚拟化寄居架构是指在我们真实的操作系统上安装一个虚拟化软件,然后在虚拟化软件中安装虚拟系统。它稳定性不是很高当真实机宕掉后,这上面的虚拟系统都会宕掉。所以这种架构一般用于个人,比如个人搭建测试环境。

寄居架构的特点

  1. 简单、便于实现
  2. 相对于硬件独立
  3. 同一服务器上的虚拟机之间相互隔离
  4. 在一物理服务器上同时运行多个虚拟机

寄居架构的缺点

当宿主操作系统出现任何问题时,虚拟机操作系统都将无法使用。

2、原生架构

裸金属之上

服务器 --> 虚拟化产品

      虚拟化原生架构是虚拟软件直接安装在硬件上的,不会再依赖操作系统。这种架构一般应用在企业,应为它比较稳定。

裸金属架构的特点

  1. 有物理隔离特性,安全性能高
  2. 资源完全独占,没有性能消耗
  3. 完全继承了虚拟化云服务的运行特性
  4. 可以兼容其他云产品

裸金属架构的缺点

       硬件的兼容性,原生架构的虚拟机为了保持稳定性及微内核,不可能将所有硬件产品的驱动程序都放入。

两者的区别

  • 裸金属架构不需要操作系统,虚拟化软件直接安装在服务器上
  • 寄居架构需要操作系统,虚拟化软件需要安装在操作系统上 

虚拟化产品

vmware:

VMware  workstation(寄居架构)

vmware vsphere(原生架构)

kvm/openstack     linux环境虚拟机    私有云环境

xen   虚拟机监视器

esxi   裸金属之上    虚拟化系统

虚拟化类型

1、全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用

2、半虚拟化:需要修改操作系统

3、直通:直接使用物理硬件资源(需要支持,还不完善)

全虚拟化:kvm

半虚拟化:exsi

虚拟化功能

在一个操作系统内,模拟多个多个操作系统

以软件的方式模拟物理设备的功能

二、Docker概述

  • Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
  • Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。

Logo含义

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。

鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker的设计宗旨

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere

       即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

容器化越来越受欢迎,因为容器是:

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:可以即时部署更新和升级。
  • 便携式:可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:可以增加并自动分发容器副本。
  • 可堆叠:可以垂直和即时堆叠服务。

Docker与虚拟机的区别

       容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
       虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

特性 Docker容器 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗50%左右
性能 接近原生 弱于原生
系统支持量(单机) 上千个 几十个
隔离性 资源隔离/限制 完全隔离
封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离

容器在内核中支持2种重要技术:

       Docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。

namespace的六项隔离

namespace 系统调用参数 隔离内容
UTS CLONE_NEWUTS 主机名与域名
IPC CLONE_NEWWIPC 信号量、消息队列和共享内存
PID CLONE_NEWPID 进程编号
NETWORK CLONE_NEWNET 网络设备、网络栈、端口等
MOUNT CLONE_NEWNS 挂载点(文件系统)
USER CLONE_NEWUSER 用户和用户组(3.8以后的内核才支持)

Docker核心概念

镜像

       Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。

       通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

        Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。

容器

        Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

        可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

        docker容器可以被看作运行在宿主机上的一个进程,容器共享宿主机的内核,容器间是通过namespace(命令空间、名称空间)隔离资源,,通过Cgroups(资源配额)去限制资源 

仓库

        Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。

最大的公开库是docker  hub 

Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 

Docker Engine(引擎)

 Docker Engine是具有一下主要组件的C/S客户端——服务器应用程序

Server端:服务器是一种长期运行额程序,称为守护程序进程(dockerd命令)

Client端:REST API ,他指定程序可以用来与守护程序进行通信并指示其它操作的接口

命令行界面(CLI)客户端(Docker命令)

Docker运行的原理

  • docker基于客户端(容器)   服务器(docker引擎)结构的系统
  • docker的守护进程运行在宿主主机上,客户端(容器)通过socker向docker引擎发送相应的指令,docker服务器就会执行相应的命令
  • docker会以root权限运行他的守护进程,来处理普通linux用户无法完成的操作(如挂在文件系统等操作)

docker容器的生命周期

docker容器主要7个状态

  1. create:已创建,但还未运行的容器
  2. running:正在运行中的容器
  3. restarting:容器正在重启中
  4. removing:容器正在迁移中
  5. paused:已暂停状态的容器
  6. exited:停止状态的容器
  7. dead:死亡,主要是操作系统出现异常或者断电关机等有可能引发dead状态,不是很常见

暂停和停止状态区别

docker paused 命令挂起指定的容器中的所有进程

docker stop   容器内主进程会在指定时间内被杀死,默认为10秒后

三、安装Docker

目前Docker只支持64位操作系统


systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙yum install -y yum-utils device-mapper-persistent-data lvm2 
#安装依赖包#yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
#设置阿里docker镜像源yum install -y docker-ce docker-ce-cli containerd.io
#安装docker-ce 并设置为开机自启
#docker-ce-cli、containerd.io 会作为依赖包被安装systemctl start docker.service
systemctl enable docker.service 

        安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。

查看Docker版本信息

docker version
#查看docker版本信息
Client: Docker Engine - CommunityVersion:           23.0.4     #yum安装会默认安装最新版API version:       1.42Go version:        go1.19.8Git commit:        f480fb1Built:             Fri Apr 14 10:36:38 2023OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          23.0.4API version:      1.42 (minimum version 1.12)Go version:       go1.19.8Git commit:       cbce331Built:            Fri Apr 14 10:34:14 2023OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.6.20GitCommit:        2806fc1057397dbaeefbea0e4e17bddfbd388f38runc:Version:          1.1.5GitCommit:        v1.1.5-0-gf19387adocker-init:Version:          0.19.0GitCommit:        de40ad0

 查看docker信息

[root@localhost ~]# docker info
#docker信息查看
Client:Context:    defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version:  v0.10.4Path:     /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version:  v2.17.2Path:     /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 0                  #容器数量Running: 0                    #正在运行的数量Paused: 0                     #暂停的数量Stopped: 0                    #已经停止的数量Images: 0                      #镜像数量Server Version: 23.0.4         #docker server版本Storage Driver: overlay2       #docker使用的是overlay2文件驱动Backing Filesystem: xfs       #宿主机上的底层文件系统Supports d_type: trueUsing metacopy: falseNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: cgroupfs        #Cgroups 驱动Cgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runc.v2 runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 2806fc1057397dbaeefbea0e4e17bddfbd388f38runc version: v1.1.5-0-gf19387ainit version: de40ad0Security Options:seccompProfile: builtinKernel Version: 3.10.0-693.el7.x86_64       #宿主机的相关信息Operating System: CentOS Linux 7 (Core)     #操作系统OSType: linux                               #操作系统类型Architecture: x86_64                        #系统架构CPUs: 2                                     #CPU数Total Memory: 1.781GiB                      #总空间Name: localhost.localdomain                 #主机名ID: 9c41d00d-ad9d-4274-89e3-1b391fe58c8fDocker Root Dir: /var/lib/docker            #docker数据存储目录Debug Mode: falseRegistry: https://index.docker.io/v1/       #registry地址Experimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors:                           #加速站点https://8jp5yjkf.mirror.aliyuncs.com/Live Restore Enabled: false

Docker镜像管理

1、配置镜像加速器(阿里云)

进入网址,选择操作系统,里面有现成的配置

容器镜像服务 (aliyun.com)https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://8jp5yjkf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、查看镜像信息

镜像下载后存放在 /var/lib/docker 。

       Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。

3、查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

4、查看下载到本地的所有镜像

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   15 months ago   141MB#repository:镜像属于的仓库
#TAG:镜像的标签信息,标记同一个仓库中的不同镜像
#TMAGE ID:镜像的唯一ID号,唯一标识一个镜像
#CREATED:镜像创建时间
#SIZE:镜像大小

5、搜索镜像

格式
docker search 关键字

6、获取镜像

格式
docker pull 仓库名称[:标签]

#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

7、根据镜像的唯一标识ID号,获取镜像详细信息

格式
docker inspect 镜像ID号

8、为本地镜像添加新标签

格式
docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:laster nginx:web

9、删除镜像

格式
docker rmi 仓库名称:标签
#当一个镜像有多个标签时,只是删除其中指定的标签
或
docker rmi 镜像ID号
#会彻底删除该镜像

注:如果该镜像已经被容器使用,正确的做法是先删除依赖关系该镜像的所有容器,再去删除镜像。

10、批量删除镜像

#docker images -q 可以加载镜像id
#批量删除所有镜像
docker rmi `docker images -q`
#批量删除nginx镜像
docker rmi `docker images|grep "nginx"`

11、存储镜像---将镜像保存成为本地文件

格式
docker save -o 存储文件名 存储的镜像
例:docker save -o nginx nginx:latest
#存储镜像命名为nginx存在当前目录下

12、导入镜像---将镜像文件导入到镜像库中

格式
docker load < 存储的文件
或
docker load -i 存储的文件
例:docker load < nginx

13、上传镜像

       默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

docker tag nginx:latest soscscs/nginx:web	#添加新的标签时必须在前面加上自己的dockerhub的username
docker login								#登录公共仓库
Username:soscscs
password:abc123456
docker push soscscs/nginx:web		    	#上传镜像