Docker入门基础,安装,基础命令,镜像

一、Docker基础介绍

1.1 容器历史

        虽然docker把容器技术推向了巅峰,但容器技术却不是从 docker 诞生的。实际上,容器技术连新技术都算不上,因为它的诞生和使用确实有些年头了。下面的一串名称可能有的你都没有听说过,但它们的确都是容器技术的应用

1.2 Docker是什么

        Docker 是基于linux内核实现,Docker 最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可以提供轻量级的虚拟化 ,可以说 docker 就是基于 LXC 发展起来 的,提供 LXC 的高级封装,标准的配置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernel-based Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。

        Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker 的三大理念是build(构建)、ship(运输)、 run(运行)。

1.3 Docker和虚拟机,物理主机

操作系统的组成:

Bootloader:它负责设备的启动过程。
Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
Desktop Environment:这是用户通常与之交互的环境。
Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
Applications: 这些是执行不同用户任务(例如word,excel等)的程序集。
Daemons : 后台服务提供商。

什么是内核kernel

内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。
每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。

内核的任务

用于应用程序执行的流程管理。
内存和I / O(输入/输出)管理。
系统调用控制(内核的核心行为)。
借助设备驱动程序进行设备管理。

内核空间,用户空间是什么?

内核空间:

内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。

用户空间:

用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。

        传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软件
        容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化,和宿主机共用内核
        每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响

1.4 Docker的组成

docker 官网: http://www.docker.com

帮助文档链接: https://docs.docker.com/

docker 镜像: https://hub.docker.com/   (需要开科技打开)

docker 中文网站: http://www.docker.org.cn/

Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
Docker 服务端(Server): Docker守护进程,运行docker容器 dockerd 执行客户端工具的操作指令
Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程

1.5 NameSpace

一个宿主机运行了N个容器,由于多个容器共用一个 OS,必然带来的以下问题:

怎么样保证每个容器都有不同的文件系统并且能互不影响?
一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进程?各个容器子进程间能相互通信(内存数据)吗?
每个容器怎么解决IP及端口分配的问题?
多个容器的主机名能一样吗?
每个容器都要不要有root用户?怎么解决账户重名问题

        NameSpace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响。

        如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

隔离类型功能系统调用参数内核版本
MNT Namespace(mount)提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNS2.4.19
IPC Namespace(Inter-Process Communication)提供进程间通信的隔离能力,包括信号量,消息队列和共享内存CLONE_NEWIPC2.6.19
UTS Namespace(UNIXTimesharing System)提供内核,主机名和域名隔离能力CLONE_NEWUTS2.6.19
PID Namespace(ProcessIdentification)提供进程隔离能力CLONE_NEWPID2.6.24
Net Namespace(network)提供网络隔离能力,包括网络设备,网络栈,端口等CLONE_NEWNET2.6.29
User Namespace(user)提供用户隔离能力,包括用户和组CLONE_NEWUSER3.8
TimeNamespace提供时间隔离能力CLONE_NEWTIME5.6
syslogNamespace提供syslog隔离能力syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能
Controlgroup(cgroup)Namespace提供进程所属的控制组的身份隔离Linux4.6

1.5.1 MNT NameSpace

        每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。

1.5.2 IPC NameSpace

        一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器直接访问其他容器的数据

1.5.3 UTS NameSpace

        UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识。

其中包含了:

主机名hostname

域名domainname

内核名称

它使得一个容器拥有属于自己主机名标识,这个主机名标识独立于宿主机系统和其上的其他容器。

1.5.4 PID NameSpace

Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程

那么在每个容器内也要有一个父进程来管理其下属的子进程

那么多个容器的进程通过  PID namespace  进程隔离

比如:

PID编号重复

容器内的主进程生成

回收子进程

1.5.5 NET NameSpace

        每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等

        Docker使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,

        通常是docker0,而docker0实质就是Linux的虚拟网桥,

        网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。

1.5.6 User NameSpace

        各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?

        User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见。

