龙空技术网

Docker到底是什么?有什么用?看看你们公司能不能用到

51面试官 400

前言:

现在姐妹们对“dockerfile有什么用”大体比较重视,各位老铁们都需要分析一些“dockerfile有什么用”的相关资讯。那么小编同时在网摘上搜集了一些对于“dockerfile有什么用””的相关知识,希望同学们能喜欢,看官们一起来了解一下吧!

Docker是什么?

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

举个栗子,小明写了一个CMS体系,该体系的技能栈十分广,需求依赖于各种开源库和中间件。假如按照纯手动的布置办法,小明需求装置各种开源软件,还需求写好每个开源软件的装备文件。假如仅仅布置一次,这点时刻开销还是能够接受的,但假如小明每隔几天就需求换个服务器去布置他的程序,那么这些繁琐的重复作业无疑是会令人发狂的。这时候,Docker的用处就派上场了,小明只需求根据运用程序的布置步骤编写一份Dockerfile文件(将装置、装备等操作交由Docker自动化处理),然后构建并发布他的镜像,这样,不论在什么机器上,小明都只需求拉取他需求的镜像,然后就能够直接布置运转了,这正是Docker的魅力地点。

那么镜像又是什么呢?镜像是Docker中的一个重要概念:

Image(镜像):它类似于虚拟机中运用到的镜像,由于任何运用程序都需求有它自己的运转环境,Image便是用来供给所需运转环境的一个模板。Container(容器):Container是Docker供给的一个笼统层,它就像一个轻量级的沙盒,其间包含了一个极简的Linux体系环境与运转在其间的运用程序。Container是Image的运转实例(Image本身是只读的,Container启动时,Docker会在Image的上层创立一个可写层,任何在Container中的修正都不会影响到Image,假如想要在Image保存Container中的修正,Docker采用了根据Container生成新的Image层的策略),Docker引擎运用Container来操作并阻隔每个运用(也便是说,每个容器中的运用都是相互独立的)。

其实从Docker与Container的英文单词本意中就能够体会出Docker的思维。Container能够释义为集装箱,集装箱是一个能够便于机械设备装卸的封装货品的通用规范标准,它的发明简化了物流运送的机械化进程,使其建立起了一套规范化的物流运送体系。而Docker的意思为码头工人,能够认为,Docker就像是在码头上辛勤作业的工人,把运用打包成一个个具有某种规范化标准的"集装箱"(其实这儿指出的集装箱对应的是Image,在Docker中Container更像是一个运转中的沙盒),当货品运送到目的地后,码头工人们(Docker)就能够把集装箱拆开取出其间的货品(根据Image来创立Container并运转)。这种规范化与阻隔性能够很方便地组合运用多个Image来构建你的运用环境(Docker也发起每个Image都遵循单一责任原则,也便是只做好一件事),或者与其别人同享你的Image。

Docker VS 虚拟机

在上文中咱们提到了Docker是根据轻量级虚拟化技能的,所以它与咱们平常运用的虚拟机是不一样的。虚拟机技能能够分红以下两类:

体系虚拟机

体系虚拟机:经过软件对计算机体系的模拟来供给一个实在计算机的替代品。它是物理硬件的笼统并供给了运转完整操作体系所需的功能。虚拟机经过物理机器来管理和同享硬件,这样完成了多个虚拟机环境彼此之间的阻隔,一台机器上能够运转多个虚拟机,每个虚拟机包含一个操作体系的完整副本。在体系虚拟机中,所运转的一切软件或操作都只会影响到该虚拟机的环境。咱们常常运用的VMWare便是体系虚拟机的完成。程序虚拟机:答应程序独立运转在渠道之外。比较典型的比如便是JVM,Java经过JVM这一笼统层使得Java程序与操作体系和硬件渠道解耦(由于每个Java程序都是运转在JVM中的),因而完成了所谓的compile once, run everywhere。

Docker所用到的技能与上述两种都不相同,它运用了更轻量级的虚拟化技能,多个Container同享了同一个操作体系内核,而且就像运转在本地上一样。Container技能相对于虚拟机来说,仅仅一个运用程序层的笼统,它将代码与依赖联系打包到一同,多个Container能够在同一台机器上运转(意味着一个虚拟机上也能够运转多个Container),并与其它Container同享操作体系内核,每一个Container都在用户空间中作为一个独立的进程运转,这些特性都证明了Container要比虚拟机更加灵敏与轻量(一般都是结合虚拟机与Docker一同运用)。

Container技能其实并不是个新鲜事物,最早能够追溯到UNIX中的chroot(在1979年的V7 Unix中引进),它能够改变当前正在运转的进程及其子目录的根目录,在这种修正过的环境下运转的程序不能在指定的目录树之外拜访文件,从而约束用户的活动范围,为进程供给了阻隔空间。

之后各种Unix版别涌现出许多Container技能,在2006年,Google提出了"Process Containers"希望在Linux内核中完成进程资源阻隔的相关特性,由于Container在Linux内核中的定义过于宽泛紊乱,后来该项目改名为CGroups(Control Groups),完成了对进程的资源约束。

2008年,LXC(Linux Containers)发布,它是一种在操作体系层级上的虚拟化办法,用于在Linux体系上经过同享一个内核来运转多个相互阻隔的程序(Container)。LXC正是结合了Linux内核中的CGroups和对分离的称号空间的支持来为运用程序供给了一个阻隔的环境。而Docker也是根据LXC完成的(Docker的前身是dotClound公司中的内部项目,它是一家供给PaaS服务的公司。),并作出了许多改进。

