目录
容器技术的演变
物理机时代
虚拟化时代
容器化时代
容器化技术的应用场景
Docker介绍与基本概念
标准化的应用打包
Docker的发展
Docker是容器化平台
Docker体系架构
容器与镜像
Docker执行流程
容器内部
Tomcat容器内部结构
在容器中执行命令
容器生命周期
镜像
Dockerfile镜像描述文件
Dockerfile自动部署Tomcat应用
镜像分层
容器通信
容器间Link单向通信
Bridge网桥双向通信
Volume容器间共享数据
容器编排工具 Docker Compose
物理机时代
部署非常慢
成本很高
资源浪费
难于扩展与迁移
受制于硬件
多部署
资源池
资源隔离
很容易扩展
VM需要安装操作系统
标准化的迁移方式
统一的参数配置
自动化部署
应用集群监控
开发与运维之间的沟通桥梁
开源的应用容器引擎,基于 Go 语言开发
容器是完全使用沙箱机制,容器开销极低
Docker就是容器化技术的代名词
Docker也具备一定虚拟化职能
docker文档
Docker overview
Docker是提供应用打包,部署与运行应用的容器化平台
可以看到docker类似于jvm,在程序和可用资源中间
分为3层,底层是docker服务器,也称为服务进程,所有的操作都在这里处理
中间是rest api,通信层,通信通过http协议
最外层是docker客户端,通过rest api,向server发送命令,server处理后通过api向客户端返回
类似于docker pull这种命令
这样服务器和客户端可以不用在同一个服务器,运维只要在自己的机器安装客户端即可,可以管理很多服务器
镜像:镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"
容器:是镜像的实例,由Docker负责创建,容器之间彼此隔离
类似于win7的操作系统光盘,就是镜像。安装完的操作系统,就是容器
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的隔离的,互不影响
底层有一个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是一个包含用于组合镜像的命令的文本文档
Docker通过读取Dockerfile中的指令按步自动生成镜像
docker build -t 机构/镜像名<:tags> Dockerfile目录
机构名
镜像名
版本号,如果不写,就是latest
Dockerfile目录可以是绝对路径,也可以是相对路径
在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步的临时快照就可以复用
可以看到如果前面的语句相同,那么就会直接使用缓存,不同的地方才会创建临时容器运行
例如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,即可
可以使用link来进行双向通信,但是用网桥更加方便
bridge是一个虚拟组件,让容器里的应用和外部进行通信,数据会和物理网卡进行通信
还可以对指定的容器进行分组,组内的容器天然互联互通
先启动两个容器,并且--name命名
docker network ls能列出docker当前的网络明细
每个容器都会有一个默认的网桥,联向外网
创建一个新的网桥 docker network create -d bridge my-bridge
之后通过这个网桥的容器,彼此之间都是互联的
使用命令 docker network connect my-bridge xxx 就可以把xxx绑定到这个网桥
它的实现原理是,网桥会生成一个虚拟网卡,容器的网络连接都通过它。
但是如果向外部通信,都会通过虚拟网卡,进行数据的转发到物理网卡,再转发到外网
比如说多个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统一管理
比如说,要创建mysql数据库,nginx,tomcat应用
如果要上线,怎么让运维安装这3个东西
compose可以通过一个脚本,先安装mysql,再安装nginx,最后安装tomcat,同时形成彼此之间的依赖关系
Docker Compose 单机多容器部署工具
通过yml文件定义多容器如何部署
WIN/MAC默认提供Docker Compose,Linux需安装