笔记参考了B站狂神说Docker,自己再总结了一下
第一部分 Docker 发展历程
一、物理机时代
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
再假设公司有一个业务,这个业务需要一套LNMP环境(Linux、Nginx、Mysql、Php),一台电脑来搭建没问题,
问题1:如果一台电脑搭建几套LNMP环境的话会造成进程的冲突、软件版本的依赖冲突,就是编译的时候还好,运行起来,只能运行一个版本的,如果有两个业务,你是跑业务1还是业务2?
只能一台跑一个业务,那么就是两个业务需要两台电脑宿主机
问题2:两台电脑来完成两个不同的环境搭建那么电脑的采购也是一个问题,成本非常高
问题3:还有就是采购的电脑配置高,你用来跑一套对配置要求低的,会造成资源的浪费
问题4:电脑成本不考虑,装机的时间?一台新机器的配置,网线、网络环境、基础依赖环境、应用部署环境、测试、开发、线上多套环境
问题5:LNMP依赖较简单,其他比较复杂的呢?
问题6:难以迁移和扩展,机器1出问题了,迁移去另一台机器,那么这些配置就要重新再跑一遍,手工迁移可能要花费你一个月时间
问题7:amd、intel,可能会被限定硬件厂商
总结:物理机时代,一台电脑其实只能跑一套业务,因为不同业务搭建的环境不同,会造成进程的冲突、软件版本的冲突,跑不了几个业务,而且电脑的采购成本高,装机的时间久,而且难以迁移和扩展,就衍生出虚拟机时代
二、虚拟机时代
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
所以慢慢地推出了VMware虚拟机
①不需要再采购物理机,我们在虚拟机上就可以配置
②实现了环境隔离问题:LNMP1 依赖版本1.1 LNMP2 依赖版本1.2 LMNP3依赖版本1.3
③实现了应用迁移:克隆一个模板,只需修改少许配置即可
总结:虚拟机时代能更好地利用服务器的资源,不应再买那么多物理机,而且实现了环境隔离,各个环境互不影响,一个环境一个版本,而且应用迁移也变得方便了,只需克隆一个模板,改少许配置即可
三、KVM 虚拟化时代
KVM虚拟化时代,对kvm虚拟机管理的一堆技术(openstack rehat openshit等等技术)
KVM,基于内核的虚拟机(kernel-based virtual machine),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。kvm在2007年2月被罚殴辱Linux2.6.0核心中,可以以加载核心模块的方式被移植到FreeBSD及illumos上。
2006年10月Qumranet公司正式宣布KVM诞生,同年十月,kvm模块的源代码正式接纳进入Linux内核。
2008年9月,Redhat出资收购Qumranet公司,随后在RHEL6中使用KVM代替Xen.
(虽轻量,但相对于容器还是较为重量)
不同的业务,用的资源不一样,如计算类的数据库,后端对cpu要求高一点,NFS,静态服务器,CDN,对磁盘要求高一点
1、例如一台宿主机 8核 64GB 20T硬盘 分配给三台VM虚拟机
VM虚拟机1 2核 2G 内网xxoa平台 几十个几百人访问,python,php,nginx
VM虚拟机2 2核 4G 对外优惠券
VM虚拟机3 4核 8G(RDS)核心数据库业务 要求高一点
假设:虚拟机2有活动 太多人抢优惠券,后端挂了搞个状态码500咋搞
虚拟机数量再多起来,宿主机就要扩容了,但cpu 主板是有上限的,整体cpu、主板换一个,虚拟机300台,你能给它硬件换掉嘛?300个业务集体下线了
所以虚拟化迁移是一个大工程,这就是为什么后来发展到容器时代
四、Docker 容器化时代
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多优势而变得流行起来,例如:
- 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
- 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
- 关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
- 可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
- 跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
- 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
- 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率和高密度。
某公司的产品运行在虚拟化平台中,如openstack,也就是我们所学的KVM虚拟机,创建虚拟机,但是不断地增加云端应用,增加了对硬件资源的消耗,不断创建虚拟机,给公司带来了难题,公司已经在云平台运行了多台虚拟机,消耗了大量的硬件资源。
那怎么才能够高效地利用硬件资源实现云服务呢?
容器技术就派上用场了,更加轻量。
一开始几个搞IT的年轻人成立一家公司叫 dotCloud 做一些 PAAS (Platform As A Service 平台即服务)云计算服务,他们将自己的技术(容器化技术)命名为 Docker
但是一开始诞生的时候不火,后来2013年开源了,就慢慢地很多人发现了 Docker 的优点,然后每个月都会更新一个版本
在容器化技术之前我们都是使用虚拟化技术的
虚拟机:VMware 软硬件 笨重 占内存
虚拟机也是虚拟化技术
而 Docker 容器技术 也算是一种虚拟化的技术,它就是虚拟了我们运行软件的运行环境
能省的我都省,能不要的我都不要,必须要的我们共享吧
五、❤❤总结❤❤
总结:一开始几个搞IT的年轻人在做一些PAAS(Platform As A Service平台即服务)云计算服务,后来他们就将他们的容器化技术命名为 Dokcer,一开始不火,慢慢多人发现 Docker 的优点(更加地轻量、确保了不同机器上跑都是一致的运行环境,不会再出现你的机器跑没问题,我的机器就跑不起来的问题),所以慢慢就到现在的容器化时代
注意:Docker 本身不是容器,而是创建容器的工具,是应用容器引擎。
想要搞懂 Docker,其实看它的两句口号就行。
第一句,Build, Ship and Run(搭建、发送、运行)
第二句,Build once,Run anywhere(搭建一次,到处能用)
容器技术起源于Linux,是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源。尽管容器技术已经出现很久,却是随着Docker的出现而变得广为人知。Docker是第一个使容器能在不同机器之间移植的系统。它不仅简化了打包应用的流程,也简化了打包应用的库和依赖,甚至整个操作系统的文件系统能被打包成一个简单的可移植的包,这个包可以被用来在任何其他运行Docker的机器上使用,比虚拟机更加高效和便捷,虚拟机是虚拟出整个操作系统
1、Docker 为什么会出现?
①一个项目中,会有开发、测试、生产几个环境,每个环境有不同的环境配置( 开发运维会出现问题,我的电脑可以跑得通 )
②环境配置是一个很麻烦的问题,部署环境十分吃力,浪费时间
③发布一个项目
1、传统就只有一个 jar 包
2、有了 Docker 直接 ( jar + ( Redis MySQL jdk ES ))
④跨平台 Windows 发布到 Linux
所以现在开发只要利用 Docker 就可以把运维的东西也做了,把整个运行环境打包,一套流程做完,其他人只要运行即可
我们在Dokcer仓库下载我们发布的镜像 就好比如 “我们在APP上下载软件” 直接运行即可
如 Docker 图标,鲸鱼上运载不同的集装箱,好比如在 Docker 上运行着很多个的 容器实例
2、Docker 的核心思想
Docker 的核心思想:隔离机制,镜像(最核心的环境 4MB + jdk + MySQL)十分的小巧,运行镜像就可以了 几秒就可以启动
(VM虚拟机 几台几个GB 很正常 ,启动则要几分钟,有端口冲突问题……)
Docker 是基于 Go 语言开发的
官网:https://www.docker.com/
文档:https://docs.docker.com/
镜像,仓库地址:https://hub.docker.com/
3、Docker跟普通虚拟机对比?
1、跨平台:普通虚拟机只可以在桌面级别的系统运行; 而 Docker 支持的系统非常多
2、性能: 普通虚拟机性能内存占用非常大,虚拟出了完整的系统; 而 Docker 只是虚拟出了软件的依赖环境
3、自动化:普通虚拟机需要手动安装所有东西; 而 Dokcer 只需要一个命令即可自动部署好环境
4、稳定性:普通虚拟机稳定性不高,不同系统差异大; 而 Dokcer 不同系统都是一样的部署方式,所有稳定性比较高
虚拟机技术
1、资源占用多
2、冗余步骤多
3、启动很慢
容器化技术
1、容器化技术不是模拟完整的一个操作系统,只是虚拟化出软件的依赖环境
2、每个容器间互相隔离,互不影响,每个容器内都有一个属于自己的文件系统
3、容器没有自己的内核,轻便许多
4、原本只能建3个集群,用 Docker 个可以建30个
DevOps
其实就是 Development 和 Operations 两个词的组合
就是让开发人员和运维人员更好地沟通合作,通过自动化流程来使得软件整体过程更加快捷和可靠
1、应用可以更快捷地部署
传统:一堆帮助文档,安装程序
Docker:打包镜像,发布测试,一键运行
2、更快捷地升级和扩缩容
使用了 Docker 后,部署应用和搭积木一样
SpringBoot 1.5、Redis 5、Tomcat 9
整体升级
项目打包成一个镜像,水平扩展,服务器A,服务器B
3、更简单的系统运维
容器化之后,开发、测试环境都是高度一致的
4、更高效的计算资源利用
Docker 是内核级的虚拟化,可以在一个物理机上可以运行很多个容器实例
相比于使用虚拟机,容器有如下优点:
-
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,容器对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
-
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间,大大节约了开发、测试、部署的时间。
-
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些问题并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
-
更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机,其运行结果是一致的。因此可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
-
更轻松的维护和扩展
Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker团队同各个开源项目团队一起维护了大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
4、打包、分发、部署
1、打包:打包就是把你软件运行所需要的依赖环境、第三方库、软件打包到一起,形成一个安装包
2、分发:可以把打包好的安装包上传到镜像仓库,其他人可以方便地拉取使用
3、部署:拿着安装包就可以一个命令运行起来你的应用,自动模拟出一样的运行环境,不管是在Windows/Linux/Mac
5、Docker 部署的优势
- 常规应用开发部署方式:自己在 Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署。
- 用 Docker 开发部署流程:自己在 Windows 上开发、测试 --> 打包为 Docker 镜像(可以理解为软件安装包) --> 各种服务器上只需要一个命令部署好
问题:我机器上跑都没问题,怎么到服务器就各种问题了
优点:确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。
6、Docker 通常用来做什么
- 应用分发、部署,方便传播给他人安装。特别是开源软件和提供私有部署的应用
- 快速安装测试/学习软件,用完就丢(类似小程序),不把时间浪费在安装软件上。例如 Redis / MongoDB / ElasticSearch / ELK
- 多个版本软件共存,不污染系统,例如 Python2、Python3,Redis4.0,Redis5.0
- Windows 上体验/学习各种 Linux 系统
7、镜像 image
可以理解为软件安装包,可以方便的进行传播和安装。
镜像是不能启动的,Docker 镜像就好比一个模板,我们可以通过这个模板来创建容器服务,我们将**镜像 run 运行起来之后 ,这样才会变成一个真正启动的服务,**这个服务就是容器嘛,通过这个镜像可以创建很多个容器(最终服务运行或者项目运行就是在容器中的)
容器镜像是一个随时可以运行的软件包, 包含运行应用程序所需的一切:代码和它需要的所有运行时、应用程序和系统库,以及一些基本设置的默认值。
容器旨在设计成无状态且不可变的: 你不应更改已经运行的容器的代码。如果有一个容器化的应用程序需要修改, 正确的流程是:先构建包含更改的新镜像,再基于新构建的镜像重新运行容器。
Docker镜像里包含了已打包的应用程序及其所依赖的环境。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
8、容器 container
容器就是一种打包应用及其运行依赖环境的技术。
容器就是软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。
Docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动、停止、删除、基本命令
目前可以将 容器理解为简易的 Linux 系统
9、仓库 repository
仓库就是存放镜像的地方
仓库分为:
1、公有仓库
2、私有仓库
官方:Dokcer Hub(国外)
国内:阿里云、网易云、华为云 都有容器服务器,配置镜像加速
10、Docker为什么比VM快?
为什么 Dokcer 比 VM 快?
1、Docker 有着比虚拟机更少的抽象层。由于 Docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上 Docker 将会在效率上有明显优势。
2、Docker 利用的是宿主机的内核,而不需要 Guest OS。
GuestOS: VM(虚拟机)里的系统(OS)
HostOS:物理机里的系统(OS)
虚拟机是虚拟出一个完整的操作系统内核,Dokcer只是虚拟了运行环境,用的是宿主机的操作系统内核,省略了这个复杂的过程
11、容器运行时
容器运行环境是负责运行容器的软,Docker 就是最火的容器运行时
Kubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。
通常,你可以允许集群为一个 Pod 选择其默认的容器运行时。如果你需要在集群中使用多个容器运行时, 你可以为一个 Pod 指定 RuntimeClass, 以确保 Kubernetes 会使用特定的容器运行时来运行这些容器。
你还可以通过 RuntimeClass,使用相同的容器运行时,但使用不同设定的配置来运行不同的 Pod。
12、Docker 是怎么工作的?
Docker 是一个( Client-Server )C/S结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问
第二部分 安装 Docker
一、环境准备
1、Linux要求内核3.0以上
2、CentOS 7
[root@iz2zeak7sgj6i7hrb2g862z ~]# uname -r
3.10.0-514.26.2.el7.x86_64 # 要求3.0以上
[root@iz2zeak7sgj6i7hrb2g862z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
二、安装
帮助文档:https://docs.docker.com/engine/install/
卸载与安装
#1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
#5.启动docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
#8.查看已经下载的镜像(从这里可以查看已有镜像的id)
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
三、卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
四、/var/lib/docker 是docker的默认工作路径!
五、阿里云镜像加速
阿里云镜像加速
1、登录阿里云找到容器服务
2、找到镜像加速器
3、配置使用
#1.创建一个目录
sudo mkdir -p /etc/docker
#2.编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://t2wwyxhb.mirror.aliyuncs.com"]
}
EOF
#3.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
六、回顾HelloWorld流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o2OKASuT-1683600242140)(D:\笔记图片\format,png-167774438604915.png)]
七、Docker run 流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWLb8mlF-1683600242141)(D:\笔记图片\format,png-167774439867218.png)]
Dokcer run 运行镜像的流程就是:Docker 会寻找镜像,判断本机是否存在这个要找的镜像,有则使用这个镜像运行,如果没有就会去 Docker Hub 公有仓库中查找,没有则返回错误,找不到镜像,有则下载这个镜像到时本地,再使用这个镜像运行。
第三部分 Dokcer的常用命令
一、帮助命令
docker version #版本信息
docker info #系统信息 包括镜像和容器和数量
docker 命令 --help #帮助命令
二、镜像命令
1、查看镜像 docker images -aq
dokcer images #镜像信息
#REPOSITORY 镜像的仓库源
Options:
-a, --all 显示所有镜像
-q, --quiet 只显示镜像ID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CGUvysV-1683600242142)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230214150925727.png)]
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
mysql 5.7 b84d68d0a7db 6 days ago 448MB
# 解释
#REPOSITORY # 镜像的仓库源
#TAG # 镜像的标签(版本) ---lastest 表示最新版本
#IMAGE ID # 镜像的id
#CREATED # 镜像的创建时间
#SIZE # 镜像的大小
# 可选项
Options:
-a, --all Show all images (default hides intermediate images) #列出所有镜像
-q, --quiet Only show numeric IDs # 只显示镜像的id
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -a #列出所有镜像详细信息
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -aq #列出所有镜像的id
d5f28a0bb0d0
f19c56ce92a8
1b6b1fe7261e
1b6b1fe7261e
2、镜像搜索 dokcer search mysql
dokcer search
docker search mysql --filter=STARS=3000 #过滤,搜索出来的镜像收藏STARS数量大于3000的
3、镜像拉取 docker pull mysql
✅✅分层下载 docker image的核心:联合文件系统
docker pull mysql
#1、如果不写tag 默认latest
#2、分层下载 docker image的核心,联合文件系统
35a4f1977689: Already exists
bbc37f14aded: Already exists
74e27dc593d4: Already exists
93a01fbfad7f: Already exists
1478df405869: Pull complete
64f0dd11682b: Pull complete
68ff4e050d11: Pull complete
f576086003cf: Pull complete
3b72593ce10e: Pull complete
#3、Digest: 签名防伪
#4、docker.io/library/mysql:latest 真实地址
docker pull mysql
#等价于
docker pull docker.io/library/mysql:latest
#5、指定版本
docker pull mysql:5.7
# 下载镜像 docker pull 镜像名[:tag]
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull tomcat:8
8: Pulling from library/tomcat #如果不写tag,默认就是latest
90fe46dd8199: Already exists #分层下载: docker image 的核心 联合文件系统
35a4f1977689: Already exists
bbc37f14aded: Already exists
74e27dc593d4: Already exists
93a01fbfad7f: Already exists
1478df405869: Pull complete
64f0dd11682b: Pull complete
68ff4e050d11: Pull complete
f576086003cf: Pull complete
3b72593ce10e: Pull complete
Digest: sha256:0c6234e7ec9d10ab32c06423ab829b32e3183ba5bf2620ee66de866df # 签名防伪
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8 #真实地址
#等价于
docker pull tomcat:8
docker pull docker.io/library/tomcat:8
4、镜像删除 docker rmi -f 镜像ID
docker rmi -f 镜像ID IMAGE-ID
#根据ID删除一个镜像
docker rmi -f 镜像ID1 镜像ID2 镜像ID3
#根据ID删除多个镜像
docker rmi -f $(docker images -aq)
#递归删除命令 docker images -aq就可以查出来所有镜像的ID 然后就可以递归地删除全部镜像
三、容器命令 (前提已经拉取了镜像) docker pull centos
我们有了镜像才可以创建容器如 Linux,我们可以下载一共 CentOS 镜像来学习
docker pull centos
1、启动容器 docker run -it centos /bin/bash
启动容器并进入容器
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 tomcat1 tomcat2 用来区分容器
-d 后台方式运行
-t -i 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 8080
-P 随机指定端口
docker run -it centos /bin/bash #进去之后root右边的主机名就变成了 IMAGE-ID
#进入容器后 ls 可以看到bin dev etc home lib mnt opt var等目录,就相当于真的是一个小型的Linux系统
#退出容器 退回主机
exit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdbDUVH8-1683600242144)(D:\笔记图片\image-20230310144434241.png)]
参数 | 作用 |
---|---|
-it | 搭配使用 以交互方式运行容器,启动容器后为其分配一个命令行 |
-v | 目录映射 容器目录挂载到宿主机目录 格式:<宿主机目录>:<容器目录> |
-d | 后台运行容器 |
-p(小写) | 指定端口映射,格式:宿主机端口:容器端口 |
-P(大写) | 随机端口映射 容器内部端口随机映射到主机的端口(49153-65535) |
–name Peko | 容器名字 |
-d 后台运行容器,并返回容器ID,此时不会进入交互界面,如果想要进入交互界面请加-i和-t参数。如果用了-d参数未进入容器的时候,在想进入容器,指令:docker exec -it 容器名称 /bin/bash;
2、列出容器 docker ps -a
列出所有运行的容器
docker ps #正在运行的容器
docker ps -a #曾经运行过的容器
docker ps -a -n=? #最近的?个容器
3、退出容器 exit / ctrl+P+Q
exit (容器退出并停止)
Ctrl P Q (容器退出并但不停止)
4、删除容器 docker rm -f 容器ID
docker rm 容器 id #不能删除正在运行的容器
docker rm -f $(docker ps -aq) #移除全部正在运行的容器
docker ps -a -q|xargs docker rm #删除所有的容器
5、停止容器 docker stop 容器ID
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID
四、其他命令
1、容器后台启动 docker run -d
# 命令 docker run -d 镜像名
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题docker ps. 发现centos 停止了
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
2、查看日志 docker logs -t --tail n 容器ID
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
➜ ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #更新日志
3、查看容器进程 docker inspect 容器ID
# 命令
docker inspect 容器id
#测试
➜ ~ docker inspect 55321bcae33d
第四部分 利用Docker安装各种服务器
一、练习 Docker 安装 Nginx
1、搜索镜像 docker search nginx
2、拉取镜像 docker pull nginx
3、查看是否成功拉取镜像 docker images
4、运行测试 docker run - d --name nginx01 -p 3344:80 nginx
5、查看正在运行的容器 docker ps
6、进入容器 docker exec -it nginx01 /bin/bash
找到容器位置 where is nginx
跳转 cd /etc/nginx
列出 ls
7、退出容器 exit
8、停止容器 docker stop aa664b0c8ed9
#1. 搜索镜像 search 建议大家去docker搜索,可以看到帮助文档
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search nginx
#2. 拉取下载镜像 pull
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull nginx
#3. 查看是否下载成功镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
#3. 运行测试
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d --name nginx01 -p 3344:80 nginx
aa664b0c8ed98f532453ce1c599be823bcc1f3c9209e5078615af416ccb454c2
#4. 查看正在启动的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75943663c116 nginx "nginx -g 'daemon of…" 41 seconds ago Up 40 seconds 0.0.0.0:82->80/tcp nginx00
#5. 进入容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker exec -it nginx01 /bin/bash #进入
root@aa664b0c8ed9:/# whereis nginx #找到nginx位置
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@aa664b0c8ed9:/# cd /etc/nginx/
root@aa664b0c8ed9:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
#6. 退出容器
root@aa664b0c8ed9:/etc/nginx# exit
#7. 停止容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa664b0c8ed9 nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:3344->80/tcp nginx01
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker stop aa664b0c8ed9
二、宿主机端口 和 容器内部端口 以及端口暴露
我们每次改动 Nginx 配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部就可以自动修改?
-v 数据卷 技术!
三、练习 Docker 安装 Tomcat
注意:运行测试 用完就删除的启动方式:docker run -it --rm tomcat:9.0
1、搜索镜像 docker search tomcat
2、拉去镜像 docker pull tomcat
3、查看镜像是否成功拉取 docker images
4、以后台方式、暴露端口方式启动运行 docker run -d -p 8080:8080 --name tomcat01 tomcat
5、测试访问 curl localhost:8080
6、根据容器id进入容器 docker exec -it 645596565d3f /bin/bash
7、查看tomcat容器内部内容 ls -l
8、进入目录 cd webapps 再次 ls
发现webapps目录为空
1、原因:因为阿里云镜像默认下载最小容量的版本,就是剔除一些不必要的,只留下关键的,所以有些东西会丢失,只保证了最小的可运行环境:
2、解决方案:将webapps.dist下的文件都拷贝到webapps下即可:
①cd webapps.dist
②ls 发现有内容
③cd … 退出目录 出去外面复制
④cp -r webapps.dist webapps 把有的复制到没有的
9、再次进入 cd webapps 发现东西了
10、这样docker部署tomcat就可以访问了
# 下载 tomcat9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删除
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -it --rm tomcat:9.0
--rm Automatically remove the container when it exits 用完即删
#下载 最新版
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull tomcat
#查看下载的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
#以后台方式,暴露端口方式,启动运行
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d -p 8080:8080 --name tomcat01 tomcat
#测试访问有没有问题
curl localhost:8080
#根据容器id进入tomcat容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker exec -it 645596565d3f /bin/bash
root@645596565d3f:/usr/local/tomcat#
#查看tomcat容器内部内容:
root@645596565d3f:/usr/local/tomcat# ls -l
total 152
-rw-r--r-- 1 root root 18982 May 5 20:40 BUILDING.txt
-rw-r--r-- 1 root root 5409 May 5 20:40 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 May 5 20:40 LICENSE
-rw-r--r-- 1 root root 2333 May 5 20:40 NOTICE
-rw-r--r-- 1 root root 3255 May 5 20:40 README.md
-rw-r--r-- 1 root root 6898 May 5 20:40 RELEASE-NOTES
-rw-r--r-- 1 root root 16262 May 5 20:40 RUNNING.txt
drwxr-xr-x 2 root root 4096 May 16 12:05 bin
drwxr-xr-x 1 root root 4096 May 21 11:04 conf
drwxr-xr-x 2 root root 4096 May 16 12:05 lib
drwxrwxrwx 1 root root 4096 May 21 11:04 logs
drwxr-xr-x 2 root root 4096 May 16 12:05 native-jni-lib
drwxrwxrwx 2 root root 4096 May 16 12:05 temp
drwxr-xr-x 2 root root 4096 May 16 12:05 webapps
drwxr-xr-x 7 root root 4096 May 5 20:37 webapps.dist
drwxrwxrwx 2 root root 4096 May 5 20:36 work
root@645596565d3f:/usr/local/tomcat#
#进入webapps目录
root@645596565d3f:/usr/local/tomcat# cd webapps
root@645596565d3f:/usr/local/tomcat/webapps# ls
root@645596565d3f:/usr/local/tomcat/webapps#
# 发现问题:1、linux命令少了。 2.webapps目录为空
# 原因:阿里云镜像的原因,阿里云默认是最小的镜像,所以不必要的都剔除掉
# 保证最小可运行的环境!
# 解决方案:
# 将webapps.dist下的文件都拷贝到webapps下即可
root@645596565d3f:/usr/local/tomcat# ls 找到webapps.dist
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@645596565d3f:/usr/local/tomcat# cd webapps.dist/ # 进入webapps.dist
root@645596565d3f:/usr/local/tomcat/webapps.dist# ls # 查看内容
ROOT docs examples host-manager manager
root@645596565d3f:/usr/local/tomcat/webapps.dist# cd ..
root@645596565d3f:/usr/local/tomcat# cp -r webapps.dist/* webapps # 拷贝webapps.dist 内容给webapps
root@645596565d3f:/usr/local/tomcat# cd webapps #进入webapps
root@645596565d3f:/usr/local/tomcat/webapps# ls #查看拷贝结果
ROOT docs examples host-manager manager
我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,比如webapps,我们在外部放置项目,就自动同步内部就好了!
第五部分 了解下K8s和Dokcer的关联
一、为什么需要 Kubernetes,它能做什么?
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?
这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。
Kubernetes 为你提供:
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
-
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
二、Kubernetes 不是什么
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。
由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。
但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。
Kubernetes 为构建开发人员平台提供了基础,但是在重要的地方保留了用户选择权,能有更高的灵活性。
Kubernetes:
-
不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
-
不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
-
不提供应用程序级别的服务作为内置服务,例如中间件(例如消息中间件)、 数据处理框架(例如 Spark)、数据库(例如 MySQL)、缓存、集群存储系统 (例如 Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如开放服务代理)来访问。
-
不是日志记录、监视或警报的解决方案。 它集成了一些功能作为概念证明,并提供了收集和导出指标的机制。
-
不提供也不要求配置用的语言、系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
-
不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
-
此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 而 Kubernetes 包含了一组独立可组合的控制过程,可以连续地将当前状态驱动到所提供的预期状态。 你不需要在乎如何从 A 移动到 C,也不需要集中控制,这使得系统更易于使用且功能更强大、 系统更健壮,更为弹性和可扩展。
三、什么是 Pod?
除了 Docker 之外,Kubernetes 支持很多其他容器运行时, Docker 是最有名的运行时, 使用 Docker 的术语来描述 Pod 会很有帮助。
Pod 容器组
1、Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
2、Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以在集群支持临时性容器的情况下, 为调试的目的注入临时性容器。
3、Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离方面, 即用来隔离容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。
4、Pod 类似于共享名字空间并共享文件系统卷的一组容器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rib14b39-1683600242147)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230215111026269.png)]
容器运行时是负责运行容器的软件,而 Docker 就是最有名的运行时文章来源:https://www.toymoban.com/news/detail-762920.html
Pod 通常不是直接创建的,而是使用工作负载资源创建的。 工作负载 4个容器副本集 就4个pod 分别分配到不同的节点文章来源地址https://www.toymoban.com/news/detail-762920.html
四、K8s 命令
kubectl version //显示客户端和服务器侧版本信息
kubectl get nodes //显示node节点信息
kubectl api-versions //列出当前版本的kubernetes的服务器端所支持的api版本信息
kubectl explain po //查看帮助信息和help类似,尤其是资源清单的结构字段信息
//查看帮助信息,资源下的cpu和memory等,每个配置项都有详细的网页手册地址
kubectl explain Deployment.spec.template.spec.containers.resources
kubectl get pods //查看pod信息
kubectl get pods -wide //已监控方式查看pod信息,有新的创建和销毁会立刻打印出来
kubectl get pods -o wide //查看pod详细信息
kubectl get nodes -o wide //查看node详细信息
kubectl get namespaces //列出所有的namespace
kubectl describe node nodeName //获取详细资源清单信息(包括CPU和Memory)
kubectl describe po podName //获取详细资源清单信息(包括错误信息和实时状态)
kubectl get deployment //获取指定控制器pod信息
kubectl logs podName //或者指定pod的日志信息
kubectl exec -it podName sh //进入pod容器,但是对权限要求也较多
kubectl cp fileName podName:/fileName //复制文件到pod的指定目录,也可从容器中复制文件到外部
kubectl attach podName //获取实时的logs信息
kubectl cluster-info //获取k8s集群信息
kubectl create -f yamls/sonar.yaml //根据yaml文件创建容器
kubectl create -f yamls/ //多个yaml文件创建容器
kubectl delete -f yamls/sonar.yaml //删除指定pod
kubectl delete -f yamls/ //删除多个pod
kubectl delete pods podName //删除指定pod
kubectl delete deployment ControllerName //有控制器的pod不能直接删除,需先删除其控制器
到了这里,关于Docker是什么?简单了解下Docker的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!