
镜像(image):
容器(container):
仓库(repository):
环境准备
需要linux基础
Centos7
使用软件进行远程连接
环境查看
安装
帮助文档
登录阿里云找到容器服务
找到镜像加速的地址
配置应用
docker是怎么工作的?
Docker 是一个client-server 结构的系统,Docker的守护进程运行在主机上,通告Socker从客户端访问
Dokcer server 接收到Docker-client 的指令,就会执行这个命令
Docker为什么比虚拟机快
Docker有着比虚拟机更少的抽象层
Docker 利用的是宿主机的内核,VM需要Guest OS
所以,新建一个容器的时候,Docker不需要虚拟机一样重新加载一个操作系统的内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级
说明:我们有了镜像才可以创建容器,Linux,下载一个centos 镜像来测试学习
使用kibana连接es,思考网络如何才能连接过去
portainer(先用这个)
Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具,提供一个后台面板供我们操作
访问测试:http://ip:8080
镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软
件所需的所有内容,包括代码、运行时库、环境变量和配置文件
所有的应用,直接打包docker镜像,就可以直接跑起来
远程仓库下载
其他人拷贝给你
自己制作一个镜像dockerfile
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对
文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite
several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层
来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起
来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
boots(boot file system)
主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。
这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。
当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system) 在 bootfs之上。
包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。
对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。
由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs.
虚拟机是分钟级别,容器是秒级!
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。
实战测试
如果想要保存当前容器的状态,我们可以通过commit来提交,获得一个镜像,类似于虚拟机的快照
docker的理念回顾
将应用和环境打包成一个镜像
如果数据都在容器中,那么删除容器,数据就会丢失! 需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!!目录的挂载,将我们容器内的目录,挂载到Linux上面
好处:
我们以后修改只需要在本地修改即可,容器内自动同步!
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的是具名挂载
Dockerfile就是用来构建docker镜像的构建文件、命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层
这个卷和外部有一个同步的目录
查看一下挂载的路径
测试一下刚才的文件是否同步
这种方式之后使用的很多,因为 通常我们会构建自己的镜像
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
多个mysql同步数据
多个mysql实现数据共享
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦持久化到了本地,这个时候本地的数据是不会删除的
dockerfile是用来构建docker镜像的文件,命令参数脚本
编写一个dockerfile文件
docker build构建成为一个镜像
docker run 运行镜像
docker push 发布镜像(docker hub,阿里云镜像仓库)
很多官方镜像都是基础包,很多功能都没有,我们通常自己搭建自己的镜像
每个保留关键字(指令)都必须是大写字母
从上到下顺序执行
表示注释(#)
每个指令都会创建提交一个新的镜像,并提交
Dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件
Docker镜像逐渐成为企业交付的标准
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockerimages:通告Dockerfile构建生成的镜像,最终发布运行的产品
Docker容器:容器就是镜像运行起来提供服务
Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
我们可以通过 docker history+镜像id 列出本地镜像的变更历史
我们平时拿到一个镜像,可以研究一下他是怎么做到的
发布项目
提交的时候也是按照镜像的层级来进行提交的
https://hub.docker.com 注册自己的账号
确定这个账号可以登录
在我们服务器上提交自己的镜像
登录完毕之后就可以提交镜像了,docker push
登录阿里云
找到容器镜像服务
创建命名空间
创建容器镜像
浏览阿里云
阿里云容器镜像的就参考官方地址
三个网络
我们每启动一个docker容器,docker就会给docker容器分配一个ip ,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是 evth-pair技术
再次测试ip addr
再启动一个容器测试,发现又多了一对网卡
我们测试 tomcat01 和 tomcat02 可以ping通
结论: tomcat01 和 tomcat02 是共用的一个 docker0
所有的容器不指定网络的情况下,都是通过docker0通信的,docker会给我们的容器分配一个默认的可用IP
Docker使用的是Linux的桥接,宿主机中是一个Dokcer容器的网桥 docker0
Dcoker中的所有的网络接口都是虚拟的,虚拟的转发效率高
只要容器删除,对应网桥一对就都没了
场景:编写了一个微服务,项目不重启,数据库 IP 换掉了,如何用名字来进行访问容器
探究:inspect
--link 就是在我们hosts配置中增加了一个 172.18.0.3 tomcat02 312857784cd4
现在已经不建议使用 --link 了
docker0的问题:不支持容器名连接网络
查看所有的docker 网络
网络模式:
bridge:桥接(默认)
测试:
自定义一个网络
自定义的网络 docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
redis:不同的集群使用不同 的网络,保证集群是安全和健康的
mysql:不同的集群使用不同的网络,保证集群是安全和健康的
结论:假设要跨网络操作别人,就需要使用docker network connect 连通