简介
docker的一些知识点的总结
UnionFS
分层,轻量级,高性能的文件系统,支持一层层的叠加功能来修改文件系统。
一次同时加载多个文件系统,把各层文件系统叠加起来,最终文件系统会包含所有底层的文件和目录,这对于外部来说,是一个叠加起来的文件系统。
docker原理
docker镜像的基础就是unionfs文件系统,镜像可以通过分层来继承,基于基础镜像,制作各种具体的应用镜像。
docker镜像最底层是引导文件系统bootfs,它包含boot加载器和内核。
在bootfs层之上是rootfs,它就是各种不同的操作系统的发行版,如centos。
docker镜像层都是只读的,容器层是可写的。
当一个容器启动时,一个新的可写层被加载到镜像的顶部,这个可写层就是容器层。
镜像分层的好处
共享资源,方便复制迁移,复用
在镜像中,每一层都可以被共享。
docker commit
docker commit -m=“提交信息” -a=“作者” 容器id 创建的目标镜像名 标签名:提交容器副本让它成为一个新的镜像。
可以通过这个命令,在原来的镜像上,叠加层,给镜像添加新的功能(每层都是新的功能),然后创建出带有新的功能的镜像。
注意:
在命令中,是容器id,也就是说,要先通过原来的镜像,创建出容器,在容器上添加新的功能,然后执行commit命令,就会生成一个新的镜像。
容器数据卷
卷,即目录或者文件,由docker挂载到容器,设计的目的是数据的持久化,完全独立于容器的生存周期,因此docker删除的时候,其挂载的容器卷不会被删除。
容器卷是指在宿主机上的一个目录或文件,被映射到容器中的一个目录,从而实现宿主机和容器之间的数据共享和持久化存储。
使用
docker run -it --privileged=ture -v /宿主机绝对路径目录:/容器内目录 镜像名:运行一个带有容器卷存储功能的容器
参数:
- –privileged=true:可以使容器内的root拥有真正的root权限
- ro:容器只读不能写,适用于多个容器映射同一个数据卷时
可以通过 docker inspect 容器id输出的信息中的mounts中查看
作用
容器数据卷的作用:
- 可以在容器之间共享或重用数据
- 卷中的数据更改可以直接实时生效
- 数据卷的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
就算容器stop停止了,在挂载的容器数据卷中修改文件目录,然后容器启动,docker中的数据也会更新。
卷的继承和共享
新启动的容器可以继承一个容器的卷规则。
docker run -it --privileged=true --volumes-from 父类容器名 --name 容器名 镜像名
使用后类似于共享一个宿主机的数据卷。
期间,如果父类容器停止了,新的容器挂载容器卷也是没有影响的。
dockerfile
dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
dockerfile定义了进程需要的一切东西,包括执行代码或文件,环境变量,依赖包,运行时环境,动态链接库,操作系统的发行版,服务进程和内核进程等等。
基本知识点
- 每条保留字指令都必须大写,后面至少要带一个参数
- 指令从上到下顺序执行
- #是注释符
- 每条指令都会创建一个新的镜像层并对镜像进行提交
常用的保留字指令
FROM
源头是什么,即当前新镜像是继承哪个基础父类,指定一个已经存在的镜像作为模板,放在第一行。
MAINTAINER
镜像维护者的姓名和邮箱
RUN
容器构建的时候运行的命令,即在docker build时运行。
EXPOSE
当前容器对外暴露出的端口
WORKDIR
指定在创建容器后,终端登录进来时的默认工作目录
USER
指定该镜像以什么样的用户去执行,默认是root
ENV
在构建镜像过程中设置环境变量,类似于dockerfile中的变量
ADD
将宿主机目录下的文件拷贝进容器,会自动处理URL和解压tar包
COPY
类似于ADD,拷贝文件和目录到镜像中
一般ADD比较常用
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定容器启动后要干的事。和RUN相似。
可以有多个CMD指令,但只有最后一个生效,而且会被docker run命令后面的参数替换。
RUN是在docker build构建镜像的时候运行
CMD是在docker run的时候运行
变参使用CMD,和entrypoint一起使用的时候,CMD是等于给entrypoint传参的。
简单的理解,就是,docker run的时候,如果没有指定参数,那么cmd里面的内容就会传递给entrypoint;docker run的时候,如果加了参数,那么会替换cmd里面的内容,然后传递给entrypoint。
ENTRYPOINT
也是用来指定容器启动时要运行的命令
类似于CMD指令,但不会被docker run命令后面的参数替换。并且这些参数会被ENTRYPOINT指令指定的程序当成参数。
虚悬镜像
仓库名,标签都是< none >的镜像,可能有风险的,一般要删掉
docker image ls -f dangling=true
:可以查询出虚悬镜像
docker image prune
:可以删除虚悬镜像
部署微服务
如果公司使用云原生技术,即一切在云端,处处皆容器。那么使用springboot开发的项目,然后通过dockerfile发布微服务部署到docker容器。
打包成jar包
使用maven的package命令把微服务打包成jar包。
上传jar包
把微服务的jar包上传到服务器
编写Dockerfile
FROM java:8
MAINTAINER christ
VOLUME /tmp
ADD spring_boot_docker-0.0.1-SNAPSHOT.jar christ.jar
RUN bash -c 'touch /christ.jar'
ENTRYPOINT ["java","-jar","/christ.jar"]
EXPOSE 8801
构建镜像
docker build -t christ_docker:1.1
:构建一个名为christ_docker:1.1的镜像
运行容器
docker run -d -p 8801:8801 christ_docker:1.1
:启动容器。
docker 网络
开启docker服务后,默认创建3大网络模式
docker network ls
:查看网络
其他的网络相关命令:
docker network inspect 网络名:查看网络源数据
docker network rm 网络名:删除网络
docker 网络的作用
- 容器间的互联和通信以及端口映射
- 容器ip变动时可以通过服务名直接网络通信而不受影响
docker常用的网络模式
- bridge:为每一个容器分配,设置ip等,并将容器连接到一个docker0,虚拟网桥,默认模式。使用–network bridge指定
- host:容器不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的ip和端口。使用–network host指定
- none:容器有独立的network namespace,但并没有对其进行任何网络设置。使用–network none指定
- container:新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip,端口范围等。使用–network container:容器id指定
docker容器内部的ip有可能会变化,如果乱了,那调用可能会出错,所以需要我们去规划网络。
自定义网络模式
通过docker network create 网络模式名
来自定义桥接网络,默认使用的是桥接网络bridge,启动容器的时候通过--network 自定义网络模式名
参数指定网络模式,容器之间的调用就可以通过服务名来调用了(这样,就算容器内部ip变化,也可以调用而不会出错),因为自定义网络本身就维护了主机名和ip的对应关系。
注意:如果启动容器的时候直接指定bridge模式的话,是不可以使用服务名来调用的。
docker compose
docker compose,负责实现对docker容器集群的快速编排。
可以管理多个docker容器组成的一个应用,需要定义一个yaml的配置文件docker-compose.yml,写好多个容器(即服务)之间的调用关系,就可以一次性启动或关闭这些容器。
需要下载docker compose,然后更改执行权限。
compose常用命令
docker-compose up:启动所有docker-compose服务
docker-compose up -d:启动所有docker-compose服务并后台运行
docker-compose down:停止并删除容器,网络,数据卷等
docker-compose ps:展示docker-compose编排过得运行的所有容器
docker-compose top:展示docker-compose编排过容器进程
docker-compose logs yuml服务id:查看容器日志
docker-compose config:检查配置
docker-compose config -q:检查配置,有问题输出
docker-compose restart:重启服务
docker-compose start :启动服务
docker-compose stop:停止服务
注意:这些命令最好在docker-compose.yml目录路径下去执行,在服务不多的时候(10个左右)可以使用这个,再更多服务的话就要使用k8s了。
portainer
管理docker环境的图形化界面工具。方便我们对docker单机或者集群的管理,监控和统计。
– restart=always
docker run指令后面的参数,加上 – restart=always参数,可以让这个容器服务在docker启动的时候跟着启动。
CIG
重量级的docker监控工具,有点类似于elk,注重于监控docker的运行时的环境(cpu,内存,io等)的监控。
类似于docker status命令展示的信息,但是docker status的数据是实时的,没有地方存储数据,没有健康预警功能。
CIG是三个工具的组合:
- CAdvisor监控收集数据
- InfluxDB存储数据
- Granfana页面展示
不过现在这两个监控都有点过时了,一般是使用k8s了的。