概述
一、Docker背景
1.常见项目特点
2.Docker应用场景
- 快速实现对分布式微服务架构一键部署
- 基于云计算、大数据时代,解决忙闲不均、服务资源高效利用
- 持续集成与持续交付(CI/CD)
二、Docker基础
1.Docker简介
背景
问题1:
某IT部门要上线一个项目。常规操作,直接去线上服务器,拷贝一个tomcat,然后改端口号,然后部署应用到webapps文件夹下,重启就好。一个服务器上可能会部署多个应用服务。如果某个应用出现问题,CPU100%,可能这个服务器上的其他应用也会出现问题。对于一个大型应用拆分为几十个微服务,分别交由不同的团队开发,不同团队之间水平参差不齐。如果还采用这种部署方式,你的应用可能会因为另一个团队的应用发生意外。因部署在了同一台服务器上,导致全部出现问题。
问题2∶
开发和线上代码(同一套代码)问题。开发阶段部署一套软件环境,测试人员在开发中测试没有问题,运维进行部署。但是正式部署到服务器时,发生了问题(启动参数、环境问题、漏配了参数)等意外。
问题3∶
随着微服务技术的兴起,一个大的应用需要拆分成多个微服务。多个微服务的生成,就会面临庞大系统的部署效率,开发协同效率问题。然后通过服务的拆分,数据的读写分离、分库分表等方式重新架构,而且这种方式如果要做的彻底,需要花费大量人力物力。可能需要部署很多个服务器。
问题4;
持续的软件版本发布/测试项目。到线上环境的集成
2.什么是Docker、Docker应用场景
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone的app) ,更重要的是容器性能开销极低。
3.docker的好处
1、简化程序:
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结! 比如 Docker镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
4、持续交付和部署
对开发和运维(Devops)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像
5、更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况
4.应用场景
Docker的应用场景
web应用的自动化打包和发布。自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的openShift或Cloud Foundry平台来搭建自己的 PaaS环境。
云计算+大数据时代
开发一套应用程序代码、服务器(Linux)、安装开发环境工具包(JDK/Tomcat/MySq1/Nginx/RabbitNQ/Redis/Solr)
IaaS : (Infrastructure-as-a-Service)(基础设施即服务)
阿里云、百度云、腾讯云、华为云。
Iaas:(服务器):开发一套应用程序代码、安装开发环境工具包
PaaS: (Platform as a Service)(平台即服务)
Paas:服务器+安装开发环境工具包:只需要开发一套应用程序代码。
SaaS: (Software-as-a-Service)(软件即服务)
Saas:服务器+安装开发环境工具包+代码--》只需要花钱购买服务即可。
例子:一份西红柿炒鸡蛋,
Iass:自己买锅(服务器),食材(所需软件,搭建环境),烹饪(开发);
PaaS:锅和食材准备好了,做菜即可
Saas:自己花钱到外卖平台,想吃啥买啥
5.虚拟机区别
架构
infrastructure(基础服务)硬件
Host oS主机操作系统
VM虚拟机
Hypervisor虚拟层程序
- 实现原理技术不同
虚拟机是用来进行硬件资源划分的完美解决方案,利用的是硬件虚拟化技术,如此VT-x、AMD-V会通过一 个hypervisor层来实现对资源的彻底隔离。而容器则是操作系统级别的虚拟化,利用的是内核的Cgroup和Namespace特性,此功能通过软件来实现,仅仅是进程本身就可以实现互相隔离,不需要任何辅助。
-
使用资源方面不同
Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此更加轻量级,消耗的资源更少。虚拟机会独占分配给自己的资源,不存在资源共享,各个虚拟机之间近乎完全隔离,更加重量级,也会消耗更多的资源。
-
应用场景不同
若需要资源的完全隔离并且不考虑资源的消耗,可以使用虚拟机.若是想隔离进程并且需要运行大量进程实例,应该选择Docker容器。
6.Docker架构
Docker基本概念
Docker包括三个基本概念
- 镜像( Image )
- 容器(Container)
- 仓库(Repository )
Docker引擎
Docker使用客户端-服务器(C/S)架构模式,使用远程APlI来管理和创建Docker容器。Docker容器通过 Docker镜像来创建。
镜像、容器的类比
镜像(Image )和容器( Container )的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学Docker时常常会混淆容器和虚拟机。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失
仓库和镜像
Docker镜像
是一个存入镜像的仓库。通常被部署在互联网服务器或者云端。Docker Hub( https://hub.docker.com)提供了庞大的镜像集合供使用。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
分层存储
因为镜像包含操作系统完整的 root文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用UnionFS的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像
三、Docker仓库
Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub( https://hub.docker.com)提供了庞大的镜像集合供使用。
公有Docker Registry
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。除此以外,还有coreos的Quay.io,CoreOS相关的镜像存储在这里; Google的Google Container Registry ,Kubernetes 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对Docker Hub的镜像服务( Registry Mirror ),这些镜像服务被称为加速器。常见的有阿里云加速器、DaoCloud加速器等。使用加速器会直接从国内的地址下载.Docker Hub的镜像,比直接从Docker Hub下载速度会提高很多。
国内也有一些云服务商提供类似于Docker Hub的公开服务。比如时速云镜像仓库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等。
私有Docker Registry
除了使用公开服务外,用户还可以在本地搭建私有Docker Registry。Docker官方提供了Docker Registry镜像,可以直接使用做为私有Registry服务。
开源的Docker Registry镜像只提供了Docker Registry APl的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker TrustedRegistry中,提供了这些高级功能。
除了官方的Docker Registry 外,还有第三方软件实现了Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor和 Sonatype Nexus。
四、Docker安装
1.官方安装网址
https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-repository
2.安装要求
目前,CentoS仅发行版本中的内核支持Docker。Docker运行在CentoS7上,要求系统为64位、系统内核版本为3.10以上。Docker运行在CentOS-6.5或更高的版本的CentoS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。
3.版本
从 2017年 3月开始 docker在原来的基础上分为两个分支版本:Docker CE 和Docker EE。Docker CE即社区免费版,Docker EE即企业版,强调安全,但需付费使用。
4.检测系统版本
uname -r
5.移除旧版本
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
6.安装一些必要的系统工具
安装所需的软件包。yum-utils提供了yum-config-manager应用,并device-mapper-persistent-data和lvm2由需要devicemapper存储驱动程序。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
7.添加软件源信息
源1:(官方推荐)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
源2:(阿里云源)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存:
sudo yum makecache fast
安装Docker-CE
sudo yum -y install docker-ce
启动Docker后台服务
sudo systemctl start docker
重启Docker服务
sudo systemctl restart docke
安装成功后可通过查看
docker version
五、Docker配置镜像加速器
鉴于国内网络问题,后续拉取 Docker镜像十分缓慢,我们可以需要配置加速器来解决使用Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用Docker的体验。因此 DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了Docker官方的大力推荐。如果您是在国内的网络环境使用Docker,那么 Docker 加速器一定能帮助到您。
Docker官方和国内很多云服务商都提供了国内加速器服务,
例如:.
- Docker官方提供的中国 registry mirror
- 阿里云加速器
- DaoCloud加速器
1.修改配置
编辑/etc/docker/daemon.json
{
"registry-mirrors": ["https://ytji6dx6.mirror.aliyuncs.com"]
}
2.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
3.检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,查看镜像地址是否匹配,如匹配,说明配置成功
docker info
六、Docker镜像
镜像是Docker的三大组件之一。Docker运行容器前需要本地存在对应的镜像,如果本地不存在,Docker会从镜像仓库下载。
1.从仓库获取镜像
docker pull 镜像
2.查找镜像
我们可以从 Docker Hub网站来搜索镜像,Docker Hub网址为: https://hub.docker.com/我们也可以使用docker search命令来搜索镜像。比如我们需要一个tomcat的镜像来作为我们的web服务。我们可以通过docker search命令搜索tomcat来寻找适合我们的镜像。
docker search tomcat
3.Docker列出镜像
要想列出已经下载下来的镜像,可以使用docker image ls命令或者 docker images。
docker image ls
4.获取镜像
获取镜像
从Docker镜像仓库获取镜像的命令是docker pull其命令格式为:
docker pull[选项][Docker Registey 地址[:端口号]/]镜像名[:标签]
具体的选项可以通过docker pull --help命令看到,
Docker 镜像仓库地址:﹑地址的格式一般是〈<域名/IP>[:端口号]。默认地址是 Docker Hub。
-镜像名:这里的仓库名是两段式名称,即<用户名>/<软件名>。对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。我们需要一个tomcat的镜像来作为我们的web服务。通过docker pull获取镜像
docker pull tomcat:版本号 不写︰版本号代表laster版本
下载nginx
docker pull nginx
指定tomcat版本号
docker pull tomcat:8
5.列出已下载的镜像
docker images
列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。其中仓库名、标签在之前的基础概念已经介绍过了。镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。因此,如果拥有相同的ID,因为它们对应的是同一个镜像。
6.镜像体积
如果仔细观察,会注意到,这里标识的所占用空间和在Docker Hub上看到的镜像大小不同。这是因为Docker Hub中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此DockerHub所显示的大小是网络传输中更关心的流量大小。而docker image ls 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是,docker image ls列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于Docker镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于Docker使用Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
7.虚悬镜像
我们平时可能会看到这样一个镜像,这个镜像既没有仓库名,也没有标签,均为 :
<none> <none> 00285df0df87 5 days ago 342 MB
这个镜像原本是有镜像名和标签的,原来为 java:1.8
,随着官方镜像维护,发布了新版本后,重新 docker pull java:1.8
时, java:1.8
这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 。除了 docker pull
可能导致这种情况,docker build
也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为的镜像。这类无标签镜像也被称为虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:
docker images -f dangling=true
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
docker rmi $(docker images -q -f dangling=true)
8.管理本地主机上的镜像;
Docker删除本地镜像语法:
docker image rm[选项]<镜像1>[<镜像2>.....]
用ID、镜像名、摘要删除镜像
其中,<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要。
如果要删除本地的镜像,可以使用docker image rmi / rm命令
docker image-rmi镜像ID//常用
要删除镜像必须确认此镜像目前没有被任何容器使用
Docker其它辅助命令
查看本地镜像的IMAGE ID
docker images -q
查看一个镜像的制作历程
docker history 镜像名称
9.Docker保存镜像备份本地仓库的镜像
用save子命令将本地仓库的镜像保存当前目录下
docker save -o tomcat8.tar 镜像名称
将本地目录下的镜像备份文件导入到本地 Docker仓库
方式一(不输出详细信息)∶
[ root@localhost ~]# docker load -i tomcat8.tar
方式二(输出详细信息):
[ root@localhost ~]# docker load < tomcat8.tar
最后
以上就是飞快鲜花为你收集整理的2021-09-21的全部内容,希望文章能够帮你解决2021-09-21所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复