Docker概述
Docker为什么出现?
一款产品:开发-上线 两套环境!应用环境!应用配置!
开发 ··· 运维。问题:我的电脑用运行!版本更新,导致服务不可用!对于运维来说,考研太大了
环境配置是十分麻烦,每一个机器都要部署环境(集群redis,es、Hadoop)!费时费力
发布一个项目(jar + Redis Mysql + jdk ES),项目能不能都带上环境安装打包
Docker给以上的问题,提出了解决方案
Docker能做什么:
虚拟机技术缺点:
- 资源占用十分多
- 冗余步骤多
- 启动很慢
容器化技术
容器化技术不是模拟一个完整的系统
比较docker和虚拟机技术的不同:
- 传统虚拟机,虚拟处一条硬件,运行一个完整的操作系统,然后在这个系统上安装软件
- 容器内的应用直接运行在宿主机的内,容器没有自己的内核,也没有虚拟我们的硬件,所以轻便了
- 每一个容器是相互隔离的,每个容器内都有一个数据自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署:
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容:
使用了Docker之后,我们部署应用就像搭积木一样!
项目打包为一个镜像,扩展服务器A!服务器B!
更简单的系统运维:
在容器化之后,我的开发,测试环境都是高度一致的
更高效的计算机资源利用:
Docker是内核级别的虚拟化,可以再一个物理机上运行很多的容器实例!服务器性能可以压榨到极致
Docker安装
Docker基本组成
镜像(image):
docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像==>run==>tomcat容器(提供服务器)
容器(container):
docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。启动,停止,删除,基本命令!
目前可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方
仓库分为公有和私有
Docker Hub(默认是国外的)
阿里云……都有容器服务器(配置镜像加速)
安装Docker
环境准备
1.需要会一点点linux的基础
2.CentOs7
3.连接服务器
环境查看
查看系统内核版本
|
|
系统版本
|
|
帮助文档
|
|
|
|
|
|
删除docker
|
|
Docker为什么比VM快
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm需要是Guest OS
所以说,新建一个容器时,docker不需要虚拟机一样需要重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统内核,省略了这个复杂的过程,秒级
Dokcer的常用命令
帮助文档
|
|
镜像命令
|
|
docker search镜像搜索
|
|
docker pull下载镜像
|
|
dokcer rmi 删除镜像
|
|
容器命令
说明:有了镜像才可以创建容器,Linux,下载一个centos镜像来测试学习
|
|
新建容器并启动
|
|
列出所有的运行中的容器
|
|
退出容器
|
|
删除容器
|
|
启动和停止容器的操作
|
|
常用的其他命令
后台启动容器
|
|
查看日志
|
|
查看容器中的进程信息
|
|
查看镜像的元数据
|
|
进入当前正在运行的容器
|
|
从容器内拷贝文件到主机上
|
|
docker练习
Docker 安装nginx
|
|
Docker布局tomcat
|
|
Docker 部署es+kibana
|
|
|
|
可视化
- portainer(先用这个)
|
|
- Rancher(CI/CD再用)
什么portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作!
测试:访问外网
Docker镜像原理
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含了运行某个软件所需的所有的内容,包括代码、运行时、库、环境变量和配置文件。
如何得到镜像
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
Docker 镜像加载原理
UnionFS(联合文件系统)
**UnionFS(联合文件系统):**UnionFS文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改,作为一次提交一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union文件系统所是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
**特性:**一次同时加载多个文件系统,但才外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这个层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动后会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包括boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs智商,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版本,比如ubuntu,centos等等
平时我们安装虚拟机的CentOs都是好几个g,为什么docker这里才几百兆
对于一个精简的os,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版本可用公用bootfs。
分层理解
分层的镜像
为什么Docker镜像要采用这种分层的结构?
|
|
最大的好处,莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层可以通过docker image inspect命令!
|
|
commit镜像
|
|
实践
|
|
容器数据卷
什么是容器数据卷
**docker的理念:**将应用和环境打包成一个镜像
容器之间由一个数据共享的技术,Docker容器中产生的数据,可以同步到本地
卷技术:将容器目录挂载到linux上面
使用数据卷
直接使用命令挂载
|
|
实践:安装Mysql
|
|
具名和匿名挂载
|
|
|
|
所有docker容器内的卷,没有指定目录都是在/var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便的找到卷,大多数使用的都是具名挂载
|
|
拓展:
|
|
初识DockerFile
DockerFile就是用来构建docker镜像的构建文件!
通过脚本生成镜像,镜像是一层一层的,脚本是一个个命令,每一个命令就是一层
|
|
|
|
启动自己的容器
|
|
自己容器挂载的路径
|
|
数据卷容器
多个容器同步数据
|
|
删除docker01的容器之后数据依然存在
容器之间买配置信息的传递,数据卷容器的生命周期一致持续到没有容器使用为止
DockerFile
DokerFile介绍
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(Docker Hub、阿里云镜像仓库)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建镜像
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须大写字母
2、执行顺序是从上到下的
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
dockerFile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件,这个文件很简单,dockerfil逐渐成为企业交付的标准,必须要掌握!
步骤:开发、部署、运维缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
指令:
|
|
创建一个属于自己的centos
|
|
CMD 和 ENTRYPOINT 区别
测试cmd
|
|
测试ENTRYPOINT
|
|
Dockerfile中很多命令都十分相似,我们需要了解它们的区别,我的最好的学习就是对比测试
实践:Tomcat镜像
1、准备镜像文件tomcat压缩包,jdk的压缩包
2、准备dockerfile文件,官方命令Dockerfile
,build时会自动寻找这个文件,就不需要-f指定了
|
|
3、构建镜像
|
|
Docker网络
理解Docker0
清空所有环境(镜像和容器)
|
|
原理
1、每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术
2、在启动一个容器又多了一个网卡
|
|
容器带来的网卡,都是一对的,evth-pair就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,正因为这个特性,evth-pari充当一个桥接,连接各种虚拟网络设备的,Docker容器之间的连接,都是使用evth-paur技术
link
|
|
|
|
link的本质:就是在hosts配置增加了171.17.0.3 容器id
自定义网络
查看所有docker 网络
|
|
网络模式
bridge:桥接docker(默认)自己创建网络也是用bridge模式
none:不配置网络
host:和宿主机共享网络
container:容器网络联通(用的少,局限很大)
测试
|
|
|
|
自定义的网络docker已经帮我们维护好了对应的关系
好处:
redis-不同的集群使用不同的网络,保证了集群是安全和健康的
mysql-不同的集群使用不同的网络,保证了集群是安全和健康的
网络连通
|
|
|
|
|
|
部署redis集群
创建redis网卡
|
|
通过脚本创建六个reids配置
|
|
|
|
SpringBoot项目打包Docker镜像
1、构建springboot项目
2、打包应用
3、编写Dockerfile
4、构建镜像
5、发布运行
Docker Compose
简介:
Docker
DockerFile build run 手动操作,单个容器!
微服务,100个微服务!依赖关系
Docker Compose 来轻松高效的管理容器,定义运行多个容器。
Compose是docker官方的开源项目,需要安装,
Dockerfile
让程序可以在任何地方运行,web服务、redis、MySQL、nginx…多个容器
Compose
|
|
docker-compose -up 100个服务
Compose:重要的概念
- 服务services,容器,应用。(web、redis、mysql)
- 项目project,一组关联的容器。博客,web,mysql
Compose 安装
|
|
授权
|
|
体验
python应用,计数器,redis。
|
|
yaml 规则
docker-compose.yaml核心
|
|
开源项目
下载程序,安装数据库、配置……
compose应用。=》一键启动
|
|
前台启动
|
|
测试:
|
|
|
|
|
|
|
|
项目要重新打包
|
|