简单了解 Docker

149 阅读6分钟

Docker简介

为什么会有Docker的出现

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。

Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。

环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

简单来说,一个项目需要的环境有很多(MySQL、Redis、Java、Tomcat等等),你可以把所有的这些环境包括整个系统都打包起来,放到Docker上,其他人只需要完成代码的编写,然后封装成jar包,从Docker上把整个环境下载下来然后把jar包放到环境下运行即可。

Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

Docker的理念

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

容器虚拟化技术

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

Docker容器的优势

  1. 更快速的应用交付和部署
  2. 更便捷的升级和扩缩容器
  3. 更简单的系统运维
  4. 更高效的计算机资源利用

Docker的基本组成

  1. 镜像:就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器
  2. 容器:独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
  3. 仓库:集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等

Docker常用命令

docker version:查看docker的版本

docker info:查看docker的状态

docker help:docker 常用命令的介绍

docker images:列出本地主机的镜像

  1. REPOSITORY:表示镜像的仓库源
  2. TAG:镜像的标签
  3. IMAGE ID:镜像ID
  4. CREATED:镜像创建时间
  5. SIZE:镜像大小

docker images -a/-q/-digests/-no-trunc:加上不同的OPTIONS

docker search 【镜像名】:列出仓库中的所有带有redis的镜像,并排序 docker search 【OPTIONS】【镜像名】

docker pull 【镜像名字】:下载STARS最高的镜像

docker pull 【镜像名字】:【Tag】:可以规定需要下载的版本号

docker rmi -f 【镜像的 IMAGE ID】:删除对应的镜像

docker rmi -f 【镜像的 IMAGE ID】 【镜像的 IMAGE ID】:删除多个镜像

docker rmi -f ${docker images -qa}:删除全部镜像

  • 有镜像才能创建一个容器这是前提

docker run 【镜像名称】:创建并启动一个容器

docker run 【镜像名称】/bin/bash:以交互模式启动一个容器,在容器内执行/bin/bash命令。

docker ps:列出所有正在运行的容器

docker stop 【容器的IMAGE ID】:停止容器

docker start 【容器的IMAGE ID】:启动容器

docker restart 【容器的IMAGE ID】:重新启动容器

docker exec/attach 【容器的IMAGE ID】:进入容器进行操作

docker exec -it 【容器的IMAGE ID】/bin/bash:常用的进入容器命令

docker rm -f 【容器的IMAGE ID】:删除启动的容器

Docker镜像

  • docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

最大的一个好处就是 - 共享资源

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

docker commit 【容器IMAGE ID】:提交容器副本使之成为一个新的镜像。

Docker数据卷

  • 类似于我们Redis中的AOF或者RDB文件,可以实现容器的持久化。

docker run -it -v /宿主机的绝对路径:/容器内目录 镜像名

docker inspect 容器ID:查看挂载信息

可以使我们再主机的路径中添加文件,容器内也可以接收到。并且当容器停止期间,再主机的路径中修改的文件容器也可以接收到

DockerFile解析

  • DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

  • 构建步骤

  1. 编写dockerFile文件
  2. docker build
  3. docker run