docker简单的说就是一个沙盒技术,主要目的是为了将应用运行在其中与外界隔离,方便这个沙盒可以被转移到其它宿主机器。docker虚拟化的是java app、 依赖包、环境信息、操作系统软件。先有docker后有容器化技术,docker基于linux containers。
docker体积小,启动速度快。一次构建处处运行。
mq,mysql,node.js 环境都不一样会有兼容性问题。
开发测试都没有问题生产环境却有问题。可以把环境信息都打包到容器内部无论到哪环境都是一样的。
不再依赖于操作系统不论是ubuntu还是centos、windows都是调用系统内核再调用操作计算机硬件。有了docker可以把服务器简单的看做是系统应用+内核+计算机硬件。docker把java app、 依赖包、环境信息、操作系统软件全部封装到了系统应用中。每次启动服务都启动一个docker-shim进程由containerd统一管理。
一台服务器可以有多个docker容器,每个docker各自占用资源互相不影响,隔离性好,不会一个应用占满整个服务器。
自研了libcontainer摆脱了linuxcontariner 可以跨平台使用 linux windows都可以使用
docker build/docker pull/docker run – docker deaon – registry – images – containers
是用户界面,它支持用户与 Docker Daemon 之间通信
最核心的后台进程,运行于主机上,处理服务请求
是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份
负责应用程序的运行,包括操作系统、用户添加的文件以及元数据
是一个只读模板,用来运行Docker容器
是文件指令集,用来说明如何自动创建Docker镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像只是一个虚拟的概念,并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。比如微服务A和微服务B他们代码不同其他运行环境都相同运行环境无需重复下载
联合文件系统,镜像构建时,会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
因为我们在开发中需要频繁修改 application.yml 文件我们将配置项配置到 pom 文件中打包时自动打到配置文件,这样可以用一个 pom 文件控制多个不同的服务的配置文件项的修改。
在子项目的pom文件的 build 构建配置中使用 true 配置,这样就可以将我们的总pom中的配置编译进配置文件了,在子项目的 application.yml 配置文件中注意使用 @xxx@ 占位符来配置编译占位配置
可以去docker hub查找官方镜像
docker search
docker pull
拉取过慢可以去阿里云找一下进行加速,配置镜像加速
docker image
docker run -d -p 3306:3306
d:宿主机端口号
p:容器端口号
通过宿主机端口号访问容器端口号
停止容器:docker stop + 容器id
删除容器:docker rm + 容器id
下次启动 docker start + 容器id
暂停容器:docker pause + 容器id
恢复容器:docker unpause + 容器id
docker ps -a
docker logs -f + 容器id
vi Dockerfile
定制的镜像都是基于 FROM 的镜像,这里的 openjdk 就是定制需要的基础镜像,后续操作都是基于openjdk
挂载一个数据卷,这里因为没有名称,所以是一个默认的数据卷
添加一层镜像到当前镜像,这里就是添加SpringBootTest镜像到当前层,并改名app.jar
暴漏端口,因为我们的自己的端口是8003,所以我们暴漏8003
设定容器启动时第一个运行的命令及其参数,这里就是容器以启动就执行 java -jar/app.jar
docker bulid -t 仓库名/镜像名:tag
打包镜像后docker image查看镜像 然后docker run这个镜像就可以了启动了。
Docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即写时复制。这样效率过低为了避免写时复制需要添加存储卷
卷是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某个目录绑定
Docker管理宿主机文件系统的一部分,默认在/var/lib/docker/volumes 目录中
Bind mounts模式和Volumes非常相似,不同点在于Bind mounts模式是将宿主机上的任意文件或文件夹挂载到容器,而Volumes本质上是将Docker服务管理的一块区域挂载到容器。
运行容器时 -v 指定挂载路径。
Volumes是docker文件系统管理。bind是服务器自己管理。
docker使用linux桥接(依据OSI网络模型的链路层的地址,对网络数据包进行转发)在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信
比较少用服务器的端口很珍贵
比较少用,借助容器的网络
不需要网络连接
跨主机网络,多台主机跨主机通信的时候使用这个网络模式通信
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
比如我们一台服务器上有docker构建的微服务与docker构建的mysql常规docker通信:
docker中微服务网卡 – 宿主机网卡 – docker中mysql网卡
使用桥接后:
docker中微服务网卡 – docker中mysql网卡
创建网桥:docker network create demo
docker启动nacos接入网桥 docker run --network+创建的网桥
docker启动mysql接入网桥 docker run --network+创建的网桥
配置文件配置的时候直接配置名字就可以docker会帮我们填充ip地址
宿主机中的多个docker内部互通,宿主机对外暴露端口。
生产中高并发的组件尽量不要用docker来安装。
主要用来管理和发布容器。没有docker镜像仓库,多台服务器我们一个个复制有了仓库后打包完成后直接push上传仓库 其他服务器使用直接pull就ok了。
docker login 输入用户名密码登录docker仓库 没有用户需要去dockerhub官网注册。
docker registry 就是管理 docker 镜像的服务。没有图形化管理界面
harbor相对于registry就强大很多,它有图形化管理界面基于角色的访问控制,日志审计并提供基本运维操作。基于registry2次包装。推荐这种仓库管理方式。
Jib插件可以不写Dockerfile就能实现Docker打包可以直接集成到 Maven 和 Gradle中 只需要将插件添加到构建中,就可以立即将Java 应用程序容器化。
编排指的是容器的集群化和调度,也泛指的是容器管理,负责管理容器化应用和组件任务
适合单机环境的容器编排,不太适合集群
由一组关联的应用容器组成的一个完整业务单元
指的就是docker容器
在项目文件夹下创建 docker-compose.yml文件
在文件中声明配置包括需要哪些docker容器组件、桥接网络名称,以及组件的版本名称、容器名称、桥接网络、日志挂载目录、环境配置信息。
docker-compose up -d
容器信息:docker-compose ps
日志:docker-compose logs -f + 容器id
docker-compose down 结束容器并删除存储卷
docker-compose stop 只结束容器
大规模集群的容器编排,比较主流。服务器多的时候用
收费,在K8S基础上增加了一些功能
docker官方的集群化编排工具。使docker-compose支持集群化部署。安装docker就具备docker swam 如果服务器比较少用这个就可以。
管理节点docker swarm至少需要一个manager节点主要用来管理集群
启动容器的节点
通过在一个YAML文件中来定义一个stack里面多个service。
用Portainer来管理swarm集群。
使用swarm的networks要配置为overlay