为什么要用Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

Docker 在如下几个方面具有较大的优势:

更快速的交付和部署

Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。

例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

高效的部署和扩容

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。

更高的资源利用率

Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

运用Docker

在使用Docker之前你需要先安装Docker(这好像是一句废话。。。),根据不同的平台安装方法都不相同,可以去参考Install Docker | Docker Documentation或者自行Google。

安装完毕之后,输入docker --version来确认是否安装成功。

$ docker --versionDocker version 17.05.0-ce-rc1, build 2878a85复制代码

从Docker Hub中可以pull到其他人发布的Image,我们也可以注册一个账号去发布自己的Image与他人共享。

[root@Jack ~]# docker search redis # 查看redis镜像是否存在[root@Jack ~]# docker pull redis # 拉取redis镜像到本机Using default tag: latestTrying to pull repository docker.io/library/redis ... latest: Pulling from docker.io/library/redisDigest: sha256:cd277716dbff2c0211c8366687d275d2b53112fecbf9d6c86e9853edb0900956[root@Jack ~]# docker images # 查看镜像信息REPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MBdocker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MBdocker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB复制代码

有了Image,之后就可以在其之上运行一个Container了,命令如下。

[root@Jack ~]# docker run -d -p 6379:6379 redis # 运行redis,-p代表将本机上6379端口映射到Container的6379端口 -d代表在后台启动[root@Jack ~]# docker ps -a # 查看容器信息,如果不加-a只会显示当前运行中的容器# 如果想要进入容器中,那么需要执行以下命令[root@Jack ~]# docker ps # 先获得容器的idCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1f928073b7eb redis "docker-entrypoint.sh" 45 seconds ago Up 44 seconds 0.0.0.0:6379->6379/tcp desperate_khorana[root@Jack ~]# docker exec -it 1f928073b7eb /bin/bash # 然后再执行该命令进入到容器中root@1f928073b7eb:/data# touch hello_docker.txt # 在容器中创建一个文件root@1f928073b7eb:/data# exit # 退出exit[root@Jack ~]# # 也可以在启动时直接进入 命令如下[root@Jack ~]# docker run -d -it -p 6379:6379 redis /bin/bash复制代码

我们对Container做出了修改,如果想要保留这个修改,可以通过commit命令来生成一个新的Image。

# -m为描述信息 -a为作者 1f9是你要保存的容器id 取前3个字符 docker可以自行识别# sylvanassun/redis为镜像名 :test 为一个tag 一般用于标识版本[root@Jack ~]# docker commit -m "test" -a "SylvanasSun" 1f9 sylvanassun/redis:testsha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd[root@Jack ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEsylvanassun/redis test e7073e8e5bd7 2 seconds ago 106.6 MBdocker.io/python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MBdocker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MBdocker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB复制代码

想删除一个容器或镜像也很简单,但在删除镜像前需要先删除依赖于它的容器。

[root@Jack ~]# docker stop 1f9 # 关闭运行中的容器,相应的也有docker start id命令来启动一个容器1f9[root@Jack ~]# docker rm 1f9 # 删除容器1f9[root@Jack ~]# docker rmi e70 # 删除上面保存的镜像Untagged: sylvanassun/redis:testDeleted: sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbdDeleted: sha256:751db4a870e5f703082b31c1614a19c86e0c967334a61f5d22b2511072aef56d复制代码

如果想要自己构建一个镜像,那么需要编写Dockerfile文件,该文件描述了镜像的依赖环境以及如何配置你的应用环境。

# 使用python:2.7-slim 作为父镜像FROM python:2.7-slim# 跳转到/app 其实就是cd命令WORKDIR /app# 将当前目录的内容(.)复制到镜像的/app目录下ADD . /app# RUN代表运行的shell命令,下面这条命令是根据requirements.txt安装python应用的依赖包RUN pip install --trusted-host pypi.python.org -r requirements.txt# 暴露80端口让外界访问EXPOSE 80# 定义环境变量ENV NAME World# 当容器启动时执行的命令,它与RUN不同,只在容器启动时执行一次CMD ["python", "app.py"]复制代码

然后就可以通过docker build -t xxx/xxxx .命令来构建镜像,-t后面是镜像名与tag等信息,注意.表示在当前目录下寻找Dockerfile文件。

学会如何构建自己的镜像之后,你是否也想将它发布到Docker Hub上与他人分享呢?要想做到这一点,需要先注册一个Docker Hub账号,之后通过docker login命令登录,然后再docker push image name,就像在使用Git一样简单。

关于Docker的更多命令与使用方法,请参考Docker Documentation | Docker Documentation,另外我还推荐使用Docker Compose来构建镜像,它可以很方便地组合管理多个镜像。

结语

Docker供给了非常强大的自动化部署方法与灵活性,对多个应用程序之间做到了解耦,供给了开发上的敏捷性、可控性以及可移植性。同时,Docker也在不断地帮助越来越多的企业完成了向云端搬迁、 向微效劳转型以及向DevOps形式的实践。 现在,微效劳与DevOps火爆程度日益渐高,你又有何理由挑选拒绝Docker呢?让我们一同挑选拥抱Docker,拥抱未来!

标签: #dockerfile有什么用