linux-docker-01 docker基础学习
概念解析
容器技术
容器技术虚拟化技术已经成为一种被大家广泛认可的容器技术服务器资源共享方式,容器技术可以在按需构建容器技术操作系统实例的过程当中为系统管理员提供极大的灵活性。由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此出现了一种称为容器技术(Container)的新型虚拟化技术来帮助解决这些问题。
容器和虚拟机的区别
容器:操作系统层面的虚拟化
虚拟机:硬件层的虚拟化(hypervisor)
区别:
把一个公寓套间比作虚拟机,那么容器就是合租的模式,每一个容器就是公寓里的一个卧室,大家共享客厅和厨房,但是隔壁同学大声放音乐可能会吵到隔壁同学,并且从锁门保护隐私来看也不是这么的安全。
传统虚拟化方式 vs Docker
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
容器的三个特点
1、容器具有不可变的特性
在it运维过程中,环境变化是导致运维故障的主要原因,例如本地安装的python3,上架到服务器上调试时发现服务器原有环境是Python2,这就会导致问题出现。或者开发工作结束后,到服务器上测试会由于环境不同而出现很多问题。然而docker技术解决了问题,只要定义了docker file的环境,则有了一次构建,到处执行的特性。
2、容器都非常轻量
VM虚拟化程度更高,可以在物理机或者虚拟机创建多个容器
3、容器的创建速度更快
秒级启动、创建、销毁
Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker参考资料
Docker 发展历史
Docker最初是dotCloud公司创始人Solomon Hykes。 üDocker使用Google公司推出的Go语言进行开发实现。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 的优点
1、简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成,容器使软件具备了超强的可移植能力。
2、避免选择恐惧症
如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
4、总结:
更高效的利用系统资源、更快速的启动时间、一致的运行环境、持续交付和部署、更轻松的迁移、更轻松的维护和扩展。
docker等于容器container 吗?实则不然
docker是一种以容器技术为核心的一套应用的构建、分发、执行的体系和生态
docker体系
docker engine :docker 引擎,控制容器创建、销毁、管理
docker hub:docker 仓库,用来存放docker镜像,docker镜像仓库:hub.docker.com
docker machine:让容器能快速封发到主机上执行,包括私有云公有云和物理机,比作将集装箱运往船上的吊车,而私有云公有云和物理机就是船,容器就是集装箱
docker compose:Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
docker S:吊车将集装箱运往船上时,需要通过一套完整的自动化体系去编排各种步骤的顺序,docker S是一种编排体系。
docker解决的问题
1.程序在我这里跑的好好的,怎么到你那里就不行了?
2.系统好卡,是哪个进程把CPU给吃光了?
3.这套系统我已经搭建好了,要不你再重新搭建一遍?
4.如今的IT架构已经变得非常复杂,开发人员通常需要多种服务构建和组装应用。而且应用可能部署到不同的环境上(虚拟服务器,公有云,私有云)。
5.一个应用包含多种服务,这些服务都有不同的依赖库和软件包。多种部署环境,如果需要动态迁移的时候,如何保证应用正常运行?这会大大消耗开发人员和运维人员的时间和精力,开发人员编写代码时需要考虑到不同的运行环境;运维人员,则需要为不同的服务和平台配置环境。
搭建一套系统是非常繁琐的过程,至少需要十天半个月。然而用docker构建环境是非常快速的、自动化的。docker解决了环境变化带来的问题,解决了进程和进程之间资源的隔,通过linux内核本身特性,实现资源的隔离。
解决方法:
Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。
Docker的优势
对于开发人员——Build Once, Run Anywhere
容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
对于运维人员——Configure Once, Run Anything
只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。
从全球航运视角认识docker
没有集装箱就没有全球化,集装箱改变世界,docker也在改变世界。集装箱是二十世纪最伟大的发明之一,不同尺寸的货物在全世界如何通过一种低沉本、快速的方式去运输?
docker类比于传统航运体系
建立”航运“技术标准的挑战有集装箱尺寸形状、装卸流程、吊车尺寸、通关流程等,docker自然也面临这些挑战。
集装箱:变革了人类整个生产流程体系,让地球变平了;
docker:变革IT领域的软件交付方式,让IT之间的鸿沟消失。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
企业在哪些场景会用到docker
1.构建devops流程,实现运维自动化
2.企业私有的PAAS平台,降低开发成本,提升效率
3.企业级AppStore,统一的后端系统分发平台,让所有后端系统标准化系统化地进行管理和分发
4.间歇式计算任务,让其非常轻量级,可以秒级创建。启动、销毁
5.构建微服务架构
docker使用实践经验
1、3C原则(一个容器只运行一个应用),一个集装箱一个目的地,方便调配和管理
使用镜像来交付应用程序,不要直接部署,很多人习惯创建一个容器,然后在容器里安装一个系统,然后登录到系统里直接安装部署,其实这是非常不好的,正确的方式是通过docker file定义整个环境然后biuld成镜像,然后通过镜像去分发、执行。
2、分层构建镜像
不要将所有东西所有打包成一个镜像,例如县构建一个基础的ubantu的镜像,然后在其他镜像里面去引用它,一般把系统基础镜像划分为一个层次,environment环境划分为一个层次,最后将应用镜像划分为一个层次。后面形成镜像叠加
3、不要把本地运行的容器转成镜像
很多人习惯将容器当成虚拟机来使用,安装好所有东西后push到仓库,这样是非常不好的,我们应道使用镜像来交付应用,而不是直接部署
4、不要将数据存储在容器中,因为容器一旦销毁就没了
可以将一些不变的数据存储到专门存储数据的镜像,或者把一些外部设备映射到镜像里面
docker核心概念
概念 | 解析 |
---|---|
镜像(Images) | Docker 镜像是用于创建 Docker 容器的只读模板,包含一个最小 root文件系统。 |
容器(Container) | 容器是独立运行的一个或一组应用。 |
客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker镜像
Docker 镜像(Image)是一个只读模版,包含一个最小 root文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
Docker容器
Docker 容器就是 Docker 镜像的运行实例,用户可以通过 CLI(docker)或是 API 启动、停止、移动或删除容器。对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。
Docker仓库
Registry 是存放 Docker 镜像的仓库进行集中存储和分发。
Registry 分私有和公有两种:
公共仓库:Docker Hub
私有仓库:用户自己创建的仓库
Docker组件协同工作流程
①Docker客户端执行docker run 命令
②Docker daemon发现本地没有httpd镜像
③Dameon从Docker Hub 下载镜像
④下载完成,镜像被保存到本地
⑤Docker daemon启动容器
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,Docker 容器通过 Docker 镜像来创建,容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 采用的是 Client/Server 架构,客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或REST API 与远程的服务器通信。