Docker理论总结

目录

容器技术的演变

物理机时代

虚拟化时代

容器化时代

容器化技术的应用场景 

Docker介绍与基本概念

标准化的应用打包

Docker的发展

Docker是容器化平台

Docker体系架构

容器与镜像

Docker执行流程

容器内部

Tomcat容器内部结构

在容器中执行命令

容器生命周期

镜像

Dockerfile镜像描述文件

Dockerfile自动部署Tomcat应用

镜像分层

容器通信

容器间Link单向通信

Bridge网桥双向通信

Volume容器间共享数据

容器编排工具 Docker Compose


容器技术的演变

物理机时代 

物理机时代

部署非常慢

成本很高

资源浪费

难于扩展与迁移

受制于硬件

虚拟化时代

多部署

资源池

资源隔离

很容易扩展

VM需要安装操作系统

容器化时代

容器化技术的应用场景 

标准化的迁移方式

统一的参数配置

自动化部署

应用集群监控

开发与运维之间的沟通桥梁
 

Docker介绍与基本概念

开源的应用容器引擎,基于 Go 语言开发

容器是完全使用沙箱机制,容器开销极低

Docker就是容器化技术的代名词    

Docker也具备一定虚拟化职能

docker文档

Docker overview

标准化的应用打包

Docker的发展

Docker是容器化平台

Docker是提供应用打包,部署与运行应用的容器化平台

可以看到docker类似于jvm,在程序和可用资源中间

Docker体系架构

分为3层,底层是docker服务器,也称为服务进程,所有的操作都在这里处理

中间是rest api,通信层,通信通过http协议 

最外层是docker客户端,通过rest api,向server发送命令,server处理后通过api向客户端返回

类似于docker pull这种命令

这样服务器和客户端可以不用在同一个服务器,运维只要在自己的机器安装客户端即可,可以管理很多服务器

容器与镜像

镜像:镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"

容器:是镜像的实例,由Docker负责创建,容器之间彼此隔离 

类似于win7的操作系统光盘,就是镜像。安装完的操作系统,就是容器

Docker执行流程

 client:发出指令的一方

docker host:里面daemon负责接受命令,管理镜像images和容器containers

reqistry:仓库,远程存储各种镜像

例如:部署redis,执行docker pull redis,docker daemon会在本地查看是否有镜像,没有,从registry下载redis镜像到docker服务器本地

然后执行docker run redis,daemon发现已经有了镜像,创建redis容器,容器内部就是一个迷你的linux系统,有它提供redis服务。

如果要分布式,就再执行docker run redis,这样就再运行了一个redis,并且2个redis的隔离的,互不影响

容器内部

Tomcat容器内部结构

底层有一个linux系统,但是这个系统很小,一般只能支持上面的应用,而且只提供最基础的命令

自动安装了一个jdk8,上面安装了一个tomcat8.5

在容器中执行命令

格式:docker exec [-it] 容器id 命令

exec 在对应容器中执行命令

-it 采用交互方式执行命令

实例:docker exec -it 0738ed2fe68b /bin/bash

如果对tomcat容器这样做,后面可以不断输入命令,并且此时直接进入usr/local/tomcat目录

最后输入命令 exit,即可退出 

容器生命周期

方框是事件,圆形是容器状态

输入docker run,执create,start,变成running状态

输入docker create,执create,变成stopped状态,只创建容器,不运行。

然后输入docker start,执行start,变成running状态

输入docker kill或者docker stop,都会执行die,让当前容器变得不可用。然后,kill会杀掉容器应用的进程,而stop不会杀掉,只是停止stop容器,然后都变成stopped状态。但是如果输入docker start,kill的容器会生成一个新容器,而stop会将原来的状态恢复。

输入docker restart,会执行die,start,restart,从而让容器重启

输入docker pause,会执行pause事件,变成状态paused。然后可以输入docker unpause,会恢复。

如果容器内部oom异常了,会执行die。然后根据docker的重启策略,如果要重启,就执行start,变成状态running。如果不重启,就变成stopped状态。

输入docker rm,就执行destroy,变成状态deleted

真实显示的状态:

stopped分成2个,created和exited,分别从create和die变成。

running显示为up

paused还是paused

deleted不会有这个状态,因为容器都显示不出来了 

镜像

Dockerfile镜像描述文件

Dockerfile是一个包含用于组合镜像的命令的文本文档

Docker通过读取Dockerfile中的指令按步自动生成镜像

docker build -t 机构/镜像名<:tags> Dockerfile目录 

机构名

镜像名

版本号,如果不写,就是latest

Dockerfile目录可以是绝对路径,也可以是相对路径

Dockerfile自动部署Tomcat应用

在firstdockerfile目录下,创建一个docker-web目录,里面有一个index.html,想让tomcat容器一运行,就能访问index.html

在firstdockerfile目录下,创建一个Dockerfile文件(没有后缀名),编辑,输入下面命令

