up:: 多线程与分布式概述

说明:

(1) 本篇博客的内容:Docker的一些入门性介绍;


1.Dcoker是什么?

进入docker的官网:【Home - Docker】;可以查看docker的一些信息;

容器:比如在Linux操作系统上,启动一个docker打的镜像,就可以得到一个容器;

(1) 容器是一个标准的软件单元,其打包了代码以及对应的依赖;(比如redis、MySQL、jdk等java运行所需的环境和配置)

● 比如,前面我们把SpringBoot项目打成了一个jar包;这只是个jar包,其并不包含依赖项(比如redis、MySQL、jdk等java运行所需的环境和配置);

● 假如我们使用容器的话,其不仅仅包括代码,还包括代码运行所需的依赖项(比如redis、MySQL、jdk等java运行所需的环境和配置);容器其实是一个轻量级的、独立的、可执行的软件包;其中包含了应用程序所需要的一切,不仅仅包含代码,还包含系统工具、系统库、依赖、设置等等;

(2) 使用容器与否的对比;

● 在我们没有使用容器的时候,比如前面我们在本机开发完Spring Boot项目,然后这个Spring Boot项目在自己的开发电脑上运行OK,那么我们就把其打成jar包;然后,要想把这个项目部署到服务器上,我们需要在服务器上安装jdk,MySQL等,同时还需要进行一些配置;然后,我们才能把项目打成的jar上传到服务器上,进行部署;

● 那么,如果我们使用了容器后,由于其不仅仅打包了代码,还包括依赖项(代码想要运行所需的支撑环境:系统工具、系统库、依赖、设置等等),那么我们的程序就可以快速的部署可靠的在另一个机器上运行;

(3) 其实,对于我们来说,容器最大的作用是,其能够帮助我们把环境等相关问题,给统一解决掉,提高开发和部署效率;这是因为,容器把程序和环境视作一体,一起进行打包;


2.为什么需要Docker;

(1)原因1: 安装一个软件,并让这个软件能正常运行,其实是个挺麻烦且容易出问题的事;那么对于我们开发的项目来说,更是如此;软件运行所需的环境,配置起来还是挺麻烦的,而且一旦我们配置错了,程序往往就无法运行;比如,在自己开发电脑上能运行的项目,在运维的服务器上可能就运行不了,这大概率就是【运维服务器上的配置的环境】和【自己开发电脑上的环境】不一致导致的;

(2)原因2: 为了解决上面的问题,我们可以考虑使用虚拟机技术;我们可以把程序运行所需的环境给打成一个系统镜像,然后,可以创建很多虚拟机,这些虚拟机都使用我们上面的镜像;那么,这样一来,我们就可以获取到很多OK的【程序以及对应的运行环境】;;但是,虚拟机虽然可以提供完全隔离的环境,但是虚拟机的开销是很大的;一个完整的、想要运行我们项目的虚拟机,大概要占用几十G的硬盘,同时也需要占用内存;而且,这些被虚拟机占用的资源,是无法被外界共享的;

而,Docker可以解决这问题;( _ _PS,这儿理解可能错误:__Docker的容器,可以认为是一个低消耗、互相隔离的、可共享操作系统内核的,虚拟机))


3.Docker的用途;

(1)构建:

● 比如,没有使用docker之前,我们在开发项目的时候,我们想要去发布项目;那么我们首先要构建(build)这个项目,打成jar或者war包;然后,把其上传到我们配置好的服务器上,去部署;

● 如果使用docker的话,上面的过程就会方便很多;我们就可以使用docker,把本地的程序打包到一个固定的环境中;这就省去了我们还需要在服务器上进行的各种配置工作;

(2)共享:

● 比如,我们在本地开发一个程序后,要想把这个程序放到服务器上;这就会涉及到传输的问题;比如我们可以使用,U盘,蓝牙,ftp,手动传输等方式,把项目传到服务器上;

● 如果使用docker的话,就不用如此了;docker有个统一的管理中心,我们使用docker打了镜像后,可以把其传到中央仓库;然后,在服务器那儿,我们从中央仓库中就可以获取;

(3)运行:

● 由于环境不一致,可能在自己开发电脑上能运行的程序,在运维的服务器上就不能运行;

● 如果使用docker的话,这个问题就被彻底解决了;docker可以保证,程序在相同的环境、以相同的方式运行;并且,docker的开销不大,所以我们可以创建很多独立的docker,比如一个docker只运行java,一个docker只运行redis,另一个docker只运行Nginx(PS:这种,每个docker只包含一种功能环境的方式,可以降低语言、软件、环境产生冲突的风险);


4.Docker的特点;

(1)标准:

● docker很流行,实际上已经成为了容器的实际标准;这也意味,比如我们这儿有一个镜像,只要我们的服务器上安装有docker环境,那么我们就可以使用docker提供的命令把这个镜像给启动起来,启动成一个容器;(主要原因是:由于docker技术应用广泛且已经是事实上的标准,所以即使是其他技术打成的镜像,我们使用docker的命令,也大概率是能把其给启动起来的)

