1.什么是Docker —docker官网 docker中文网 docker Hub官网
①一种新兴的虚拟化方式。
②一种解决了运行环境和配置环境的软件容器。
2.为什么会有docker,它解决了什么问题
场景:产品开发完成后需要运维人员在服务器上部署上线,开发人员在windows环境开发,部署运行环境确是linux,此时需要在linux服务器上进行各种环境配置,部署项目后,导致项目无法运行,此时运维和开发的战争就开始了
运维说:“你们的程序代码是不是有问题?”
开发说:“我cao,你们是不是不会部署,你看,在我本地机器上运行的一点毛病都没有。”
目前流行分布式架构,项目的各种服务不仅仅部署在一个单体服务器上,那么问题来了,这么多服务器,难道都需要一台一台的配置各种应用环境么?不仅如此,如果配置某一个环境,导致服务器坏掉,是不是服务器还得重新装操作系统?
总结,我们发现项目之所以能不能运行起来,都是环境配置惹的祸,有人就问,开发人员的程序在本地环境下运行的没有问题,那么能不能直接把环境和程序一起原封不动的部署在服务器上,也就是所谓的带环境部署。好比一条热带小鱼生活在一种碱性,且温度在25℃的鱼缸中,此时小鱼要搬家,是不是还需要给小鱼配置一套,碱性且为25℃水环境,大家知道配置这样的环境很麻烦的,如果带着鱼缸一起搬家不就不用配置这些繁琐的环境了么。
docker理念就是做到“一次构建,到处运行“。应用程序运行在docker容器上,docker容器在任何操作系统上运行效果都是相同的,实现了跨平台,跨服务,此时只需要配置好一次环境,然后将环境复制到其他机器上即可。
3.新兴的虚拟化方式?那传统给的虚拟化方式是什么样子呢?
传统虚拟化技术:虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
我们在windows操作系统上运行linux操作系统,是不是安装一个vmware软件,然后vmware上安装linux系统,安装过程中,我们需要给linux系统分配一些计算机的内存,cpu,硬盘等一系列的硬件设备。然后基于这些硬件设备的基础之上,安装linux操作系统,在linux操作系统之上运行我们的软件应用程序,即我们的app。虚拟机不仅安装步骤繁琐,启动慢,且占用硬件资源。
Docker:基于Linux内核的各种技术,对进程进行了封装隔离,它属于操作系统层面的虚拟化技术。和上面传统虚拟化技术的区别是少了一层虚拟化系统,也就是说不需要捆绑一整套操作系统,以前软件运行需要在宿主机器上在安装一个机器,然后在此机器上运行,而此时,软件运行直接在宿主机器上运行,此时软件运行的会更加轻便灵活。容器是不需要硬件虚拟的,直接运行在宿主内核。这样对系统的资源利用率会更加的高效,速度也更加的快。
容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置(直接使用实际物理机的硬件资源)。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
区别:
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
4.一次构建,到处运行
①更高效的利用系统资源
由于容器不需要不需要捆绑一整套操作系统,对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率
②更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
③一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
④持续交付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile
来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
⑤更轻松的迁移
Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,且运行结果是一致的。应用程序跨平台迁移,运行效果不变。
⑥更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,可通过镜像运行新的容器进行快速扩容,且扩容速度能达到分钟级甚至秒级,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。
4.docker安装
5.docker引擎
- 一种服务器(server),它是一种称为守护进程并且长时间运行的程序。守护进程,我们可以把它看做一个监控进程运行的进程。——通常我们运行一个应用程序,这就是一个进程,我们称它为应用1,有时候应用1崩掉了,我们也没有发现,或者发现的时候已经晚了,此时我们需要创建另一个长时间运行的程序,即应用2,让应用2替我们监控应用1,当应用1崩掉的时候,应用2会对应用1进行重启操作,让它时刻守护着应用1。我们成运行的应用2,就是守护进程。
- REST API 用于指定程序可以用来与守护进程通信的接口,并指示它做什么。
- 一个有命令行界面 (CLI) 工具的客户端。,它可以管理我们的网络(network)、容器(container)、image(镜像)、数据卷(data volumes)。
6.docker架构
三部分组成:镜像(imgage) ,容器(containers),仓库(registry)
Docker使用c/s架构模式,使用远程API管理创建docker容器。
标题 | 说明 |
镜像(Images) | 类似于面向对象中的类,是用于创建 Docker 容器的模板。本身是一个文件,我们称为镜像文件。 |
容器(Container) | 容器是独立运行的一个或一组应用。一个容器运行一种服务,需要的时候,docker客户端就创建一个对应的运行实例,就是我们所说的容器 |
客户端(Client) | 通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用,一个放了大量镜像的地方,需要的时候就去仓库中拉取就可以了。类似于maven的中心仓库,里面集成了大量的jar包。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
docker pull:首先连接docker_HOST服务器,然后去registry仓库(有中类似于maven仓库的概念)去下载所需要的镜像到本地的docker镜像中
docker run:首先去本地去找所需要的镜像,然后将镜像实例化成容器。
对象是类的实例,容器是镜像的实例。对象没了,类实例化OK了。容器没了,镜像实例化就OK了。
例如我们运行一个tomcat,tomcat是一个镜像,此时我们把tomact当成一个类,类是一个抽象的东西,不能直接运行,如果运行需要实例化一个对象,也就是说tomcat运行需要实例化一个容器,类是基于对象A运行的,tomcat则是基于容器A运行的。tomcat可以再次实例化一个容器B,则tomcat是基于容器B运行的。如果在来一个mysql镜像,我们也会把它当做成一个类,实例化一个容器C,则mysql则是基于容器C运行的。容器A和容器B都是tomcat镜像实例化出来的,但他们相互隔离,互补影响。
7.docker操作镜像
#查看镜像的体积
docker system df
# 输出如下
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 24 0 1.992GB 1.992GB (100%)
Containers 1 0 62.82MB 62.82MB (100%)
Local Volumes 9 0 652.2MB 652.2MB (100%)
Build Cache 0B 0B
8.docker操作容器
启动容器
所需要的命令主要为 docker run
#运行某一容器实例,以tomcat为例
#docker run -p 宿主机端口:容器端口 --name tomcat -d 镜像名
docker run -p 8080:8080 --name tomcat -d tomcat
#查看正在运行的容器
docker ps
终止容器
可以使用 docker container stop
来终止一个运行中的容器。此外,当 Docker 容器中指定的应用终结时,容器也自动终止。
例如对于只启动了一个终端的容器,用户通过 exit
命令或 ctrl + d
来退出终端时,所创建的容器立刻终止。终止状态的容器可以用 docker container ls -a
命令看到。例如
启动已终止容器
处于终止状态的容器,可以通过 docker container start
命令来重新启动。此外,docker container restart
命令会将一个运行态的容器终止,然后再重新启动它。
#先进行查看
docker container ls -a
docker container start [container ID or NAMES]
容器日志
要获取容器的输出信息,可以通过 docker container logs
命令。
docker container logs [container ID or NAMES]
# 输出如下
hello world
hello world
hello world
进入容器
在使用 -d
参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,docker exec
命令能让我们以交互的方式进入容器。docker exec
后边可以跟多个参数,这里主要说明 -i
-t
参数。只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
如果从这个 stdin 中 exit,不会导致容器的停止。更多参数说明请使用 docker exec --help
查看。
docker exec -it 69d1 bash
root@69d137adef7a:/
#删除容器
可以使用 docker container rm
来删除一个处于终止状态的容器。例如如果要删除一个运行中的容器,可以添加 -f
参数。Docker 会发送 SIGKILL
信号给容器。
docker container rm trusting_newton
trusting_newton
清理所有处于终止状态的容器
用 docker container ls -a
命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
docker container prune