《《容器化基础知识》课件.docx》由会员分享,可在线阅读,更多相关《《容器化基础知识》课件.docx(20页珍藏版)》请在优知文库上搜索。
1、容器化基础知识1.基础知识随着云计算和大数据时代的到来,传统的服务器架构已经不能满足现代应用的需求,为了更好地支持应用程序的开发、测试、部署和运行,出现了很多新型的虚拟化技术,其中最流行的技术之一就是Docker容器技术。DoCker是一个开源的容器技术,它可以帮助开发者在物理机或虚拟机上创建、部署和运行应用程序,同时提供了更高的效率、可靠性和安全性。在Docker容器中,每个应用程序都是隔离的,可以依赖于不同的软件和库进行运行,这使得开发人员能够在同一台设备上运行多个应用程序,而不必担心它们之间的干扰、依赖和安全问题。1.1. Docker的核心概念和术语D。Cker容器技术是一个非常灵活和
2、可配置的系统,它包含了很多核心概念和术语,例如:镜像(image):Docker容器的基础模板,一个镜像包含了一个应用程序运行所需的所有文件、库和配置信息,可以用来创建一个或多个Docker容器。容器(Container):DOCker镜像的运行实例,一个容器可以被视为一个小型虚拟机,在其中运行单个应用程序,容器之间是独立且相互隔离的。仓库(registry):用于存储和管理Docker镜像的地方,DockerHub是最常用的公共仓库,但也可以搭建私有仓库。Dockerfile:通过编写一份Dockerfile文件,可以自动化构建一个Docker镜像,并配置应用程序的环境和依赖。DockerC
3、ompose:一种工具,可以通过编写一个docker-compose.yml文件来管理多个容器,并定义它们之间的网络和协作关系。1.2. 使用Docker的优势和注意事项D。Cker容器技术具有以下优势:1、容器具有不可变的特性。容器将操作系统、程序库、配置文件、路径和应用程序打包在一起运行,也就是说,我们在做QA测试的时候整个镜像是什么样,投入到产品环境以后就是什么样,其性能不会有彳不可差距。2、容器都非常轻量。单个容器的内存占用很小,不像其他进程动辄占用上万MB的内存空间,容器只会给主进程分配内存,可以有效降低系统开销。3、容器的速度更快。虚拟机的启动时间一般都在分钟级,容器的启动速度可以
4、达到秒级,启动容器就跟启动IinUX进程一样快。虽然容器的好处这么多,但是有很多用户还不了解,还认为容器跟一般的虚拟机没什么差别。实际上,容器是可销毁的,这是容器跟虚拟机之间最大的差别。容器的存在周期很短,只要用户使用完毕,就可以立即销毁容器,所以用朝生暮死来形容也不算过分。在使用Docker的过程中,需要注意以下事项:1)不要将数据储存在容器中。容器随时都可以停止、销毁或迁移,比方说,一个容器里运行的应用版本是1.0,我们分分钟就可以把这个应用升级到1.1同时还不会对数据造成任何影响。所以如果用户想要存数据的话,最好是用数据卷来存储。不过在用卷存数据的时候大家还是要注意一点,如果有两个容器共
5、用一个数据卷,都往里面写数据的话,是有可能造成程序崩溃的。我们在设计应用程序的时候应该考虑到这一点,为保万无一失,应用程序应该具备特定的机制,以确保在往共享数据存储区写入数据的时候不会出错。2)不要把应用程序分块交付。在部分用户看来,容器跟虚拟机没什么两样,所以有些人往往会把应用程序部署到当前运行的若干个容器中。这种做法在开发阶段没有太大的问题,因为做开发的时候我们会很频繁地进行部署和调试,但是到了持续交付(CD)阶段,下一步就是QA测试和正式投产了,这种做法就不太适合了。在这一阶段,我们应该充分考虑到容器的不可变特性,最好是将应用程序打包到一个镜像中交付。3)不要把镜像体积建得很大。镜像越大
6、,就越难发布。镜像中只包含必要的文件和Iibrary就可以了,能让应用或者进程运行起来就行。千万不要在镜像中安装些没必要的东西,在构建镜像的时候要避免使用yum这种update命令,免得系统自动下载很多不相干的文件到新镜像层中。4)建镜像的时候不要只建一层。大家都知道,Docker的文件系统是分层的,在建镜像的时候我们应该这么建,将操作系统单独建一层,作为基础镜像,然后用户名定义文件、运行时安装环境、配置文件都要分别建一层镜像,最后才是应用镜像层。这么做的话,我们以后重建、管理以及发布镜像的时候就要轻省得多了。换句话说就是创建镜像的时候不要用wdockercommit命令来创建。用这种办法建镜
7、像是完全不可取的,因为这种办法是不能重复的。我们在建镜像的时候应该从Dockerfile创建,或者用其他S2I(从源文件构建镜像)的方式来创建,这样镜像才具有可再生性,而且如果我们把镜像存在git之类提供版本控制能的系统里的话,还可以对Dockerfile的改动进行跟踪。6)给镜像打tag的时候不要只打TateSlatest其实就相当于Maven里头的快照。因为容器的文件系统是分层的,我们最好是给镜像多打几个tago如果只有latest的话,可能过段时间我们再来运行应用程序的时候就发现程序运行不起来了,因为应用的父层(就是Dockerfile里面的跟在FROM命令后面的那一层)被更新的版本覆盖
8、了,而新版本又不能向下兼容,还有可能就是从buildcache里面取镜像的时候取到了错的latest镜像。在产品环境中部署容器的时候也要避免使用latest,不然容易造成无法跟踪记录镜像版本的问题。7)不要在单个容器里面运行多个进程。容器本来就是用来运行单个应用的(比如httpdaemon,应用服务器,数据库等等),如果我们非要在一个容器里跑几个应用,那么在管理每个应用进程、存取日志、升级应用的时候就会很麻烦。8)不要把认证口令存在镜像中,用环境变量比较好。如果我们把用户名/密码值对存在镜像里的话,就只有采用硬编码的方式来挨个处理,估计这种麻烦事没人愿意去干。所以我们最好是用环境变量的方从容器
9、外部获取此类信息。Docker容器默认是以root权限运行的。不过随着技术的成熟,docker也会提供安全性更高的默认操作选项。在现有技术条件下,以root权限运行会对其他应用带来安全隐患,而且在有些运行环境下root权限是取不到的,所以我们在跑容器的时候应该用USER命令来指定非root权限的用户。10)不要过分依赖IP地址。每个容器都有一个内部IP,这个IP不是固定的,我们启动容器或者停止容器的时候IP都会变。如果我们要让应用或者微服务模块在容器之间进行通信的话,正确的做法是通过设置环境变量来传递主机名和端口号。其实看完这句话还是不明白究竟是啥的,下面就慢慢解释。不过长话短说的话,把他想象
10、成一个用了一种新颖方式实现的超轻量虚拟机,在大概效果上也是正确的。当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(ApplicationContainer2.最佳实践&容器编排在项目中应用最佳实践有以下优势: 提高安全性 优化Dockerimage的大小 充分利用Docker有用的功能编写易于维护的Dockerfile文件2L最佳实践1:使用官方的镜像尽可能使用官方和经过验证的Docker镜像作为基础镜像。如果你所在的团队技术比较强悍,有自己私有化的Dockerhubz保存了公司项目中使用的所有镜像,这些镜像包括构建项目使用的基础镜像以及使用中的项目镜像.基础镜像还是
11、建议使用Docker官方并经过验证的镜像,如果基于Dockerfile构建的项目镜像那么还是需要校验DOCkerimage的安全性等一系列的安全检查s.假设你正在开发一个NOde.js应用程序,并希望将其构建并作为DOCker镜像运行。最佳实践:不要使用基本操作系统(UbUntU、CentOS等)镜像并安装node.js、叩m和其他你的应用程序所需的工具,而是为你的应用程序使用官方的node镜像。不推荐FROMubunturunapt-getupdate&apt-getinstall-ynode&rm-rfvarlibaptlists*在这个Dockerfile中使用了官方的ubuntu镜像,
12、然后使用命令安装了node麟推荐FROMnode这个Dockerfile中我们使用官方提供的Node镜像说明:同样是官方的镜像,为什们不推荐使用ubuntu而是使用官方的node镜像?更干净的DOCkerfile,意味着dockerfile中的代码量更少,更清晰使用官方和经过验证的图像,这些镜像已经采用了最佳实践在官方DockerHub中,我们看到镜像名称后面带有DOCKEROFFICIALIMAGE标识的就是Docker官方的镜像22最佳实践2:使用特定的Docker镜像版本使用特定的Docker镜像版本在使用dockerimage的时候,我们已经选择了基础镜像,但是现在当我们从这个Dock
13、erfile构建应用程序镜像时,它将始终使用官方node镜像的latest标签O使用官方默认的latest标签会有问题呢?可能会得到一个与之前版本不同的图像版本,及时使用了latest标签,官方在不断的更新node镜像的内容,每次都构建了不同的镜像。新的镜像可能会有bug、或者不稳定的情况发生.软件开发中有个规则就是一般都不是用软件的最新版本(因为会有不同程度的问题)。latest标签是不可预测的,会导致意外的问题发生.所以,最好的做法就是使用固定版本的镜像,更好的做法是使用是我们的应用程序相匹配的镜像版本,规则就是:越具体越好不推荐FROMnode:latest在这个Dockerfile中使
14、用了官方的带有latest标签的镜像,latest意味着就是最新版本的镜像,存在不稳定,或者未发现的问题.推荐FROMnodexurrent-alpine3.18这个Dockerfile中我们使用官方提供的Node镜像并指定了版本号未node:slim这样我们在项目中使用的镜像就知道使用了镜像的那个版本,是否跟我们项目使用的node版本相匹配。2.3. 最佳实践3:使用更小的官方镜像使用更小的官方镜像选择Nodejs镜像时,我们会发现实际上有多个官方镜像可供选择。不仅版本号不同,而且还有不同的操作系统分发版:那问题是:我们应该选择哪一个镜像,它为什么很重要?61)镜像大小:如果镜像是基于像Ub
15、untu或Centos这样的完整操作系统发行版,那么镜像中已经打包了许多工具。因此,镜像大小会更大,但是在我们的应用程序镜像中并不需要大部分这些工具。相比之下,拥有较小的图像意味着在图像存储库中需要更少的存储空间,同时也需要更少的部署服务器空间。当从存储库拉取或推送图像时,当然可以更快地传输这些图像。2)安全问题:除此之外,由于内部安装了许多工具,我们需要考虑安全方面的问题。因为这样的基础镜像通常包含很多漏洞,从而给我们的应用镜像创建了一个更大的攻击面。这样一来,我们的应用中引入了不必要的安全问题!,正所谓要想少犯错,那么就让他少干活通过使用较小的图像和更精简的操作系统发行版进行比较,只安装必要的系统工郸口库,可以最大限度地减少攻击面,并确保构建更安全的镜像。所以在这里最佳实践是选择一个基于更轻量级操作系统分发版本的图像,比如alpineoAlpine镜像具备启动容器应用所需的一切,但更加轻量级。对于大多数在DockerHUb上查看的镜像我们会看到一个带有alpine发行版标签的版本号。他是Docker容器中最常见和流行的基础镜像之一。2.4. 最佳实践4:优化构建镜像时的缓存优化构建镜像时的缓存在docker中,镜像层是什么,缓存和镜像层有什么关联呢?1)什么是镜像层(imagelayer)一个Docker镜像是基于Dockerfile构建的。在Do