1.6 验证系统Cgroups

[root@Node2 ~]#:grep CGROUP /boot/config-3.10.0-1062.el7.x86_64 
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y

1.7 容器管理工具

        有了以上的chroot、namespace、cgroups就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。目前主要是使用docker,早期使用 LXC。

Docker

        相当于增强版的LXC,功能更为强大和易用,也是当前最主流的容器前端管理工具Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。

Podman  

虽然目前 Docker 是管理 Linux 容器最好的工具,注意没有之一,但是podman的横空出现即将改变这一点

什么是Podman?

        Podman即Pod Manager tool,从名称上可以看出和kubernets的pod的密切联系,不过就其功能来说,简而言之: alias docker = podman ,是CentOS 8 新集成的功能,或许不久的未来会代替dockerPodman是一个 为 Kubernetes 而生的开源的容器管理工具,原来是 CRI-O(即容器运行时接口CRI 和开放容器计划OCI) 项目的一部分,后来被分离成一个单独的项目叫 libpod。其可在大多数Linux平台上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合Open Container Initiative(OCI)标准的容器和容器镜像。Podman 提供了一个与Docker兼容的命令行前端,Podman 里面87%的指令都和Docker CLI 相同,因此可以简单地为Docker CLI别名,即“ alias docker = podman”,事实上,podman使用的一些库也是docker的一部分。

Podman 和docker不同之处

docker 需要在系统上运行一个守护进程(docker daemon),这会产生一定的开销,而podman 不需要。

启动容器的方式不同:

docker cli 命令通过API跟 Docker Engine(引擎) 交互告诉它我想创建一个container,然后

docker Engine 才会调用 OCI container runtime(runc) 来启动一个container。这代表

container的process(进程)不会是 Docker CLI 的 child process(子进程) ,而是 Docker

Engine 的 child process 。

Podman 是直接给 OCI containner runtime(runc) 进行交互来创建container的,所以

container process 直接是 podman 的 child process 。

因为docke有docker daemon,所以docker启动的容器支持 --restart 策略,但是podman不支持

docker需要使用root用户来创建容器。 这可能会产生安全风险,尤其是当用户知道docker run命令的--privileged选项时。podman既可以由root用户运行,也可以由非特权用户运行

docker在Linux上作为守护进程运行扼杀了容器社区的创新。 如果要更改容器的工作方式,则需要更改docker守护程序并将这些更改推送到上游。 没有守护进程,容器基础结构更加模块化,更容易进行更改。 podman的无守护进程架构更加灵活和安全。

Docker的优势

快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上

高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率

节省开支: 提高服务器利用率,降低IT支出

简化配置: 将运行环境打包保存至容器,使用时直接启动即可

环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题

快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台

更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响

1.8 Docker的缺点

多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底

由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐

如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

1.9 容器核心技术

1.9.1 容器规范

        容器技术除了的docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux 基金会、Docker、微软、红帽谷歌和、IBM、等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了三个规范,分别是runtime spec和 image format spec distribution-spec ,有了这三个规范,不同的容器公司开发的容器只要兼容这三个规范,就可以保证容器的可移植性和相互可操作性。

runtime spec

image format spec 制作镜像的规范,docker podman

distribution-spec

1.9.2 容器runtime

runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境。

runtime 类型:

1.Lxc: linux上早期的runtime,在 2013 年 Docker 刚发布的时候,就是采用lxc作为runtime, Docker把 LXC 复杂的容器创建与使用方式简化为 Docker 自己的一套命令体系。随着Docker的发展,原有的LXC不能满足Docker的需求,比如跨平台功能

2.Libcontainer: 随着 Docker 的不断发展,重新定义容器的实现标准,将底层实现都抽象化到Libcontainer 的接口。这就意味着,底层容器的实现方式变成了一种可变的方案,无论是使用namespace、cgroups 技术抑或是使用 systemd 等其他方案,只要实现了 Libcontainer 定义的一组接口,Docker 都可以运行。这也为 Docker 实现全面的跨平台带来了可能。