FROM tomcat:latest

MAINTAINER dragon.com

WORKDIR /usr/local/tomcat/webapps

ADD docker-web ./docker-web

每行的第一个词语都是dockerfile的命令

FROM表示设置基准镜像,表示之后从这个镜像开始扩展。这里表示以最新版本的tomcat为基准,基于它进行扩展。

MAINTAINER 表示这个镜像由哪个人或者哪个机构进行维护,这里表示有dragon.com机构维护,拥有

WORKDIR 用于切换工作目录,这里表示以容器内的/usr/local/tomcat/webapps作为工作目录,实际上是要把web应用存在这个目录里面,tomcat才能运行这个应用。注意:如果目录不存在,会自动创建

ADD 表示复制目录下所有文件到镜像的指定目录下。第一个docker-web指和dockerfile同级的文件夹,第二个指如果webapps这个目录下面没有docker-web这个目录,就创建它。add表示,将第一个表示的文件夹里的所有东西(就是index.html),复制到容器里docker-web目录里面。

然后把文件都存在docker所在的虚拟机里面,文件结构如上 

然后 cd /usr/image/first-dockerfile

然后docker build -t dragon.com/mywebapp:1.0 /usr/image/first-docker/
或者docker build -t dragon.com/mywebapp:1.0 .

也就是绝对路径或者相对路径

docker images就可以看到新的镜像

镜像分层

在dockerfile自动生成镜像的4个语句中,会有一个临时容器,执行这些命令,每执行一句,就会有一个临时快照,也就是running in xxx ,执行完后,会对当前的步骤进行一个存档,这样就可以对它进行复用。

比如说部署一个其他应用,前面3步都一样,这样前3步的临时快照就可以复用

 可以看到如果前面的语句相同,那么就会直接使用缓存,不同的地方才会创建临时容器运行

容器通信

容器间Link单向通信

例如tomcat只需要单向的访问mysql,mysql不需要知道tomcat

还有每个容器被创建后,都会创建一个虚拟ip,而且他们之间是网络互通的,但是每创建一个容器,虚拟ip地址都可能发生变化,所以不建议使用ip进行通信,而是根据名称进行通信,docker会自动进行转发

例如这里,给tomcat容器命名为web,创建一个centos容器命名为database(假装数据库),之所以要执行bash,是因为不执行命令,centos会自动退出

可以使用docker inspect xxxx(container id),查看这个容器的具体信息,里面有它的虚拟ip

 

可以看到使用虚拟ip,是可以互相通信的,但不能直接ping database,因为ip没有和名称进行关联

删除web容器,然后重新创建,里面增加 --link database,web应用能向database通信

之后只要将jdbc配置文件里的ip地址,改成这个database,即可

 

Bridge网桥双向通信

可以使用link来进行双向通信,但是用网桥更加方便

bridge是一个虚拟组件,让容器里的应用和外部进行通信,数据会和物理网卡进行通信

还可以对指定的容器进行分组,组内的容器天然互联互通

先启动两个容器,并且--name命名

docker network ls能列出docker当前的网络明细

每个容器都会有一个默认的网桥,联向外网

创建一个新的网桥 docker network create -d bridge my-bridge

之后通过这个网桥的容器,彼此之间都是互联的

 使用命令 docker network connect my-bridge xxx  就可以把xxx绑定到这个网桥

 然后两个容器内部就可以根据名字,相互连接了

它的实现原理是,网桥会生成一个虚拟网卡,容器的网络连接都通过它。

但是如果向外部通信,都会通过虚拟网卡,进行数据的转发到物理网卡,再转发到外网

Volume容器间共享数据

比如说多个tomcat容器,共享一些数据。

volume数据卷,在宿主机上开辟一个空间,这样容器可以共享这个空间,类似于nas这样

这样,宿主机的路径a和容器的路径b,进行一个映射,容器访问b,就可以访问a

 

通过设置-v挂载宿主机目录

格式:

docker run --name 容器名  -v 宿主机路径:容器内挂载路径 镜像名

实例:

docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat

通过--volumes-from 共享容器内挂载点

1 创建共享容器

docker create --name webpage   -v /webapps:/tomcat/webapps tomcat /bin/true

第一步,只是创建容器,名字为webpage,并且进行路径的映射

2 共享容器挂载点

docker run --volumes-from webpage --name t1 -d tomcat

第二部,容器运行,根据容器webpage的挂载信息,创建一个新的容器,名字叫t1

这样挂载点被webpage统一管理

容器编排工具 Docker Compose

比如说,要创建mysql数据库,nginx,tomcat应用

如果要上线,怎么让运维安装这3个东西

compose可以通过一个脚本,先安装mysql,再安装nginx,最后安装tomcat,同时形成彼此之间的依赖关系

Docker Compose 单机多容器部署工具

通过yml文件定义多容器如何部署

WIN/MAC默认提供Docker Compose,Linux需安装

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/129976368