docker到底是什么,docker的作用是什么
Docker是一个基于轻量级虚拟化技术的容器。整个项目基于Go语言开发,采用Apache 2.0协议。Docker可以将我们的应用程序打包到一个容器中,容器中包含代码、运行环境、依赖库、配置文件等必要的资源。通过容器,可以实现方便、快捷、与平台解耦的自动部署模式。无论您的部署环境是什么,容器中的应用程序都将在相同的环境中运行。
以栗子为例。一只乐观的小猫写了一个CMS系统,技术栈很广,需要依赖各种开源库和中间件。按照手动部署方式,乐观小猫需要安装各种开源软件,并编写各个开源软件的配置文件。如果只是部署一次,这个时间成本还是可以接受的,但是如果乐观的小猫每隔几天就需要更换服务器来部署他的程序,那么繁琐重复的工作无疑会让人抓狂。这时候Docker的用处就发挥出来了。一只乐观的小猫只需要按照应用的部署步骤写一个Dockerfile(把安装、配置等操作留给Docker自动化),然后构建并发布自己的映像。这样,不管什么机器,一只乐观的小猫只需要拉他需要的镜像,然后就可以直接部署运行了。这就是Docker的魅力。
那么镜像是什么呢?镜像Docker是一个重要的概念:
映像:它类似于虚拟机中使用的映像。因为任何应用程序都需要自己的运行环境,所以Image是用于提供所需运行环境的模板。
容器:容器是Docker提供的抽象层。它就像一个轻量级的沙箱,包含一个最小的Linux系统环境和运行在其中的应用程序。容器是图像的运行实例(图像本身是只读的。当容器启动时,Docker将在图像上创建一个可写层,容器中的任何修改都不会影响图像。如果要将容器中的修改保存在Image中,Docker采用的策略是基于容器生成一个新的图层),Docker engine使用容器来操作和隔离每个应用(即每个容器中的应用是相互独立的)。
其实Docker的想法可以从Docker和Container这两个英文单词的本义来实现。集装箱可以定义为集装箱,是一种包装好的货物的通用标准规范,可以用机械设备方便地装卸。它的发明简化了物流运输的机械化过程,使其建立了标准化的物流运输体系。码头工人就是码头工人的意思。可以认为,Docker就像是一个在码头上辛勤工作的工人,将应用打包成具有一定标准化规格的‘容器’(其实这里的容器对应的是Image,Docker中的容器更像是一个运行的沙箱)。当货物运输到目的地后,Docker可以拆开集装箱取出货物(基于映像创建集装箱并运行)这种标准化和隔离可以很容易地将多个映像组合起来构建你的应用环境(Docker还提倡每个映像都要遵循单一职责的原则,即只做好一件事),或者将你的映像分享给他人。
本文由sylvanasson(Sylvanas . sun @ Gmail . com)撰写,最早发表在sylvanasson的博客上。
原文链接:sylvanassun.github.io/2017/11/19/…
(转载时请保留本段陈述,保留超链接。)
Docker VS虚拟机
在上面,我们提到了Docker是基于轻量级虚拟化技术的,所以它与我们通常使用的虚拟机是不同的。虚拟机技术可以分为以下两类:
虚拟计算机
虚拟机:它通过用软件模拟计算机系统来提供真实计算机的替代品。它是物理硬件的抽象,提供运行完整操作系统所需的功能。虚拟机通过物理机管理和共享硬件,使得多个虚拟机环境相互隔离。一台机器可以运行多个虚拟机,每个虚拟机都包含操作系统的完整副本。在系统虚拟机中,所有运行的软件或操作只会影响虚拟机的环境。我们经常使用的VMWare,就是系统虚拟机的实现。
虚拟机:允许程序在平台之外独立运行。一个典型的例子是JVM。Java通过JVM的抽象层将Java程序与操作系统和硬件平台解耦(因为每一个Java程序都运行在JVM中),从而实现了所谓的编译一次,到处运行。
Docker使用的技术与上述两者不同。它使用了一种更轻便的虚拟化技术。多个容器共享同一个操作系统内核,就像在本地运行一样。与虚拟机相比,容器技术只是应用层的抽象。它将代码和依赖项打包在一起。多个容器可以运行在同一台机器上(意味着多个容器也可以运行在一个虚拟机上),并与其他容器共享操作系统内核。每个容器在用户空间中作为独立的进程运行。这些特性证明了容器比虚拟机更灵活、更轻量级(一般与Docker结合虚拟机使用)。
其实容器技术并不是什么新鲜事,最早可以追溯到UNIX中的ch root(1979年在V7 Unix中引入)。它可以改变当前运行进程的根目录及其子目录。在这个修改后的环境中运行的程序不能访问指定目录树之外的文件,从而限制了用户的活动范围,并为进程提供了隔离的空间。
之后,各种Unix版本中出现了大量的容器技术。2006年Google提出‘进程容器’,有望在Linux内核中实现进程资源隔离的相关特性。由于Linux内核中容器的定义过于宽泛和混乱,该项目后来改名为CGroups(控制组),实现了进程的资源限制。
2008年,LXC(Linux容器)发布了。它是一种操作系统级别的虚拟化方法,通过共享一个内核,在Linux系统上运行多个隔离的程序(容器)。LXC将Linux内核中的CGroups与对独立名称空间的支持结合起来,为应用程序提供了一个隔离的环境。Docker也是基于LXC实现的(Docker的前身是提供PaaS服务的公司dotClound的内部项目。),并做了很多改进。
使用Docker
在使用Docker之前,你需要先安装Docker(这看起来像是一句废话。),根据平台不同安装方式也不同。可以参考安装Docker Docker文档或者自己Google。
安装完成后,输入docker - version确认安装是否成功。
$ docker -版本
Docker版本17.05.0-CE-RC1,内部版本2878a85复制代码
从Docker Hub可以拉别人发布的图片,也可以注册一个账号发布自己的图片与别人分享。
[root @ jack ~]# Docker search redis #检查Redis镜像是否存在。
[root @ Jack ~]# docker Pull redis # Pull redis镜像到本地机器
使用默认标签:最新
正在尝试提取存储库docker.io/library/redis…
最新:从docker.io/library/redis拉
文摘:sha 256:CD 277716 dbff 2c 0211 c 8366687d 275 d2b 53112 FEC BF 9 d6c 86 e 9853 EDB 0900956
[root@Jack ~]# docker images #查看镜像信息
存储库标记图像ID创建的大小
docker.io/python 3.6-onbuild 7195 f 9298 FFB两周前691.1 MB
docker.io/mongo最新d22888af0ce0两周前360.9 MB
Docker.io/redis最新8f2e175b3bd1 2weeks ago106.6mb复制代码
有了Image,你就可以在上面运行一个容器。命令如下。
[root @ jack ~]# Docker Run-d-p 6379:6379 Redis # Run Redis,-p表示映射到容器的本地计算机的6379端口,-d表示后台启动。
[root@Jack ~]# docker ps -a #查看容器信息。如果没有添加-a,将只显示当前运行的容器。
如果要进入容器,需要先执行下面的命令[root@Jack ~]# docker ps #获取容器的id。
容器ID映像命令创建的状态端口名称
1f 928073 b 7 EB redis " docker-entry point . sh " 45秒前涨44秒0 . 0 . 0 . 0:6379-6379/TCP deadline _ khor ana
[root @ jack ~]# docker exec-it1f 928073 b7b/激情口红/bash #然后执行这个命令进入容器。
root @ 1f 928073 b7b:/data # touch hello _ docker . txt #在容器中创建一个文件
root @ 1f 928073 b7b:/data # exit # exit
出口
[root@Jack ~]#
也可以在启动时直接输入命令如下[root @ jack ~]# docker run-d-it-p 6379:6379 redis/激情口红/bash复制代码。
我们对集装箱进行了改造。如果希望保留这一修改,可以通过commit命令生成一个新的映像。
-m是描述信息-a是作者1f9是你要保存的容器id。docker可以将sylvanasun/Redis本身标识为镜像名称:test是一个标记,通常用于标识版本[root @ jack ~]# Docker Commit-M " test "-A " Sylvanas Sun " 1 F9 Sylvanas Sun/Redis:test
sha 256:e 7073 E8 E5 BD 70 b 8d 58092 FD 6 BD 8 c 2551 e 65 DD 29241 c 235 edd F2 a 7 f 4 B4 b 25 cbbd
[root@Jack ~]# docker图片
存储库标记图像ID创建的大小
sylvanasun/redis测试e7073e8e5bd7 2秒前106.6 MB
docker.io/python 3.6-onbuild 7195 f 9298 FFB两周前691.1 MB
docker.io/mongo最新d22888af0ce0两周前360.9 MB
Docker.io/redis最新8f2e175b3bd1 2weeks ago106.6mb复制代码
删除容器或镜像也很简单,但是在删除镜像之前,您需要删除依赖它的容器。
[root@Jack ~]# docker stop 1f9 #关闭正在运行的容器,相应的,有一个docker start id命令启动一个容器。
1f9
[root @ jack ~] # dockerm1f9 #删除容器
1f9
[root @ jack ~] # dockermie70 #删除上面保存的图片。
未标记:sylvanasson/redis:测试
已删除:sha 256:e 7073 E8 E5 BD 70 b 8d 58092 FD 6 BD 8c 2551 e 65 DD 29241 c 235 edd F2 a 7 f 4 B4 b 25 cbbd
已删除:sha 256:751 db4 a 870 e5f 703082 b 31 c 1614 a 19 c 86 E0 c 967334 a 61 f 5d 22 b 251072 AEF 56d复制代码
如果你想自己构建一个镜像,你需要写Dockerfile文件,描述镜像的依赖环境,以及如何配置你的应用环境。
使用python:2.7-slim作为python:2.7-slim的父映像
跳转到/app实际上是cd命令WORKDIR /app
复制当前目录的内容(。)来补充一下。镜像的/app目录中的/app。
RUN表示要运行的shell命令,下面的命令是根据requirements.txt安装python应用的依赖包RUN pip install-trusted-host pypi . python . org-r requirements . txt。
暴露端口80以允许外部世界访问暴露端口80
定义环境变量ENV NAME World
容器启动时执行的命令,不同于RUN,只在容器启动时执行cmd ["python "," app.py"]复制一次代码。
然后,您可以使用docker build -t xxx/xxxx命令构建映像。-t后跟图像名称和标记等信息。注意。意思是在当前目录下寻找Dockerfile文件。
学会如何建立自己的形象后,你是否也想发布在Docker Hub上,与他人分享?要做到这一点,你需要先注册一个Docker Hub账号,然后通过docker login命令登录,然后Docker推送镜像名称,就像使用Git一样。
关于Docker的更多命令和用法,请参考Docker文档 Docker文档。此外,我还推荐使用Docker Compose构建镜像,可以方便地组合管理多个镜像。
Docker提供了非常强大的自动化部署模式和灵活性,解耦多个应用程序,并在开发中提供敏捷性、可控性和可移植性。与此同时,Docker也在不断帮助越来越多的企业实现向云迁移、向微服务转型、向DevOps模式转型的实践。
现在微服务和DevOps越来越流行。你为什么选择拒绝Docker?让我们选择拥抱Docker,一起拥抱未来!