3.runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范

4.crun: 红帽推出的 运行时基于C语言开发,集成在podman内部

5.rkt: 是CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容 器

1.9.3 容器管理工具

管理工具连接runtime与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给。

runtime执行。

lxc 是lxd 的管理工具

Runc的管理工具是docker engine,docker engine包含后台deamon和cli两部分,大家经常提到

的Docker就是指的docker engine

Rkt的管理工具是rkt cli

1.9.4 容器定义工具

        容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。Docker image: 是docker 容器的模板,runtime依据docker image创建容器Dockerfile: 包含N个命令的文本文件,通过dockerfile创建出docker imageACI(App container image): 与docker image类似,是CoreOS开发的rkt容器的镜像格式。

1.9.5 镜像仓库Registry

统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库

Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用

阿里云,网易等第三方镜像的公共仓库

Image registry: docker 官方提供的私有仓库部署工具,无web管理界面,目前使用较少

Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用

1.9.6 容器编排工具

当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎容器编排通常包括容器管理、调度、集群定义和服务发现等功能。

Docker compose : docker 官方实现单机的容器的编排工具

Docker swarm: docker 官方开发的容器编排引擎,支持overlay network

Mesos+Marathon: Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发的,后在Twitter得到广泛使用。通用的集群组员调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能

Kubernetes: google领导开发的容器编排引擎,内部项目为Borg,且其同时支持 docker 和

CoreOS,当前已成为容器编排工具事实上的标准

二、安装Docker

CentOS 6 因内核太旧,即使支持安装docker,但会有各种问题,不建议安装

CentOS 7 的 extras 源虽然可以安装docker,但包比较旧,建议从官方源或镜像源站点下载安装docker

CentOS 8 有新技术 podman 代替 docker

因此建议在CentOS 7 上安装 docker

2.1 yum安装

由于官网的yum源太慢,下面使用阿里云的Yum源进行安装

[root@Node1 ~]#:cd /etc/yum.repos.d/
[root@Node1 yum.repos.d]#:mkdir bak
[root@Node1 yum.repos.d]#:mv *.repo bak/

下载,修改阿里yum源

[root@Node1 yum.repos.d]#:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@Node1 yum.repos.d]#:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@Node1 yum.repos.d]#:wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看所有的可用版本

[root@Node1 yum.repos.d]#:yum list --showduplicates docker-ce
......
已安装的软件包
docker-ce.x86_64                     3:26.1.4-1.el7                               @docker-ce-stable
可安装的软件包
docker-ce.x86_64                     17.03.0.ce-1.el7.centos                      docker-ce-stable 
docker-ce.x86_64                     17.03.1.ce-1.el7.centos                      docker-ce-stable 
docker-ce.x86_64                     17.03.2.ce-1.el7.centos                      docker-ce-stable
......

可以使用帮助查看

root@Node2 yum.repos.d]#:yum list --help
已加载插件:fastestmirror, langpacks
Usage: yum [options] COMMAND
List of Commands:
check          检查 RPM 数据库问题
check-update   检查是否有可用的软件包更新
clean          删除缓存数据
deplist        列出软件包的依赖关系
distribution-synchronization 已同步软件包到最新可用版本
downgrade      降级软件包
......

下载启动并查看状态:

[root@Node1 yum.repos.d]#:yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7
......
已安装:
  docker-ce.x86_64 3:19.03.15-3.el7              docker-ce-cli.x86_64 1:19.03.15-3.el7             

作为依赖被安装:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8     containerd.io.x86_64 0:1.6.33-3.1.el7    

完毕!
[root@Node1 ~]#:systemctl start docker
[root@Node1 ~]#:systemctl status docker 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2024-07-30 18:46:49 CST; 19s ago
     Docs: https://docs.docker.com
 Main PID: 4508 (dockerd)
......

2.2 yum安装2024版本

