Docker介绍
产生背景
解决的核心问题“在不同的机器上运行”,其中的不用包括:操作系统、运行环境、应用配置。
Docker包含2方面技术:
镜像技术:镜像即应用
镜像包含:运行文档、配置环境、运行环境、运行依赖包、操作系统发行版、内核
理念
Docker基于go语言实现。
一次封装,到处运行
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker是什么
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker能干什么
之前的虚拟机技术
虚拟机:带环境安装的一种解决方案,可以在一种操作系统里面运行另外一种操作系统,使应用程序、操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:资源占用多、冗余步骤多、启动慢
容器虚拟化技术
Linux容器,不是一个完整的操作系统,而是对进程进行隔离,将软件运行所需的所有资源打包到一个隔离的容器种,与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置,因此变得更高效轻量并且保证部署在任何环境中都能始终如一地运行。
Docker与传统虚拟化方式的不同之处:
- 传统虚拟机时虚拟出一套硬件之后,在其上运行一个完整操作系统,再运行应用进程;
- 容器内的应用进程直接运行于宿主机的内核,容器没有自己的内核,也没有硬件虚拟,比传统虚拟机更轻便;
- 每个容器间互相隔离,每个容器有自己的文件系统,容器间的进程不会相互影响,能区分计算资源。
开发/运维(DevOps)
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
Docker三要素
镜像(image):一个只读模板,而已用来创建Docker容器,一个镜像可以创建多个容器
容器(container):Docker利用容器独立运行一个或一组应用,容器是用镜像创建的运行实例。可以被启动、开始、停止、删除。每个容器都是互相隔离的、保证安全的平台。
可以把容器看成一个简单版的linux环境(包括root用户权限、进程空间、用户空间和网络空间)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别:容器的最上面那一层是可读可写的。
仓库(repository):集中存放镜像文件的地方。
Docker本身是一个容器运行载体或者称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,打包好的运行环境就是image镜像文件。通过这个文件生成Docker容器。
Docker安装
window,官网安装Docker Desktop
helloworld镜像
docker run hello-world
run命令:项目后面没有版本号,则默认拉取latest版本,先找本地有没有对应的容器,没有的话找镜像,还是没有的话到远程仓库中拉取镜像。
Docker运行底层原理
Docker怎么工作:Docker是一个Client-Service结构的系统,Docker守护进程运行在主机上,然后通过Socket链接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器,是一个运行时环境。
为什么Docker比虚拟机快:
- Docker的抽象层比虚拟机少。Docker不需要Hypervisor实现硬件资源虚拟化,在Docker容器上的程序直接使用实际物理机的硬件资源。因此在CPU、内存利用率上Docker会在效率上有明显优势。
- Docker利用的时宿主机的内核,不需要Guest OS。因此,新建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。避免引寻、加载操作系统内核这个比较费时费资源的过程。虚拟机加载是分钟级的,Docker可以到秒级。
常用命令
Docker帮助命令
- docker version
- docker info
- docker help
Docker镜像命令
docker images [OPTIONS]:列出本地的镜像列表
- -a 列出本地所有的镜像
- -q 只显示镜像ID
- —digests 显示镜像的摘要
- —no-trunc 显示完整的镜像信息
docker search [OPTIONS] 某个XXX镜像名字:在 docker hub 中查找镜像
- —no-trunc 显示完整的镜像信息
- -s 列出收藏数不小于指定值的镜像
- —automated 只列出 automated build 类型的镜像
- docker pull 某个XXX镜像名字[:TAG]:下载镜像,TAG不填默认latest
- docker rmi [OPTIONS] 某个XXX镜像名字/ID [IMAGE…]:删除镜像
- -f 强制删除
- 删除多个:docker rmi -f IMAGE1:TAG IMAGE2:TAG
- 删除全部:docker rmi -f $(docker images -qa)
Docker容器命令
- docker run [OPTIONS] IMAGE [COMMAND] [ARG…]:新建并启动容器
- —name 容器新名称:为容器指定一个名称
- -d 后台运行容器,并返回容器id,即启动守护式容器
- Docker容器后台运行,就必须有一个前台进程
- 容器运行的命令如果不是那些一直挂起的名称(如:top、tail),就是会自动退出的。
- -i 以交互模式运行容器,通常与 -t 同时使用
- -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- -P 随机端口映射
- -p 指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containPort
docker ps [OPTIONS]:查看运行中的容器
- -a 列出当前所有正在运行的容器+历史上运行过的
- -l 显示最近创建的容器
- -n 显示最近n个创建的容器
- -q 静默模式,只显示容器编号
- —no-trunc 不截断输出
exit:进入容器终端后输入,容器停止退出
ctrl+P+Q:进入容器终端后,容器不停止退出
docker start [OPTIONS] CONTAINER [CONTAINER…]:启动容器
docker restart [OPTIONS] CONTAINER [CONTAINER…]:重启容器
docker stop [OPTIONS] CONTAINER [CONTAINER…]:停止容器,自然停止
docker kill [OPTIONS] CONTAINER [CONTAINER…]:杀掉容器,强制停止
docker rm [OPTIONS] CONTAINER [CONTAINER…]:删除容器
- -f 强制删除
- docker -f $(docker ps -a -q) 全部删除
- docker ps -a -q | xargs docker rm
docker logs [OPTIONS] CONTAINER:查看容器的日志
- -t 加入时间戳
- -f 跟随最新的日志打印
- —tail 数字:显示最后多少条
docker top CONTAINER [ps OPTIONS]:查看容器内运行的进程
docker inspect [OPTIONS] NAME|ID [NAME|ID…]:查看容器内部细节
docker attach [OPTIONS] CONTAINER:直接进入容器启动命令终端,不会启动新的进程
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]:在容器中打开新的终端,并且可以启动新的进程
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-:从容器内拷贝文件到主机
- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH:从主机拷贝文件到容器内
Docker镜像
Docker镜像原理
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统)
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特征:一次性同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
BootFS(Boot File System)主要包含BootLoader和Kernel,BootLoader主要是引导加载Kernel,Linux刚启动时会加载BootFS文件系统,在Docker镜像的最底层是BootFS。这一层与我们典型的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发行版,BootFS基本是一直的,RootFS会有差别,因此不同的发行版可以共用BootFS。
分层的镜像
以pull为例,在下载的过程中,我们可以看到docker的镜像好像是在一层层的在下载。
为什么要采用这种分层结构?
最大的好处:共享资源
有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
特点
Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作为“容器层”,“容器层”之下的都叫“镜像层”。
Docker镜像commit
docker commit 提交容器副本使之成为一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-m 提交时的描述信息
-a 提交者
Docker容器数据卷
是什么
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在Docker中,我们使用卷。有点类似Redis里面的rdb和aof文件。
能干嘛
容器的持久化
容器间继承+共享数据
数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供的一些用于持久存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可在容器间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 带权限,卷只读
DockerFile添加
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
以具有容器卷的镜像为模板,运行多个容器,进行容器间传递共享(—volumes-from)
docker run -it —volumes-from 父容器 镜像名
Docker File是什么