文章目录
1、理念
一次封装,处处运行。解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
2、docker和传统虚拟机的不同
- 传统虚拟机技术是虚拟出一套硬件之后,在其上运行一个完整操作系统,在操作系统上再运行所需应用进程。
- 而容器内的应用进程直接运行与宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
3、DevOps 开发/运维(开发自运维,一次开发,随处运行)
好处:
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
4、三要素
- 镜像: docker镜像就是一个只读模板。镜像可以用来创建docker容器,一个镜像可以创建很多容器。
- 容器:docker运用容器Container独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一对层的统一视角,唯一的区别在于容器的最上面那一层是可读可写的。
- 仓库Repository:是集中存放镜像文件的场所。
5、Docker底层原理
- docker是一个Client-Server结构的系统,docker守护进程运行在主机上,然后通过Socket链接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时环境。
- docker 为什么比vm快?
- docker 有着比vm更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此CPU、内存利用率上docker效率会更高。
- docker利用的是宿主机的内核,而不需要Guest OS。因此当新建一个容器时,docker不需要像vm一样重新加载一个操作系统内核。
| 指标* | DOCKER容器 | 虚拟机VM |
| — | — | — |
| 操作系统 | 与宿主机共享OS | 宿主机OS上运行虚拟机OS |
| 存储大小 | 镜像小,便于存储运输|镜像大 |
| 运行性能 | 几乎无额外性能损耗|操作形同额外的CPU、内存损耗 |
| 移植性 | 轻便、灵活、适应于Linux | 笨重,与虚拟技术耦合度高 |
| 硬件亲和性 | 面向软件开发者 | 面向硬件运维 |
| 部署速度 | 快速、秒级 | 较慢,10S以上 |
6、Docker帮助命令
- docker vision
- docker info
- docker --help
7、镜像命令
- docker images *列出主机上的镜像
- docker search 镜像名称 *在dockerhub上查找镜像
- docker pull 镜像名称 *下载镜像,等价于docker pull 镜像名称:latest
- docker rmi 镜像名称 *删除镜像
8、容器命令
- docker run *新建并启动容器
- –name=“容器新名字”:为容器指定一个名称
- -d:后台运行容器,并返回容器ID,也即启动守护式容器;
- -i:已交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
- -P:随机端口映射
- -p:指定端口映射,有一下四种方式 ip:hostPort:containerport/ip::containerport/hostPort:containerport/containerport
- docker ps *列出当前所有正在运行的容器
- 退出容器
- exit *容器停止退出
- ctrl+P+Q *容器不停止退出
- 启动容器
- docker start 容器ID
- 重启容器
- docker restart 容器ID
- 停止容器
- docker stop 容器ID
- 强制停止容器
- docker kill 容器ID
- 删除已停止的容器
- docker rm 容器ID
- docker logs -f -t --tail 容器ID *查看容器日志
- docker top 容器ID *查看容器内运行的进程
- docker inspect 容器ID *查看容器内部的细节
- *进入正在运行的容器并以命令行交互
- docker attach 容器ID *直接进入容器启动命令终端,不会启动新的进程
- docker exce -it 容器ID *在容器中打开新的终端,并且可以启动新的进程
- docker cp 容器ID:容器内路径 目的主机路径 *从容器中拷贝文件
9、镜像原理
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
- UnionFS 联合文件系统:Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。union文件系统是docker镜像的基础。镜像可以通过封层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层的文件和目录。
- Docker 镜像的加载原理:docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们经典的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时的内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs.
- 镜像特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称之为容器层,容器层之下都被称之为镜像层。
- docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名] *提交容器副本使之成为一个新的镜像
10.docker容器数据卷
- 作用:容器的持久化、容器间继承和数据共享。
- docker run -it -v /myDataVolume:/dataVolumeContainer 镜像名 * /myDataVolume 是宿主机目录, /dataVolumeContainer 是容器内的目录,两个目录内的数据双向绑定。
- 给目录设定访问权限,例如:
- docker run -it -v /myDataVolume:/dataVolumeContainer:ro 镜像名 *容器内的目录只有只读权限
- 也可以通过dockerfile来实现,例如:
- 给目录设定访问权限,例如:
FROM centos
VOLUME ["/dataVolumeContaimer1", "/dataVolumeContaimer2"]
CMD echo "finished , ....succ"
CMD /bin/bash
- –volume-from 容器间通讯
- docker run -it --name dc02 --volume-from dc01 zzyy/centos *有继承关系的容器间,数据卷均会双向绑定
11、dockerfile
11.1、what
dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。构建docker镜像三步骤:编写dockerfile文件-》build-》run
- 每条保留字指令都必须为大写字母,且后面至少跟随一个参数
- 指令按照从上到下顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
11.2、docker执行dockerfile的流程
- docker从基础镜像运行一个容器;
- 执行一条指令并对容器进行修改;
- 执行类似docker commit的操作提交一个新的镜像层;
- docker在基于刚提交的镜像运行一个新的容器;
- 执行dockerfile中的下一条指令直到所有指令执行完。
11.3、保留字指令
- FROM: 基础镜像,当前新镜像是基于哪个镜像的。Base镜像scratch,dockerhub中大多数镜像都是通过base镜像中安装和配置主要的软件构建出来的
- MAINTAINER: 作者以及作者邮箱
- RUN:容器构建时需要运行的命令
- EXPOSE:当前容器对外暴露的端口
- WORKDIR: 指定在创建容器后,终端默认登录进来的工作目录
- ENV:用来在构建镜像过程中设置环境变量
- ADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY: 类似ADD,拷贝目录和文件到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目的路径>位置
- VOLUME: 容器数据卷,用于数据保存持久化工作
- CMD: 指定一个容器运行时要运行的命令; Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD 会被docker run之后的参数替换
- EMTRYPOINT:指定一个容器运行时要运行的命令;
- ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发