安装依赖包:

[root@Node1 ~]#:yum install -y yum-utils device-mapper-persistent-data lvm2
......
更新完毕:
  device-mapper-persistent-data.x86_64 0:0.8.5-3.el7_9.2      lvm2.x86_64 7:2.02.187-6.el7_9.5     
  yum-utils.noarch 0:1.1.31-54.el7_8                         

作为依赖被升级:
  device-mapper.x86_64 7:1.02.170-6.el7_9.5                                                        
  device-mapper-event.x86_64 7:1.02.170-6.el7_9.5                                                  
  device-mapper-event-libs.x86_64 7:1.02.170-6.el7_9.5                                             
  device-mapper-libs.x86_64 7:1.02.170-6.el7_9.5                                                   
  lvm2-libs.x86_64 7:2.02.187-6.el7_9.5                                                            

完毕!

设置阿里云镜像源

[root@Node1 ~]#:yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

安装docker

[root@Node1 ~]#:yum install -y docker-ce docker-ce-cli containerd.io
......
已安装:
  containerd.io.x86_64 0:1.6.33-3.1.el7               docker-ce.x86_64 3:26.1.4-1.el7              
  docker-ce-cli.x86_64 1:26.1.4-1.el7                

作为依赖被安装:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8  docker-buildx-plugin.x86_64 0:0.14.1-1.el7  
  docker-ce-rootless-extras.x86_64 0:26.1.4-1.el7     docker-compose-plugin.x86_64 0:2.27.1-1.el7 
  fuse-overlayfs.x86_64 0:0.7.2-6.el7_8               fuse3-libs.x86_64 0:3.6.1-4.el7             
  slirp4netns.x86_64 0:0.4.3-4.el7_8                 

完毕!

镜像仓库加速。这里的地址,是在官网获取,镜像加速器

[root@Node1 ~]#:vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

重新加载配置文件,启动,查看状态

[root@Node1 ~]#:systemctl daemon-reload
[root@Node1 ~]#:systemctl start docker
[root@Node1 ~]#:systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2024-07-30 18:58:29 CST; 5s ago
     Docs: https://docs.docker.com
 Main PID: 4671 (dockerd)
......

三、基础操作

3.1 docker程序环境

3.1.1 环境配置文件

/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker

3.1.2 Unit File

/usr/lib/systemd/system/docker.service

3.1.3 docker-ce配置文件

/etc/docker/daemon.json

3.1.4 Docker Registry配置文件

/etc/containers/registries.conf

3.2 基础操作

3.2.1 查看docker版本

[root@Node1 ~]#:docker version
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

3.2.2 docker信息查看

[root@Node1 ~]#: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        #Server版本
 Storage Driver: overlay2        #docker使用的是overlay2文件驱动
  Backing Filesystem: xfs        #宿主机上的底层文件系统
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs        #cgroups驱动
 Cgroup Version: 1
 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:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1062.el7.x86_64        #宿主机相关信息
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.84GiB
 Name: Node1
 ID: 9938ddd0-eac5-475d-a5e6-5bdbb5071f55
 Docker Root Dir: /var/lib/docker            #docker数据存储目录
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://xxxxxx.mirror.aliyuncs.com/        #registry地址
 Live Restore Enabled: false

3.2.3 docker配置文件

位置:/etc/docker/daemon.json

3.2.3.1 镜像仓库加速

镜像加速下载:

浏览器访问地址:

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

 写入配置文件:这里是我个人的镜像

[root@Node1 ~]#:vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

拉取镜像:

重启

配置镜像仓库配置

在另一个终端查看镜像

拉取成功后,就会有我们拉取的镜像了。

3.2.3.2 数据目录

        UnionFS是文件级的存储驱动,实现方式是把位于不同位置的目录或文件合并 mount到同一个目的目录中,简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统,这种文件系统可以一层一层地叠加修改文件,无论底下有多少层都是只读的,只有最上层的文件系统是可写的。

