Docker技术学习笔记1——容器技术概览

Dcoker技术简介

先谈谈虚拟机技术,在一个硬件资源上虚拟出多个操作系统,并且可以虚拟出与原本操作系统不同的系统,如在windows系统中使用虚拟机虚拟出Linux系统,构建出的每一个虚拟机都包含完整的操作系统,在上面可以完全相当于使用一个新的机器。但是也由于是创建完整的系统,会占用大量资源如内存存储空间、内存……,同时在启动速度上也比较慢,要在虚拟机上运行一个程序,需要先启动虚拟机,再启动该程序。
在这里插入图片描述

相比之下,容器技术解决了这些难点,占用更少的资源,不需要完整的创建新的操作系统,容器运行时共用同一个操作系统,只隔离应用程序的运行时环境,这里的运行时环境指的是程序运行依赖的各种库以及配置,同时可以几乎瞬间启动,容器可以实现无论在如何的硬件系统上,只要运行起来就可以达成一样的效果,目前容器可以支持在Windows、Linux与Macos上运行,但其中运行的应用程序必须是基于Linux的。
在这里插入图片描述

Docker中的三个基本概念:

Image:可执行程序,可以自己构建,也可以从网上拉取(docker pull),就好像在应用市场中下载一样
Container:运行起来的应用程序(docker run)
Dockerfile:image的源代码,需要在这里指定image的运行需要那些程序、依赖那些配置,而docker相当于编译器,将dockerfile交给docker编译后(docker build命令),就能生成可执行程序image

Docker如何工作
Docker使用了常见的client-sever架构,docker client接收用户的各自命令,然后将其转给sever也就是docker demon,docker demon根据命令执行相应操作。
Docker bulid:
在这里插入图片描述

Docker run:
在这里插入图片描述

Docker pull:
在这里插入图片描述

Docker实现底层:
Docker基于linux提供的两个功能实现完成了不同容器的隔离。
其一是NameSpace,一种资源隔离方案,不同NameSpace下的PID、IPC、网络资源等相互隔离,每个NameSpace相当于一个独立的操作系统。
其二是Control groups,可以控制进程对CPU、内存、磁盘、网络等资源的访问,限制某个容器可以使用的内存、使用的CPU。

Dockerfile

(https://www.jianshu.com/p/cbce69c7a52f)
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,每条指令对应Linux下面的一条命令,Docker程序将这些指令翻译为真正的Linux命令,Dockerfile有一定的书写格式,当需要对image进行更改时,只需要修改dockerfile文件再重新生成image。

Dockerfile的书写规则及指令使用方法

Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

例子

• FROM:指定基础镜像
• MAINTAINER:镜像维护者姓名及邮箱地址
• RUN:容器构建时需要运行的命令
• EXPOSE:当前容器对外暴露的端口号
• WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
• ENV:用来在构建镜像过程中设置环境变量
• ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
• COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中<src原路径>的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY [“src”, “dest”]
• VOLUME:容器数据卷,用于数据保存和持久化工作
• CMD:指定一个容器启动时要运行的命令
• 注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
• CMD指令的格式和RUN相似,也是两种格式:
o shell格式:CMD <命令>
o exec格式:CMD [“可执行文件”, “参数1”, “参数2” …]
o 参数列表格式:CMD [“参数1”, “参数2”, …],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
• ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
• ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。
在这里插入图片描述

Dockerfils最佳实践注意事项

Dockerfile 的最佳实践
(https://juejin.cn/post/7099248266524983327)
• 使用.dockerignore文件
为了在docker build过程中更快上传和更加高效,应该使用一个.dockerignore文件用来排除构建镜像时不需要的文件或目录。例如,除非.git在构建过程中需要用到,否则你应该将它添加到.dockerignore文件中,这样可以节省很多时间。
• 避免安装不必要的软件包
为了降低复杂性、依赖性、文件大小以及构建时间,应该避免安装额外的或不必要的包。例如,不需要在一个数据库镜像中安装一个文本编辑器。
• 每个容器都跑一个进程
在大多数情况下,一个容器应该只单独跑一个程序。解耦应用到多个容器使其更容易横向扩展和重用。如果一个服务依赖另外一个服务,可以参考链接: Linking Containers Together
• 最小化层
我们知道每执行一个指令,都会有一次镜像的提交,镜像是分层的结构,对于 Dockerfile,应该找到可读性和最小化层之间的平衡。
• 多行参数排序
如果可能,通过字母顺序来排序,这样可以避免安装包的重复并且更容易更新列表,另外可读性也会更强,添加一个空行使用 \ 换行:

RUN apt-get update && apt-get install -y
bzr
cvs
git
mercurial
subversion

• 创建缓存
镜像构建过程中会按照 Dockerfile 的顺序依次执行,每执行一次指令 Docker 会寻找是否有存在的镜像缓存可复用,如果没有则创建新的镜像。如果不想使用缓存,则可以在docker build 时添加–no-cache=true选项。
从基础镜像开始就已经在缓存中了,下一个指令会对比所有的子镜像寻找是否执行相同的指令,如果没有则缓存失效。在大多数情况下只对比 Dockerfile 指令和子镜像就足够了。ADD 和 COPY 指令除外,执行 ADD 和 COPY 时存放到镜像的文件也是需要检查的,完成一个文件的校验之后再利用这个校验在缓存中查找,如果检测的文件改变则缓存失效。RUN apt-get -y update命令只检查命令是否匹配,如果匹配就不会再执行更新了。
为了有效地利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改。

Dockerfile构建image的教程与例程

链接: 两个dockerfile小教程
链接: 五个实战项目

Image 、Dockerfile 与 docker-compose的区别

Dockerfile是构建一个镜像的,而docker run启动单个容器,docker-compose是涉及多个容器运行。

不使用dockerfile,直接拉取image的方法快捷,但image一般较大,而只分享image的话也不知道其中包含什么,不利于分享与复用,而dockerfile就是一个制作镜像全过程的脚本,可以知道image中到底有什么,可以进行更改与扩展。

而有些项目不是只运行一个容器就可以,需要运行多个容器合作解决问题,docker-compose就是解决这个问题,编写docker-compose.yaml文件,其中记载着项目需要那些镜像,每个镜像怎么配置,要挂载那些volume等等。很多情况下都需要多个镜像来完成,所以要使用docker-compose。

docker指令docker指令详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月早十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值