Docker简介
Docker是2013年发行的一种容器技术。容器技术有什么用?我们知道,软件开发中最棘手的莫过于环境配置问题。很多时候,一个项目可以在我们的机器上跑了,但是其他人的机器由于环境配置、版本不兼容等问题,很难将项目移植到其他机器来运行。所以我们希望在将项目的打包的时候,能将当前的环境一并添加进去。
在Docker这类容器技术出现之前,虚拟机技术就是一种带环境安装的解决方案。但是虚拟机自身比较笨重,因为他需要独占一部分的内存和硬盘空间。在虚拟机运行的时候,这些资源就不能被其他进程使用了。而且虚拟机相当于虚拟化出一台机器,会涉及到很多系统级别的步骤(如用户登录),此外虚拟机速度很慢,因为他是和操作系统挂钩的。
为了解决虚拟机笨重的问题,容器技术应运而生。容器技术不是再模拟一个完整的操作系统,而是对进程进行隔离。每一个容器的开销小很多,不用给他们分配独立的内存和磁盘空间,而是直接使用宿主机内核。摒弃了操作系统级的虚拟化以后,容器就显得非常轻量级了,因为容器启动速度快(相当于进程而非os),占用资源少(只占用需要的资源,不用事先分配独享的资源),体积小(包含所需要的组件即可)。
Docker就是这样的一种容器技术。Docker将应用程序与该程序的依赖,打包到一个文件中,运行该文件就会生成一个虚拟容器。程序在此虚拟机上运行,给人感觉好像在真实的物理机上运行一样。有了Docker,就不用再担心环境问题。
Docker基本概念
镜像(image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像,可以类比于Maven仓库。
Docker常用命令
镜像相关
docker images # 列出本地images docker search mysql #搜索仓库MySQL镜像 docker pull redis # 下载Redis官方最新镜像,相当于:docker pull redis:latest docker rmi redis #单个镜像删除,相当于:docker rmi redis:latest docker rmi -f $(docker images -q) #删除本地全部镜像
cd /docker/dockerfile
vim mycentos
docker build -f /docker/dockerfile/mycentos -t mycentos:1.1
容器相关
docker run -i -t --name mycentos -p 9090:8080 -v /home:/usr/local #新建并启动容器,-i 以交互模式运行容器;-t 为容器重新分配一个伪输入终端;–name 为容器指定一个名称;-p 宿主机的端口映射到容器的端口;-v 容器数据卷(作用:数据持久化)的使用,将容器上的指定目录挂载到宿主机的目录,从而可以实现数据的同步(删除容器并不会删除其挂载的数据卷) docker run -d mycentos #后台启动容器,参数:-d 已守护方式启动容器 docker ps # 列出正在运行的容器 docker ps -a #列出所有容器(包括未运行的) docker start redis # 启动已经被停止的容器redis docker restart redis # 重启容器redis docker top redis # 列出redis容器中运行进程 docker logs rabbitmq #查看redis容器日志,默认参数 docker run -it centos /bin/bash #使用run方式在创建时进入 exit #关闭容器并退出 docker attach centos #直接进入centos容器启动命令的终端,不会启动新进程 docker exec -it centos /bin/bash #在centos容器中打开新的交互模式终端,可以启动新进程 docker inspect redis #获取镜像redis的元信息 docker stop redis #停止一个运行中的容器 docker kill redis #杀掉一个运行中的容器 docker rm -f redis #删除一个容器 docker cp rabbitmq:/[container_path] [local_path] #将rabbitmq容器中的文件copy至本地路径
Docker镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某 个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。 将所有的应用和环境,直接打包为docker镜像,就可以直接运行。
Docker镜像加载原理
- UnionFs (联合文件系统)
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的 用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
- 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等等。
- 平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才几百M?
对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用 Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致 的, rootfs会有差別,因此不同的发行版可以公用bootfs. 虚拟机是分钟级别,容器是秒级!
镜像分层
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载 。 容器分层的好处我认为是可以实现资源共享,例如有多个镜像都是从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层可以共享。
所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部。这一层就是我们通常说的容器层,容器之下的都叫镜像层。
容器数据卷
docker有一个问题,就是将容器删除的话,数据就会丢失。但我们需要数据的持久化,要将数据存储到本地。容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面。
使用如上:docker run 后面加 -v aaa:bbb 表示指定卷挂载的目录,aaa表示宿主机目录,bbb表示容器目录,这种方式为指定路径挂载。当然还有如下两种挂载方式:
具名挂载和匿名挂载
-v 容器内路径
-v 卷名:容器内路径
-v /宿主机路径:容器内路径
通过 docker volume ls 命令可以查看所有卷名。所有的docker容器内的卷,没有指定目录的情况下都是在宿主机 /var/lib/docker/volumes/xxxx/_data 目录下。
Reference:
https://www.bilibili.com/video/BV1og4y1q7M4?p=17&spm_id_from=pageDriver
https://www.cnblogs.com/DeepInThought/p/10896790.html
|