目录
在当今快速发展的技术领域中,Docker 已成为软件开发和部署领域的一个重要里程碑。它不仅简化了应用程序的打包、分发和运行过程,还促进了开发、测试与生产环境之间的一致性,极大地提升了开发效率和部署灵活性。本文将深入探讨Docker的核心概念、工作原理及其对现代软件开发生态带来的变革。
物理机
虚拟机
容器
一、云与虚拟化知识
(一)云基本知识
1.云基本介绍
在介绍docker之前,首先了解一下云的有关知识
云计算是建立在虚拟化技术之上,是一种服务的交付模型,它通过网络(通常是互联网)提供按需、可扩展的计算资源和服务,包括服务器、存储、数据库、网络、软件、分析等。云计算不仅仅是技术堆栈,它还包括了业务模式、服务管理、计费机制等方面。用户可以根据实际需求租用这些资源,而不需要了解或管理底层的硬件和基础设施
2.常用的云服务器
国内云:
• 阿里云ECS(Elastic Compute Service)
阿里云的弹性计算服务,提供了多种实例类型,适合不同的应用场景,如通用计算、内存优化、大数据处理等。支持按需付费、包年包月等多种计费方式,以及灵活的升降配和自动扩容功能。
• 腾讯云CVM(Cloud Virtual Machine)
腾讯云的云服务器产品,具备高性能、稳定可靠的特性。提供了多样化的实例类型,适合游戏、视频处理、AI计算等多种场景,并且经常有促销活动,用户可以寻找优惠购买方案。
• 华为云ECS(Elastic Cloud Server)
华为云的弹性云服务器,强调高性能与安全性,适用于企业级应用部署。支持多种操作系统,以及GPU加速、SSD高速存储等高级特性,适合于深度学习、图形渲染等高性能计算场景。
• 中国电信天翼云(China Telecom Tianyi Cloud)
提供包括云主机在内的全方位云计算服务,侧重于安全合规和企业级服务。
利用电信的网络优势,提供稳定可靠的基础设施服务。
国外云:
• 谷歌云(Google Cloud Platform, GCP)
GCP 提供一系列云服务和工具,如 Compute Engine、Cloud Storage、Cloud SQL 等,依托谷歌的技术实力,特别在大数据处理、人工智能领域有显著优势。
• AWS EC2(Elastic Compute Cloud)
亚马逊云服务的计算服务,全球市场占有率领先,提供了极为丰富的实例类型和配置选项。支持全球多个区域部署,拥有强大的生态系统和工具集,适合国际业务和复杂应用架构。
• 微软Azure VMs(Virtual Machines)
微软Azure的虚拟机服务,与Windows生态系统深度整合,同时也支持Linux。提供了高度可定制的计算能力,适合.NET应用、SQL Server数据库、SharePoint等微软技术栈的部署。
3.云服务模型
云服务模型主要有三种:
Infrastructure as a Service (IaaS)
Platform as a Service (PaaS)
Software as a Service (SaaS)
3.1 IaaS
定义:laaS,即(Infrastructure as a Service - 基础设施即服务)。它提供基础计算资源作为服务,包括服务器、存储、网络、安全等基础设施。用户可以按需租用这些资源,并通过网络界面(通常是Web界面)进行管理和配置,但需要自己负责操作系统、数据库、中间件以及运行在其上的应用程序的安装、管理和维护。
典型服务:Amazon Web Services (AWS) EC2、Google Compute Engine (GCE)、Microsoft Azure Virtual Machines。
适用场景:适合需要高度定制化环境的企业,或是需要直接控制底层基础设施的开发和运维团队。
3.2 PaaS
定义:PaaS ,即(Platform as a Service - 平台即服务)。它 在 IaaS 的基础上更进一步,除了提供基础设施外,还提供了一个完整的开发和部署环境,包括操作系统、数据库、服务器软件、开发工具等。用户可以直接在平台上开发、运行和管理应用程序,无需关心底层硬件和软件的运维。
典型服务:Heroku、Google App Engine、Microsoft Azure App Service。
适用场景:适合快速开发和部署应用程序的团队,尤其是那些希望快速迭代、减少运维负担的开发者和企业。
3.3 SaaS
定义:SaaS ,即(Software as a Service - 软件即服务)。它是最接近终端用户的服务模型,它通过互联网提供应用程序,用户无需安装或维护任何软件,只需通过浏览器或专用客户端访问即可使用。所有的应用管理、升级、安全和维护工作都由服务提供商负责。
典型服务:Salesforce CRM、Google Workspace (原Google Apps)、Microsoft 365。
适用场景:适用于广泛的业务场景,从办公自动化、客户关系管理、财务管理到人力资源管理等,适合希望减少本地IT资源投入、快速启用业务功能的企业和个人。
(二)虚拟化介绍
1.什么是虚拟化
虚拟化是一种底层技术,它允许将单一的物理硬件资源(如服务器、存储设备、网络等)划分为多个逻辑上的独立单元,每个单元都能运行自己的操作系统和应用程序。虚拟化的核心是创建虚拟机(VMs),这些虚拟机与物理机表现得非常相似,但实际上是共享物理资源的软件定义环境
2. 虚拟化技术概述
虚拟化技术允许在单一物理硬件上创建和运行多个独立的虚拟环境,核心分类包括仿真虚拟化、半虚拟化和全虚拟化,每种技术各有侧重:
仿真虚拟化:无需硬件支持,兼容性强,能在不同架构间运行操作系统,但性能较低。
半虚拟化:需修改客户系统以提升性能,直接与虚拟化层通信,适用于特定场景和注重性能的环境。
全虚拟化:现代技术大多结合硬件辅助,以实现接近原生的性能,同时保持高度兼容性,适用于广泛场景
3.虚拟化技术类型
常见的虚拟化技术主要包括以下几种类型,这些技术在不同的场景下为提高资源利用率、灵活性和管理效率提供了关键支撑:
CPU虚拟化:也称为处理器虚拟化,它允许单个物理CPU模拟出多个逻辑CPU,每个逻辑CPU可以运行一个独立的操作系统实例。通过特殊指令集和虚拟机监视器(VMM,也称作Hypervisor)来实现硬件资源的分配和隔离,使得每个虚拟机(VM)认为自己独占了硬件资源。
服务器虚拟化:这是虚拟化技术中最成熟和广泛应用的领域,它允许在一个物理服务器上运行多个虚拟服务器,每个虚拟服务器可以运行不同的操作系统和应用。常见的服务器虚拟化技术包括VMware vSphere/ESXi、Microsoft Hyper-V、KVM(Kernel-based Virtual Machine)等。
存储虚拟化:将物理存储资源抽象化,统一管理并呈现给上层应用,实现存储资源的动态分配、迁移和扩展。这种技术有助于优化存储资源的使用,提高数据访问性能和管理效率。
网络虚拟化:将物理网络设备和网络资源抽象成逻辑表示,使得网络可以像其他计算资源一样被创建、配置、修改和删除。网络虚拟化可以提高网络资源的灵活性和安全性,例如通过虚拟私有网络(VPN)、软件定义网络(SDN)等技术实现。
桌面虚拟化:将用户的桌面环境与物理设备分离,使得用户可以通过瘦客户端、移动设备或任何可以访问网络的设备远程访问自己的个性化桌面环境。常见的桌面虚拟化技术有VMware Horizon、Citrix Virtual Apps and Desktops、Microsoft Remote Desktop Services等。
应用虚拟化:将应用程序与底层操作系统解耦,使得应用可以独立于操作系统运行,并且可以在不需要安装的情况下分发给终端用户。这有助于简化应用部署、更新和管理,提高兼容性和安全性。
容器虚拟化:与传统虚拟化技术相比,容器提供了更加轻量级的虚拟化方案。容器共享宿主机的操作系统内核,但各自拥有独立的文件系统、网络配置和进程空间。Docker是最著名的容器技术之一,Kubernetes(K8s)则是用于管理容器化应用的编排平台。
4.虚拟化架构
寄居架构(Hosted Virtualization)与裸金属架构(Bare-Metal Virtualization),又常被称为宿主架构与源生架构,是虚拟化技术中的两种主要实现方式,它们在部署位置、资源访问效率、性能表现等方面存在显著区别:
①寄居架构
- 定义:在这种架构中,虚拟化软件(Hypervisor)安装并运行在宿主操作系统之上。也就是说,虚拟机依赖于宿主操作系统来访问硬件资源。常见的寄居虚拟化平台包括VirtualBox、VMware Workstation等。
- 特点:
- 易用性:对新手友好,安装和配置相对简单,因为可以在熟悉的操作系统环境中操作。
- 兼容性:由于宿主操作系统提供了广泛的硬件和驱动支持,虚拟机可以运行各种操作系统。
- 资源开销:由于存在宿主操作系统这一层,资源访问需要经过两次转换(宿主OS到Hypervisor再到虚拟机),这可能导致性能损失。
- 应用场景:适用于开发、测试环境或对性能要求不高的个人使用场景。
②裸金属架构
- 定义:直接在物理硬件上安装和运行虚拟化层,没有宿主操作系统作为中介。Hypervisor直接管理和调度硬件资源,如ESXi、Hyper-V属于这一类。
- 特点:
- 性能:由于消除了宿主操作系统的开销,提供了接近物理机的性能,特别适合对I/O性能有严格要求的应用。
- 稳定性与安全性:减少了一层潜在的故障点,提升了系统的稳定性和安全性。
- 资源管理:更高效地管理和分配硬件资源,适合大规模部署和云计算环境。
- 配置与管理:相对于寄居架构,配置和管理可能需要更高的技术门槛,尤其是在企业级环境中。
- 应用场景:适用于数据中心、云服务提供商、企业服务器虚拟化等对性能、安全性和资源利用率有高要求的场景。
总结来说,寄居架构更适用于学习、测试环境或个人用户,而裸金属架构则更适合企业级应用、云服务和对性能有严格要求的场景。选择哪种架构取决于具体的需求、资源可用性和对性能与管理性的考量。
二、Docker介绍
在了解Docker之前,首先了解一下什么是容器
(一)什么是容器
容器技术是一种轻量级、可移植的软件打包和运行方式,它允许开发者将应用程序及其所有依赖、配置文件、运行时环境封装在一个独立的、标准化的单元中,这个单元就是容器。容器技术的核心优势在于其提供的隔离性、可移植性和高效的资源利用率,这些特性极大地改变了现代软件的开发、交付和运维流程。
容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术, 容器技术提高了硬件资源利用率、 方便了企业的业务快速横向扩容(可以达到秒级快速扩容)、 实现了业务宕机自愈功能(配合K8S可以实现,但OpenStack无此功能),因此未来数年会是一个容器愈发流行的时代 ,这是 一个对于 IT 行业来说非常有影响和价值的技术,而对于IT行业的从业者来说, 熟练掌握容器技术无疑是一个很有前景的行业工作机会。
(二)容器核心概念
-
共享宿主机内核:容器不像虚拟机那样需要完整的操作系统,而是共享宿主机的操作系统内核。这使得容器体积小,启动速度快。
-
资源隔离:虽然共享宿主机内核,但容器通过命名空间(Namespaces)和控制组(Cgroups)等Linux内核特性实现了进程、网络、文件系统、用户ID等资源的隔离,确保容器之间互不影响。
-
轻量级:容器启动迅速,通常只需秒级,而虚拟机启动可能需要数分钟。此外,容器占用的磁盘空间和内存资源也远小于虚拟机。
-
可移植性:容器标准化了运行环境,使得应用可以在开发、测试、生产等不同环境间无缝迁移,解决了“在我机器上能跑”的问题。
(三)Docker基本定义
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
Docker通常用于如下场景
- web应用的自动化打包和发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
(四)Docker与虚拟机的区别
资源效率与轻量级
Docker容器:容器共享宿主机的操作系统内核,不需要为每个容器提供单独的操作系统,因此启动速度极快(秒级别),资源消耗少,包括CPU、内存和磁盘空间。
虚拟机:每个虚拟机都运行着一套完整的操作系统,包括内核,这导致它们需要更多的资源来启动和运行,通常启动时间以分钟计,资源占用大。
隔离性与安全性
Docker容器:容器在进程级别提供隔离,它们共享宿主机的内核,隔离性相对较弱。虽然容器之间相互隔离,但它们共用内核,理论上存在一定的安全隐患。
虚拟机:虚拟机提供了更彻底的隔离,每个虚拟机都有独立的操作系统,包括内核,这为它们提供了更强的安全屏障,但同时也增加了资源开销。
性能
Docker容器:由于直接运行在宿主机上,容器间的通信和资源访问更为高效,几乎没有性能损耗。
虚拟机:虚拟化层(Hypervisor)需要模拟硬件,这会导致一定程度的性能损失。
灵活性与便携性
Docker容器:高度可移植,可以在任何支持Docker的系统上运行,包括物理机、虚拟机、云环境等,方便构建、分发和运行应用。
虚拟机:虽然也能在多种平台上运行,但不如容器灵活,迁移时需要考虑虚拟机映像文件的大小和兼容性。
管理与编排
Docker容器:Docker通过Docker Compose、Kubernetes等工具,提供了强大的容器编排能力,适合微服务架构和自动化的部署管理。
虚拟机:也有对应的管理工具如VMware vSphere、OpenStack等,但相对于容器编排,配置复杂度和资源管理难度通常更高。
容器在内核中支持2种重要技术
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
(五)Namespace六项隔离
namespace | 系统调用参数 | 隔离内容 | 作用 |
UTS | CLONE_NEWUTS | 主机名与域名 | 允许每个容器拥有独立的主机名和域名,避免容器之间以及容器与宿主机之间的主机名冲突,增强容器的独立性。 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 | 隔离System V IPC、POSIX消息队列和信号量等进程间通信机制,确保容器内的进程只能看到自己容器内的IPC资源,防止与宿主机或其他容器的进程间通信混淆。 |
PID | CLONE_NEWPID | 进程编号 | 为容器内的进程分配独立的进程ID空间,使得每个容器内的进程ID从1开始编号,彼此之间不会冲突。这使得容器内的进程认为自己是在独立系统中运行,不知道宿主机或其他容器的进程。 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 | 为容器提供独立的网络设备、IP地址、端口空间、路由表等,使得容器拥有自己的网络栈。这样,容器内的网络活动与宿主机和其他容器隔离开来,可以配置专属的网络配置,比如桥接网络、端口映射等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) | 为每个容器提供独立的文件系统挂载点视图。容器可以拥有自己的根文件系统(通过联合文件系统等技术实现),并且挂载或卸载文件系统而不影响宿主机或其他容器,实现了文件系统的隔离和灵活性 |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持〉 | 使得容器内的用户和用户组ID与宿主机的ID空间分离。即使容器内的root用户,在宿主机上也可能映射为非root用户,增强了容器运行的安全性 |
这些命名空间共同作用,为Docker容器提供了强大的隔离能力,使得容器能够在同一台宿主机上安全、独立地运行,每个容器就像是一个独立的小型操作系统实例。
(六)Docker核心概念
Docker的核心概念主要包括以下三个方面:
1.镜像(Image)
Docker镜像是创建容器的基础,类似于虚拟机的镜像,但它更加轻量级。镜像由一系列层组成,每一层代表一次对文件系统的修改,这样的分层结构使得镜像的复用、传输和存储非常高效。镜像是只读的,可以包含操作系统、应用程序及其依赖库等。用户可以从Docker Hub等公共仓库下载现成的镜像,或者创建自定义镜像并通过docker build
命令从Dockerfile构建。
2.容器(Container)
容器是镜像运行时的实例,它是启动时从镜像创建的一个可读写层叠加在镜像的只读层之上。每个容器都是相互隔离的,拥有自己的文件系统、网络配置、进程空间等,从而保证了环境的一致性和应用的可移植性。容器的创建、启动、停止、删除等操作都非常快速和轻量。容器的设计理念是“一次构建,到处运行”,极大简化了应用的部署和运维。
3.仓库(Repository)
Docker仓库是集中存放镜像的地方,类似于代码仓库,用户可以从中拉取(pull)镜像到本地,也可以推送(push)自己创建的镜像到仓库,便于分享和重复使用。Docker Hub是最著名的公开仓库,提供了大量的官方镜像和用户贡献的镜像。此外,用户还可以搭建私有仓库,用于内部团队间分享和管理镜像,确保安全性与合规性。
Docker通过这些核心概念,实现了应用的封装、部署、运行的标准化与自动化,促进了DevOps文化的推广,提高了软件开发、测试和部署的效率
三、安装Docker
(一)yum安装
[root@docker ~]#systemctl stop firewalld.service #关闭防火墙
[root@docker ~]#setenforce 0 #关闭核心防护
1.安装依赖环境
[root@docker ~]#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
2.添加阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker
[root@docker ~]#yum install -y docker-ce docker-ce-cli containerd.io
docker-ce
#Docker社区版的简称,Docker的免费版本,它包含了运行Docker容器所需的主要服务和命令行工具
docker-ce-cli:
#社区版客户端工具。主要是为了支持只需要Docker命令行工具而不运行Docker daemon的场景
#比如在无服务器环境或者远程管理 Docker宿主机。
containerd.io
#负责容器和镜像的生命周期管理,是Docker以及其他容器平台背后的核心组件之一
4.启动docker
systemctl enable --now docker.service
安装总结
#关闭防火墙与核心防护
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装Docker-CE
yum install -y docker-ce docker-ce-cli containerd.io
#启动docker进程并设置开机自启
systemctl start docker.service
systemctl enable docker.service
或者使用
systemctl enable --now docker.server
(二)二进制安装
下载地址:Index of linux/static/stable/x86_64/
可以使用wget命令下载,或者使用浏览器直接下载
可以使用 dockerd & 命令直接运行,或者使用 systemctl 管理
docker程序环境
环境配置文件:
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker
Unit File:
/usr/lib/systemd/system/docker.service
docker-ce 配置文件
/etc/docker/daemon.json
Docker Registry配置文件:
/etc/containers/registries.conf
四、Docker操作命令
(一)信息查看
查看docker信息
命令 | 作用 |
docker version | 查看docker版本 |
docker info | 查看docker系统相关信息 |
查看版本信息
查看docker系统相关信息
这段输出是通过在Linux终端执行docker info命令后显示的Docker服务详细信息,以下是各项参数的解释:
Client部分:
显示的是客户端使用的Docker引擎版本(这里是Docker Engine - Community 26.0.2)及其上下文、调试模式等信息,以及安装的插件及其版本,包括Buildx和Compose。
Server部分:
Containers:表示当前服务器上总的容器数量,以及正在运行、暂停和停止的容器数量。
Images:当前存在的镜像数量。
Server Version:运行的Docker服务端版本号。
Storage Driver:使用的是overlay2存储驱动程序,以及相关的文件系统设置。
Logging Driver:日志记录驱动为json-file格式。
Cgroup Driver:控制组驱动为cgroupfs,Cgroup Version为1。
Plugins:列出了一系列已安装的插件,包括Volume类型、Network类型、Log驱动等。
Swarm:表明Swarm模式未激活。
Runtimes:列出支持的容器运行时,这里包括io.containerd.runc.v2和runc。
Kernel Version、Operating System、OSType、Architecture、CPUs和Total Memory提供了宿主机的基本系统信息。
Docker Root Dir:Docker数据根目录的位置。
Security Options:支持的安全选项,此处显示启用了seccomp安全特性,并指定了内建的seccomp配置文件。
Insecure Registries:允许不验证证书的私有仓库列表。
Live Restore Enabled:是否启用实时恢复功能,此处为false,意味着没有启用。
总体而言,这段信息详细展示了Docker服务的配置情况、运行状态以及底层操作系统和硬件环境的概况。
(二)镜像操作
命令 | 作用 |
docker search 关键字 | 搜索镜像 |
docker pull 关键字 | 获取镜像 |
docker push 关键字 | 上传镜像 |
docker images [关键字] | 查看镜像 |
docker inspect 镜像ID号 | 获取镜像详细信息 |
docker tag | 创建标签 |
docker rmi 仓库名称:标签 | 删除镜像。当一个镜像有多个标签时,只是删除其中指定的 标签 |
docker rmi 镜像ID号 | 删除该镜像,有多个标签也同样删除 |
docker save -o 存储文件名 存储的镜像 | 存出镜像,将镜像保存成为本地文件 |
docker load -i 存出的文件 | 载入镜像,将镜像文件导入到镜像库中 |
搜索镜像
docker search 关键字
使用镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器地址
下载镜像
命令格式为:docker pull 关键字
下载下来的数据会保存在/var/lib/docker目录下
buildkit: Docker BuildKit 的相关文件。BuildKit 是 Docker 中用于构建镜像的新后端,提供了更高效的构建过程和高级功能。
containers: 存储每个运行或曾经运行过的容器的状态和数据,包括写时复制(copy-on-write)层和其他相关文件。
engine-id: 通常包含一个文件,用于存储当前 Docker 引擎的唯一标识符。
image: 存储 Docker 镜像的层数据。这些层是只读的,通过联合文件系统(如 overlay2)与容器的可写层组合来构成运行时的容器文件系统。
network: 包含 Docker 网络配置信息,如网络驱动、网络桥接等设置。
overlay2: 如果您的存储驱动是 overlay2,这个目录将包含容器和镜像的存储驱动特定数据结构,如分层文件系统的元数据和实际数据。
plugins: 存放 Docker 插件的目录,插件可以扩展 Docker 功能,如网络驱动、存储驱动或自定义逻辑。
runtimes: 存储 Docker 运行时的信息,例如 runc
或其他自定义运行时的配置和可执行文件。
swarm: 当 Docker 守护进程加入 Docker Swarm 集群时,这个目录会包含集群相关的状态信息和证书。
tmp: Docker 可能会在这个目录下存放临时文件,例如在构建过程中或执行其他操作时。
volumes: 存储 Docker 数据卷的内容。数据卷是独立于容器生命周期、持久化的存储区域,可以用于保存容器需要持久化的数据。
查看镜像
使用docker images可以查看所有下载到本地的镜像
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
查看镜像的详细信息
docker inspect 镜像ID号/镜像名称
lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,
所以对应的lowerdir是可以有多个目录
upperdir是在lowerdir之上的容器层,这层是可读可写的,
在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这层
MergedDir是表现层,是容器的挂载点
创建标签
为本地的镜像添加新的标签
为本地的镜像添加新的标签
格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:web
#查看
docker images | grep nginx
删除镜像
删除指定标签的镜像
docker rmi 仓库名称:标签
docker rmi 镜像ID号 :该命令会删除指定ID号的所有镜像,有多个标签,也会同时删除,因为同一个镜像即使标签不同,但是ID号是相同且唯一的
存出镜像
将镜像保存成为本地文件
命令格式为:docker save -o 自定义文件名 镜像名称
载入镜像
将镜像文件导入到镜像库中
命令格式为:docker load -i 自定义文件名
上传镜像
默认上传到 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 #上传镜像
(三)容器操作
命令 | 作用 |
docker create [选项] 镜像 | 创建容器 |
docker ps [-a] | 查看容器的运行状态,-a选项可以显示所有的容器 |
docker start 容器的ID/名称 | 启动容器 |
docker run | 等同于先执行 docker create 命令,再执行 docker start 命令 |
docker cp | 复制 |
docker rm -f | 删除容器 加-f 强制删除容器 |
docker export | 导出镜像 |
docker import | 导入镜像 |
创建容器
格式:docker create [选项] 镜像
docker create -it nginx:latest /bin/bash
docker create:创建一个新的容器但不立即启动它
-i:表示以交互模式运行容器,意味着容器的标准输入保持打开;
-t 则表示为容器分配一个伪TTY,使得它看起来像一个终端,便于用户交互。
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell
nginx:latest: 指定了要使用的镜像,这里是最新版本的 Nginx 镜像。
Docker会查找本地是否存在这个镜像,如果不存在,则会从 Docker Hub 上下载
/bin/bash: 指定容器启动后要执行的命令,
这里是要启动一个 Bash shell。这意味着当你后续启动这个容器时,你会直接进入 Bash 终端,
可以手动执行各种命令来配置或管理 Nginx 服务。
查看容器运行状态
格式为:docker ps [-a]
docker ps :不带任何参数时,只显示当前正在运行的容器信息
docker ps -a :则会显示所有容器,无论是正在运行的还是已经停止的
CONTAINER ID(容器ID):该容器的唯一标识符。
IMAGE(镜像): nginx:latest 表示这个容器是基于 nginx 镜像的最新版本创建的。
COMMAND(启动命令):
#这表明容器启动时将执行的命令被省略了,通常Nginx容器的入口点脚本会负责启动Nginx服务。
CREATED(创建时间): 2 minutes ago 表示这个容器是在大约2分钟前创建的。
STATUS(状态): Created 表明容器已经被创建,但尚未启动运行。
PORTS(端口映射): 这一列显示为空,意味着没有配置端口映射,容器内的服务端口没有暴露给宿主机。
NAMES(容器名称): compassionate_goldberg 是该容器的自动分配名称。
Docker为每个容器自动生成一个唯一的名称
容器的7种状态
created(已创建):容器已经被创建,但尚未启动。它的文件系统和配置都已经就绪,等待运行命令来启动。
restarting(重启中):容器正在按照其重启策略进行重启,这可能是因为容器异常退出或其他触发重启的条件。
running(运行中):容器正在运行,进程已经在容器内启动并且活跃。
paused(暂停):容器的进程被暂停,容器本身并未停止,但其中的所有进程都处于暂停状态,不消耗CPU资源。
exited(停止):容器曾经运行过,但由于某些原因(比如主进程结束或者其他外部信号)已经停止。
dead(死亡):这是一种比较特殊的状态,通常发生在容器异常退出后,且没有重启策略让它重启。
removing(删除中):容器正在被删除过程中,这个状态表示Docker正在清理与容器相关的资源。
启动容器
格式:docker start 容器的ID/名称
创建并启动容器
docker run 是 Docker 中一个非常重要的命令,它用于创建一个新的容器并启动它。这个命令结合了 docker create 和 docker start 的功能,一步到位。其基本语法如下
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS] #可选参数,用于定制容器的创建和运行方式
IMAGE #指定基础镜像的名称,可以是镜像ID或镜像名(如 nginx:latest)。
[COMMAND] #容器启动后要执行的命令,默认使用镜像中设置的命令,也可以覆盖为其他命令。
[ARG...] #传给命令的额外参数
docker run命令的执行过程
docker run 命令的执行过程大致可以分为以下几个步骤:
1.镜像检查
#Docker首先检查本地是否存在指定的镜像(如 nginx:latest)。
#如果不存在,Docker会从配置的镜像仓库(默认是Docker Hub)下载该镜像。
2.容器创建
#使用找到或下载的镜像,Docker会创建一个新的容器。
#在这个过程中,Docker会为容器分配一个唯一的ID,设置网络环境(如桥接网络),
#并根据命令行参数(如 -v 挂载卷、-e 环境变量、-p 端口映射等)配置容器的运行环境。
3.可写层建立
#在选定的镜像之上,Docker会创建一个可写层作为容器的文件系统。
#这意味着容器内部的修改不会影响到原始镜像,同时也允许容器之间共享镜像层,节省存储空间。
4.命名与标签
#根据 --name 参数(如果提供的话),为容器指定一个名称。
#如果没有提供,Docker会自动生成一个随机的名称。
5.执行命令
#在容器的文件系统和网络配置完成后,Docker会执行用户指定的命令
#如果命令没有提供,Docker将执行镜像中预定义的命令。
6.标准输入/输出处理
#如果命令以交互模式(使用 -it 参数)运行,Docker会连接容器的标准输入、
#输出和错误流到宿主机的终端,允许用户与容器内的进程进行交互。
7.运行状态监控
#容器启动后,Docker会监控其状态,并根据 -d 参数决定是否在后台运行容器。
#如果不使用 -d,则命令行会保持连接直到容器内的进程终止。
创建容器并持续运行容器
终止容器运行
格式:docker stop 容器的ID/名称
容器的进入
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
/bin/bash: 要在容器内执行的具体命令。允许你直接在容器的环境中执行命令
#进入的是最小化安装的系统
docker start 容器id #进入容器前,确保容器正在运行
docker exec -it 容器id /bin/bash
exit #退出容器后,容器仍在运行
将容器中的文件与宿主机上互相拷贝
使用 docker cp 命令
容器的导入与导出
导出容器(Export)
导出操作会将一个正在运行或已停止的Docker容器转换为一个 tar 文件,这个文件包含了容器的文件系统层,但不包括容器的元数据(如环境变量、端口映射等)。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
导出格式:docker export 容器ID/名称 > 文件名
导入容器(Import)
导入操作则是将一个之前导出的tar文件转换回Docker镜像,并且可以立即创建并启动一个基于这个镜像的新容器。导入命令格式如下:
导入格式:cat 文件名 | docker import – 镜像名称:标签
注意事项:
- 导出和导入过程不保留容器的运行时配置,比如环境变量、端口映射、卷挂载等。如果你想保持容器的运行配置,应该考虑使用 docker commit 命令先将容器保存为一个新的镜像,这样镜像中会包含运行时的更改。
- 导入时指定的镜像名称和标签是新建镜像的标识,之后可以基于这个镜像启动新的容器。
- 与容器导出和导入相对应,Docker镜像也可以通过 docker save 和 docker load 命令进行导出和导入。这两个命令处理的是镜像而非容器,会包含镜像的所有层和元数据,因此更适合于备份和迁移完整的镜像。选择容器还是镜像的导出导入方式,取决于你想要保留的上下文和后续用途。
删除容器
格式:docker rm [-f] 容器ID/名称
-f :强制删除,即便容器正在运行也会删除
批量进行删除容器
docker ps -a:
#这个命令会列出所有容器,包括正在运行的(up)和已经停止的(exited)容器
awk 'NR>=2{print "docker stop/rm "$1}'
awk 是一个强大的文本分析工具,用于处理每一行的输入数据。
NR>=2:NR 是 awk 内置的行号变量,这个条件表示从第二行开始处理
(第一行通常包含列名,因此从第二行开始是忽略标题行)。
{print "docker stop/rm "$1}:
对于符合条件的每一行,打印出形如 docker stop/rm <容器ID> 的命令
| bash
#再次使用管道,将 awk 处理后的输出作为 bash shell 的输入执行。
#表示前面生成的所有docker stop/rm <容器ID>命令会被依次执行,从而批量停止/删除所有列出的容器
总结起来,整个命令的作用是列出所有Docker容器,然后从第二行(即第一个容器)开始,
对每一个容器生成并执行一个 docker stop/rm 命令,以此来批量停止/删除所有容器。请谨慎使用此
命令,因为它会停止所有容器,包括可能正在运行的重要服务。
docker images | awk 'NR>=2{print "docker rmi "$3}'| bash #批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
docker rm $(docker ps -a -q) #批量清理后台停止的容器