● 比如,我们打了【Tomcat软件及其运行环境的,镜像】、【Nginx软件及其运行环境的,镜像】;然后,我们知道Tomcat和Nginx的命令是不同的;但是,只要经过一定的配置,我们在使用docker去启动这些镜像的时候,不需要考虑【Tomcat和Nginx,各自的命令】,只要执行docker相关的命令,就可以保证镜像能正常启动,能启动成一个容器,里面的软件能正常运行;也正是由于docker的标准化,docker才越来越流行;

(2)轻量级:

● docker的轻量级,主要是和虚拟机相比的;因为,容器是可以共享机器的操作系统内核的,因此就提高了服务器的整体运行效率;

(3)安全:

● 安全,主要体现在docker的隔离能力;假设我们有两个程序分别运行在两个不同的容器中,那么两个程序相互默认是独立的、隔离的、不影响的;比如如果不使用docker的话,以前,我们的一台服务器往往会运行多个程序(比如,我们可以在服务器上部署多个项目,然后这些项目使用不同的端口),而这很容易会出现这种情况:一个程序在运行时,一不小心把操作系统给带胯了(或者把内存给占光了,或者把硬盘给占满了);那么,这样一来,就会影响到另一个程序;;;而,如果我们使用docker的话,则不会出现这样的问题;


5.Docker架构;

(1)Client: 就是docker的客户端;比如,我们在自己的服务器上安装docker后,那么自己的本地的这台服务器,就可以看成是docker的客户端;

● docker客户端,可以使用docker的相关命令,这些信号会传到到DOCKER_HOST(docker服务器);

(2)DOCKER_HOST(docker服务器)

● 这些命令,首先会传到Docker_daemon;由Docker_daemon对这些命令,进行分发和处理;Docker_daemon是进行统一指挥的;

● Images(镜像),Containers(容器),Registry(仓库);

(3)Images(镜像);

● docker打包,是把程序和环境一起打包的;这个打包,就是生成一个Image镜像;这个镜像就包括我们的程序和程序运行所需的依赖和环境;

● 所以,如果我们有了一个完整的Images,我们我们就能够确保,程序一定能够跑起来;(因为,这个镜像不仅包含我们的程序,还包含程序运行所需的依赖和环境)

● Images(镜像)可以叠加,而且镜像通常是分层的,最底层可能是某个操作系统(比如Ubuntu);然后,在这层的上面,我们可能会首先安装java环境;然后,有了java环境之后,在往上可能是我们自己电商项目的jar包;;;;那么,由于镜像的这种特点;如果我们创建一个我们电商项目的镜像的话,我们就不需要从0设置我们的镜像,我们可以在别人镜像的基础上(比如,有个人设置了一个CentOS操作系统的镜像)进行叠加;这样一来,效率更高;

● 其实进行镜像就相当于是一个实际存在的标准、规范、配置;当我们把这个镜像设置到我们的服务器上,并启动它的时候,这个镜像就被启动成了一个容器,也就意味这个镜像活了;

(4)Containers(容器);

● 即这个流程是这样的:首先,使用docker把【我们的项目,和,项目的环境、配置】给打成一个镜像;然后,我们把这个镜像放在我们服务器上;然后,在服务器上,我们通过docker命令,把这个镜像给启动起来,然后就得到了该镜像的一个容器;我们的项目就是跑在这个容器中的;

● 一个镜像可以有多个容器;;比如,我么有个Nginx镜像,那么我们把这个镜像上传到服务器上后,把这个镜像给启动起来后,就得到了一个该镜像的容器;同时,一个镜像可以有多个容器,比如,这个Nginx镜像我们可以启动一个容器,然后设置其端口为80;然后,我们再启动一个容器,其端口可以设为81;然后,我们还可以启动一个容器,其端口设为82;这些容器,都是来自于同一个镜像; 而且,这一个镜像的多个容器,是互相隔离的;

● 容器,是可进一步修改;比如,我们启动了一个MySQL的镜像,启动得到了一个运行MySQL的容器;那么,我们可以在这个容器中,修改MySQL的用户名、端口等;然后,如果我们以修改后的容器中的环境打成一个新的镜像的话,那么这个镜像启动后的容器的环境就是我们修改后的;

(5)Registry(仓库);

● 仓库主要起到集中存储的功能(比如Maven就有中央仓库;);我们在本地打了个镜像后,就可以把这个镜像推送到仓库,然后运维同事就可以从仓库中把镜像给下载下来;

● 一般,我们常使用的【程序及其运行环境的,镜像】,在仓库中,官方都提供了个一个比较标准的;访问docker官方的中央仓库:【Docker Hub】:

国内,也可以访问:【Hub · DaoCloud】;

【Docker 应用篇】IDEA 集成 Docker 插件实现镜像打包上传