Docker概述与部署技术
一、什么是Docker?
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。可以轻松的为任何应用创建一个轻量级的、可移值的、自给自足的容器,然后发布到任何流行的Linux机器上,也可以实现虚拟化。Docker容器完全使用沙盒机制,相互之间不会存在任何接口,几乎没有性能开销,可以很容易的在机器和数据中心运行,最重要的是,他们不依赖于任何语言、框架或者包装系统。
Docker的logo十分有特点,一条鲸鱼载着很多集装箱,集装箱中满是要交付的货物。鲸鱼就是操作系统,而集装箱就是Docker,集装箱中的就是要交付的货物,也就是应用程序。各种"货物"之间的尺寸、大小、形状是各不相同的,都要放到鲸鱼身上,那么就要考虑各种货物怎么安放,还得考虑货物之间能否重叠起来。
于是就有了集装箱的概念,将每件货物都放到集装箱中,各个应用程序相当于不同的集装箱,每个应用程序有着不同的应用环境,比如:python开发的应用需要服务器部署一套python的开发环境,nodejs开发的应用需要服务器部署nodejs的环境,不同环境之间有可能还会彼此冲突,而Docker就可以帮助我们隔离不同的环境。
这时,有人就会想,这不是虚拟机干的事情吗?是的,虚拟机可以很好的帮我们隔离各个环境,我们可以在windows上运行macOS、ubuntu等虚拟机,也可以在macos上安装Windows的虚拟机。但是虚拟机虚拟化的是硬件(虚拟机和宿主机共享的是硬件,如网卡、声卡等,系统需要自己装),传统虚拟机需要独立安装操作系统,故可以安装并运行不同的操作系统,而对于Docker容器来说,是不需要独立的操作系统,每个容器都是共享同一个操作系统,比虚拟机更加的轻便和快捷。容器内的应用进程直接运行于宿主的内核,也不用进行硬件虚拟。因此Docker容器要比传统虚拟机更为轻便,启动更快。下图比较了两者的区别:

两者对比总结:

二、Docker三要素
Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,将镜像打包后上传到仓库,就可以发布应用到任意平台中。在使用时,只用一条命令就可以将镜像拉取到本地,然后一条命令就可以快速的将项目部署起来。这也完美的诠释了Docker的三大核心:镜像、容器、仓库。
➢镜像(Image):相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。在实际使用中,它包含运行某个软件所需的所有内容,我们把应用程序和所需的依赖、函数库、环境、配置等文件打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。
➢容器(Container):是镜像中的应用程序运行后形成的进程,只是Docker会给容器进程做隔离,对外不可见。容器(Container)和镜像(Image)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除,每个容器都是互相隔离的,保证安全的平台,我们可以把容器看做是简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
➢仓库(Repository):是集中存放镜像的地方,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker仓库分为公共仓库和私有仓库两种,最大的公共仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商 (如时速云、阿里云等) 也提供了仓库的本地源,可以提供稳定的国内访问。当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库,当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了,这里仓库的概念类似 Git,Register可以理解为GitHub这种托管服务。

三、Docker架构
我们要使用Docker来操作镜像、容器,就必须要安装Docker。Docker是一个CS架构的程序,由两部分组成:
(1)服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等;
(2)客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
对于用户来说,镜像操作一般是指Docker的客户端操作,包括镜像获取、创建、修改、运行、删除、搜索、查看等一系列操作。Docker重要的操作命令有docker build、docker run、docker pull。
➢docker build:当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。
➢docker run:有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。
➢docker pull:用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样就可以使用image了。
所以,我们执行Docker命令时,其本质是通过docker daemon去操作Docker的镜像、容器、仓库等来完成相关功能。Docker本质就是宿主机的一个进程,Docker是通过namespace实现资源隔离,通过cgroup实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘,比如分配500g并不是实际占用物理磁盘500g)。

四、Docker应用场景
1. Web应用的自动化打包和发布;
2. 自动化测试和持续集成、发布;
3. 在服务型环境中部署和调整数据库或其他的后台应用;
4. 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS(平台即服务)环境。
五、Docker容器化部署的优势
1. 启动快、解决虚拟机资源消耗问题
启动容器相当于启动本机一个进程,启动速度快。一台电脑运行一个Linux虚拟机可能会卡顿,却可以使用Docker虚拟几十甚至上百台虚拟Linux服务器,容器仅占用到的资源,多个容器可共享资源。
2. 体积小、快速部署
开发的应用在自己电脑上运行,换一台机器可能无法运行,需要环境配置。但使用Docker可以将应用程序及依赖包打包在一个文件里,运行这个文件就会启动虚拟服务器。
3. 提供一次性环境
启动或关闭一个虚拟服务器就像启动或关闭一个进程一样简单、快速。
4. 组建微服务架构
通过多个容器,一台机器可以跑很多虚拟服务器,一台机器上可以虚拟出微服务架构,也可以模拟出分布式架构。
六、Docker的简单部署
1. 安装Docker
(1)安装docker:yum install docker,需要root权限
(2)启动docker:systemctl start docker,
查看docker版本:docker -v
(3)将docker服务设为开机启动:systemctl enable docker
(4)停止docker:systemstl stop docker
注意:启动前应当设置源,修改docker文件
vim /usr/lib/systemd/system/docker.service
这里设置阿里的,注册阿里云账户号每个用户都有


2. 镜像操作
(1)检索镜像:docker search 关键字。
例如:docker search zookeeper查找zookeeper镜像。
实际上就是去https://hub.docker.com/网站上查询。
(2)拉取镜像:docker pull 镜像名 tag。
tag可选,一般为软件的版本号。默认为latest。

(3)查看已下载的镜像:docker images

(4)导出镜像:docker save 根据ID将镜像保存成一个文件

(5)删除本地指定镜像:docker rmi 镜像id

(6)导入镜像:docker load 命令则可将镜像文件载入进来

(7)运行hello world,这里用centos镜像echo一个hello word

3. 容器操作
镜像拉取完后,就需要运行镜像,生成容器。
(1)运行镜像,生成容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#参数说明
--name = "Name" 容器名字
-c 后面跟待完成的命令
-d 以后台方式运行并且返回ID,启动守护进程式容器
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
-p 指定容器端口 -p 容器端口:物理机端口 映射端口
-v 给容器挂载存储卷
示例:
docker run --name 容器名 -p 映射端口:容器运行端口 -d 镜像名:tag
docker run --name tomcat01 -p 8080:8080 -d tomcat:8.5.78-jre8
因为docker容器的端口,外部机器访问不到,需要将docker主机的端口和容器运行的端口映射,外部机器访问主机映射的端口即可访问容器里的软件,镜像名:tag,运行时最好带上tag。
(2)查看容器列表:docker ps 。查看运行中的容器列表,加上-a,可以查看所有容器。


(3)停止容器:docker stop 容器id/容器名称
(4)启动容器:docker start 容器id/容器名称
(5)删除容器:docker rm 容器id/容器名称

(6)查看容器日志:docker logs 容器id/容器名称

大家可以直接输入Docker命令来查看Docker的所有命令选项,详细的Docker命令信息可以上官网查看:
https://docs.docker.com/engine/reference/commandline/docker/
免责声明:本账号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。
浙公网安备 33010602011771号