文章目录
一、Docker是什么?
简介docker
Docker (码头工人)是一个开源项目,诞生于2013年初,最初是 dotCloud 公司(后由于 Docker 开源后大受欢迎就将公司改名为 Docker Inc ,总部位于美国加州的旧金山)内部的一个开源的 PAAS 服务 (Platform as a ServiceService )的业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0协议,项目代码在 GitHub 上进行维护。
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(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等,所以Docke容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之Docker是一种用了新颖方式实现的轻量级虚拟机.类似于VM但是在原理和应用上和VM的差别还是很大的,并且docker的专业叫法是应用容器(Application Container)。
Docker、虚拟机和物理主机
操作系统的的组成
- Bootloader:它负责设备的启动过程。
- Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
- Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
- Desktop Environment:这是用户通常与之交互的环境。
- Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
- Applications:这些是执行不同用户任务(例如word,excel等)的程序集。
- Daemons :后台服务提供商。
什么是内核kernel
内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。
每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。
内核的任务
- 用于应用程序执行的流程管理。
- 内存和I / O(输入/输出)管理。
- 系统调用控制(内核的核心行为)。
- 借助设备驱动程序进行设备管理。
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
区别
- 传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软件。
- 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化。
- 每个容器间是互相隔离。每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响。
容器和虚拟机表现比较
- 资源利用率更高: 开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压榨至极致.虚拟机一般会有5-20%的损耗,容器运行基本无损耗,所以生产中一台物理机只能运行数十个虚拟机,但是一般可以运行数百个容器
- 启动速度更快: 可以在数秒内完成启动
- 占用空间更小: 容器一般占用的磁盘空间以MB为单位,而虚拟机以GB
- 集成性更好: 和CI/CD(持续集成/持续部署)相关技术结合性更好,实现打包镜像发布测试可以一键运行,做到自动化并快速的部署管理,实现高效的开发生命周期。
使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的目的是为了运行应用程序,比如Nginx、PHP、Tomcat等web程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。
Docker的组成
docker 中文网站:http://www.docker.org.cn/
- Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
- Docker 服务端(Server): Docker守护进程,运行docker容器
- Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
- Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
Namespace
一个宿主主机运行了N个容器,多个容器共用一个OS,必然会带来问题。
- 怎么样保证每个容器都有不同的文件系统并且能互不影响?
- 一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进程?各个容器子进程间能相互通信(内存数据)吗?
- 每个容器怎么解决IP及端口分配的问题?
- 多个容器的主机名能一样吗?
- 每个容器都要不要有root用户?怎么解决账户重名问题?
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离。
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 | CLONE_NEWIPC | 2.6.19 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
PID Namespace(ProcessIdentification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
TimeNamespace | 提供时间隔离能力 | CLONE_NEWTIME | 5.6 |
syslogNamespace | 提供syslog隔离能力 | syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能 | |
Controlgroup(cgroup)Namespace | 提供进程所属的控制组的身份隔离 | Linux4.6 |
MNT Namespace
每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。
UTS Namespace
包含了运行内核的名称、版本、底层体系结构类型等信息,用于系统标识。
其中包含了
- 主机名hostname
- 域名domainname
- 内核名称
它使得一个容器拥有属于自己主机名标识,这个主机名标识独立于宿主机系统和其上的其他容器。
PID Namespace
Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通过PID namespace进程隔离比如:
- PID编号重复
- 容器内的主进程生成
- 回收子进程
NET Namespace
每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,Docker使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
User Namespace
各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?
User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见。
Control groups
Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能。最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。
如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
具体实现
- blkio: 块设备IO限制
- cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问
- cpuacct: 产生 cgroup 任务的 cpu 资源报告
- cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
- devices: 允许或拒绝 cgroup 任务对设备的访问
- freezer: 暂停和恢复 cgroup 任务
- memory: 设置每个 cgroup 的内存限制以及产生内存资源报告
- net_cls: 标记每个网络包以供 cgroup 方便使用
- ns: 命名空间子系统
- perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
容器管理工具
有了以上的chroot、namespace、cgroups就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。
Docker
相当于增强版的LXC,功能更为强大和易用,也是当前最主流的容器前端管理工具Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
pouch
Pouch (小袋子)起源于 2011 年,并于2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率。
Podman
Podman即Pod Manager tool,从名称上可以看出和kubernets的pod的密切联系,不过就其功能来说,简而言之: alias docker = podman ,是CentOS 8 新集成的功能,或许不久的未来会代替dockerPodman是一个 为 Kubernetes 而生的开源的容器管理工具,原来是 CRI-O(即容器运行时接口CRI 和开放容器计划OCI) 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 提供了一个与Docker兼容的命令行前端,Podman 里面87%的指令都和Docker CLI 相同,因此可以简单地为Docker CLI别名,即“ alias docker = podman”,事实上,podman使用的一些库也是docker的一部分。
Docker的优势
-
快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上。
-
高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率。
-
节省开支: 提高服务器利用率,降低IT支出。
-
简化配置: 将运行环境打包保存至容器,使用时直接启动即可。
-
环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题。
-
快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台。
-
更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响。
Docker的缺点
- 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底。
- 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐。
- 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费。
容器的核新技术
容器规范
容器技术除了的docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux 基金会、Docker、微软、红帽谷歌和、IBM、等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了三个规范,**分别是runtime spec和 image format spec distribution-spec ** ,有了这三个规范,不同的容器公司开发的容器只要兼容这三个规范,就可以保证容器的可移植性和相互可操作性。
容器 runtime
runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境
runtime 类型:
- Lxc: linux上早期的runtime,在 2013 年 Docker 刚发布的时候,就是采用lxc作为runtime, Docker把 LXC 复杂的容器创建与使用方式简化为 Docker 自己的一套命令体系。随着Docker的发展,原有的LXC不能满足Docker的需求,比如跨平台功能。
- Libcontainer: 随着 Docker 的不断发展,重新定义容器的实现标准,将底层实现都抽象化到Libcontainer 的接口。这就意味着,底层容器的实现方式变成了一种可变的方案,无论是使用namespace、cgroups 技术抑或是使用 systemd 等其他方案,只要实现了 Libcontainer 定义的一组接口,Docker 都可以运行。这也为 Docker 实现全面的跨平台带来了可能。
- runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范。
- crun: 红帽推出的 运行时基于C语言开发,集成在podman内部。
- rkt: 是CoreOS开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器。
低级容器运行时与高级容器运行时
- High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
- Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc。
镜像仓库Registry
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。
- Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用。
- 阿里云,网易等第三方镜像的公共仓库。
- Image registry: docker 官方提供的私有仓库部署工具,无web管理界面,目前使用较少。
- Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用。
容器编排工具
当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
- Docker compose : docker 官方实现单机的容器的编排工具。
- Docker swarm: docker 官方开发的容器编排引擎,支持overlay network。
- Mesos+Marathon: Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发的,后在Twitter得到广泛使用。通用的集群组员调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。
- Kubernetes: google领导开发的容器编排引擎,内部项目为Borg,且其同时支持 docker 和CoreOS,当前已成为容器编排工具事实上的标准。
二、安装Docker
yum安装
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
软件 | 作用 |
---|---|
yum-utils: | 提供了 yum-config-manager 工具 |
device mapper: | 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 |
lvm2 | 存储驱动程序需要 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
此处安装最新版
yum list --help
可以使用帮助查看
yum list --showduplicates docker-ce
查看所有的可用版本
安装教程
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11xaRalQ
软件 | 作用 |
---|---|
docker-ce(Docker Community Edition) | 这是 Docker 的社区版。Docker 社区版是免费的,面向开发者、小型团队和个人使用。它包含了 Docker Engine,这是一个用于构建和运行容器的开源容器运行时。 |
docker-ce-cli(Docker Command Line Interface) | 这是 Docker 的命令行工具,它允许用户与 Docker Engine 交互,执行容器相关的操作。通过 Docker CLI,用户可以构建、运行、管理和发布容器。 |
containerd.io | 它负责管理容器的生命周期,包括容器的创建、运行、暂停、继续和销毁等。 |
基础操作
查看docker版本
查看信息
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: 2 # 容器数量
Running: 0
Paused: 0
Stopped: 2
Images: 4 # 镜像数量
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-693.el7.x86_64 # 宿主机的相关信息
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.781GiB
Name: localhost.localdomain
ID: 39eee203-7863-4c80-a955-9aef575138c1
Docker Root Dir: /var/lib/docker # docker 数据存储目录
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://6ijb8ubo.mirror.aliyuncs.com/ # registry 地址
Live Restore Enabled: false
docker配置文件
配置镜像仓库加速
浏览器访问https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置。
systemctl daemon-reload
systemctl restart docker
三、镜像管理
- 制作镜像
- 上传镜像
- 下载镜像
- 查找镜像
- 导出镜像
- 导入镜像
- 删除镜像
- 查询镜像
镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器。镜像含里面是一层层的文件系统,叫做 Union FS(联合文件系统),联合文件系统,可以将几层目录挂载到一起(就像千层饼,洋葱头,俄罗斯套娃一样),形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 linux 的目录结构一样,镜像通过这些文件再加上宿主机的内核共同提供了一个 linux 的虚拟环境,每一层文件系统叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是镜像中每一层文件系统都是只读的,构建镜像的时候,从一个最基本的操作系统开始,每个构建提交的操作都相当于做一层的修改,增加了一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样,当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层,实际上也不需要知道里面有几层,结构如下:
一个典型的 Linux文件系统由 bootfs 和 rootfs 两部分组成bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要用于引导加载 kernel,Linux刚启动时会加载bootfs文件系统,当boot加载完成后,kernel 被加载到内存中后接管系统的控制权,bootfs会被 umount 掉rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件,不同的 linux 发行版(如 ubuntu 和 CentOS ) 主要在 rootfs 这一层会有所区别。
一般的镜像通常都比较小,官方提供的Ubuntu镜像只有60MB多点,而 CentOS 基础镜像也只有200MB左右,一些其他版本的镜像甚至只有几MB,比如: busybox 才1.22MB,alpine镜像也只有5M左右。镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令,配置文件和程序库等相关文件就可以了。
下图就是有两个不同的镜像在一个宿主机内核上实现不同的rootfs。
命令
命令 | 含义 | 例子 |
---|---|---|
docker --help | 查看帮助 | |
docker image --help | 查看镜像帮助 | docker image --help |
docker search 镜像名称 | 搜索相关镜像 | docker search nginx |
docker pull 镜像名称:标签 | 下载镜像(不加标签默认使用latest) | docker pull nginx |
docker images | 查看所有已有镜像 | docker images |
docker images 镜像名称 | 查看单个镜像 | docker images nginx |
docker inspect 镜像ID | 查看镜像的详细信息 | docker inspect 56b21e040954 |
docker tag 旧名称 新名称 | 修改镜像的 标签 | docker tag nginx:latest lucky/nginx:1.25 |
docker save -o 文件名 镜像id | 导出镜像包 | docker save -o /data/nginx.tar nginx;docker save -o nginx>/data/nginx.tar |
docker load -i 文件名 | 导入镜像包 | docker load -i /data/alpine.tar;docker load < alpine.tar |
下载镜像
从docker仓库将镜像下载到本地:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
name是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
TAG: 即版本号,如果不指定:TAG,则下载最新版镜像
选项
选项 | 含义 |
---|---|
-a,–all-tags | 下载仓库中所有标签版本的镜像 |
–disable-content-trust | 跳过对下载镜像的签名验证。默认情况下,内容信任是禁用的 |
–platform string | 如果服务器支持多平台,设置要下载的特定平台。 |
-q, --quiet | 抑制详细输出 |
查看指定镜像的详细信息
docker images
查看更加详细的信息
docker image inspect 指定名字
docker image inspect 指定ID
镜像导出
使用docker save命令可以将本地奖项导出为一个tar文件,然后复制到其他服务器进行导入使用。
docker save [OPTIONS] IMAGE [IMAGE...]
-o, --output string
常见用法:
导出
docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar
导入
docker load -i /data/alpine.tar
docker load < alpine.tar
将本地镜像上传至阿里云自建仓库。
https://cr.console.aliyun.com/repository/cn-hangzhou/xiaogeng_resposity/nginx_1.18/details
镜像打标签
docker tag 原来的的tag 新的tag
删除镜像
docker rmi 命令可以删除本地镜像。
选项:
-f, --force,强制删除
**注意:**强制删除正在使用的镜像,也会删除对应的容器。
删除所有的镜像
docker rmi -f `docker images -q`