四、镜像管理

4.1 下载镜像

从docker仓库将镜像下载到本地,命名格式如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags               Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

#NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
#:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像  工作中指定版本号

在上面我们已经使用pull拉取了一个镜像,通过docker images查看镜像。在目录/var/lib/docker/overlay2/下查看镜像id。

4.2 查看指定镜像的详细信息

使用docker images查看镜像的详细信息

[root@Node1 ~]#:docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB

镜像名      tag标签     镜像id      创建时间    大小

也可以使用指定镜像的方式查看,docker image inspect hello-world

也可以指定id查看:

4.3 镜像导出

        利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用。

格式:

docker save [OPTIONS] IMAGE [IMAGE...]
选项:  
-o, --output string   Write to a file, instead of STDOUT

常见用法:

docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar

示例:导出镜像。

导出镜像后,查看镜像是还存在的,并没有删除。

恢复镜像:

[root@Node1 ~]#:docker load -i /root/hello-world.tar 
Loaded image: hello-world:latest

4.4 镜像打标签

docker tag

如果不指定标签,默认的是latest最新版。

格式:

镜像打标签。docker tag 镜像名(或镜像id) 镜像版本号。

[root@Node1 ~]#:docker tag nginx 192.168.114.10/data/busybox:v1.1
[root@Node1 ~]#:docker images
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
192.168.114.10/data/busybox   v1.1      605c77e624dd   2 years ago   141MB
nginx                         latest    605c77e624dd   2 years ago   141MB
tomcat                        latest    fb5657adc892   2 years ago   680MB
hello-world                   latest    feb5d9fea6a5   2 years ago   13.3kB

4.5 删除镜像

docker rmi 镜像

docker rmi 命令可以删除本地镜像

格式:

docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force     Force removal of the image
    --no-prune   Do not delete untagged p

[root@Node1 ~]#:docker rmi 192.168.114.10/data/busybox:v1.1
Untagged: 192.168.114.10/data/busybox:v1.1

删除多个镜像:

[root@Node1 ~]#:docker rmi nginx tomcat
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
Untagged: tomcat:latest
Untagged: tomcat@sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Deleted: sha256:fb5657adc892ed15910445588404c798b57f741e9921ff3c1f1abe01dbb56906
Deleted: sha256:2b4d03a9ce5e200223e5c398d4739d23dd19ad0d6e692cfc65ba3a8fae838444
Deleted: sha256:35c5ea12be1face90896b3a52afc28433885c4448a6c5cfe07561f82365cd18e
Deleted: sha256:6830091c111746b7534960d17f6c156be45d8dcfe0defb06bd427ef38bf49aae
Deleted: sha256:ea82d4efcdfa1c039d722a5a9613c18d3c3a84fbba8efae5e7f13cb3b4ec379f
Deleted: sha256:79a6c362c6b1a580d2d8d33f6d860d45c530f34ff7c0441d36b61aceefdfd656
Deleted: sha256:1788a74c5c86e769f61cd615269eba11c3d7648eac4a85a1ffd2840427820a2f
Deleted: sha256:cbce712ed17923285239f9d9c0528984aef065b7413d68a0290e2c8eecc98f4a
Deleted: sha256:aa56d037ee5925ebf11127c3e1f617874c4ce8bae6b6af7d132b7f7a4a606e6f
Deleted: sha256:97e5f44efb543d466c5847602654a8cb22c9466b61d04988d47ec44b197ea874
Deleted: sha256:11936051f93baf5a4fb090a8fa0999309b8173556f7826598e235e8a82127bce
[root@Node1 ~]#:docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB

强制删除正在使用的镜像,也会删除对应的容器。

删除所有镜像:

有一个选项可以列出所有的镜像的id:

docker iamges -q

然后通过docker rmi 所有的镜像id

镜像是模板

容器:是运行中的镜像,镜像的一个实例,容器就是一个小型的虚拟机

---end---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值