1.什么是Docker
Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。Docker提供了一套开发工具、服务、可信内容和自动化,可单独或一起使用,以加速交付安全应用程序。Docker可以帮助开发人员在不需要繁琐的环境配置或管理的情况下,在任何地方构建、共享和运行应用程序。
2.Docker与传统虚拟机的区别
- 更轻量:传统虚拟机需要虚拟化一套完整的硬件及操作系统,占用资源大;Docker则是运行的一个个容器,Docker的容器是一种沙盒进程,直接在宿主机上运行,使用的宿主机的资源,进程之间相互隔离,且不需要额外的虚拟硬件。所以,Docker更加轻量。
- 更快:启动传统虚拟机就像启动物理机一样,通常需要几十秒甚至几分钟,而Docker运行容器只需要一条命令即可,且都是秒级别的。
- 更好的移植性:做开发的同事经常会出现,发布一个应用程序到测试环境,本地运行没问题,测试环境就是跑不起来,出现这种问题可能是因为你本地机器和测试环境的机器的系统版本差异,或者漏安装了一些运行时环境导致的。而在Docker中则是将应用程序所需要的依赖、配置文件、脚本文件打包成一个镜像文件,通过镜像文件运行一个容器实例,如果你本地和测试环境使用的是相同的镜像,则本地运行是啥样,测试环境运行就是啥样,永远不会出现上述问题。
3.什么是镜像(Image)
镜像是一个只读的模板,它由一层层的文件系统组成,它包含了你应用程序的发布文件、依赖、配置、脚本。同时也包含了容器的一些配置,例如环境变量、容器首次运行的的默认指令和其它的元数据。镜像用来创建Docker容器,一个镜像可以运行多个Docker容器实例。
举两个例子:
一、中秋节吃的月饼是怎么制作出来的呢,是不是有一个月饼模子,只需要将月饼所需要的原材料放到模子中就能制作出各种各样的月饼。
这个月饼模子包含了月饼的大小,形状,就相当于Docker的镜像。通过月饼模子做出来的月饼成品就相当于是Docker的容器实例。
二、类似于C#或Java中的类,对象。
请看下面这么一段代码:
Student student1 = new Student();
Student student2 = new Student();
Student student3 = new Student();
通过一个Student类分别创建了student1、student2、student3,这些实例拥有Student类中定义的字段、属性、方法。Student类就好比Docker中的镜像(Image),student1、student2、student3就好比Docker中的容器(Container)。
4.什么是容器(Container)
容器是一种运行在宿主机上的沙盒进程,这种沙盒进程与宿主机上的其它进程相隔离(容器与容器之间也是隔离的),这种隔离机制运用的是linux的命名空间(namespaces)和控制组(cgroups)。其中命名空间用于进程隔离,就好比C#中的命名空间,将多个类放到一个命名空间下,多个命名空间相互隔离;控制组用于容器的资源限制,比如CPU、内存、磁盘,网络等资源。
单个容器的结构,以及与容器与宿主机的结构如下图:
容器可以总结为以下几点:
- 容器是镜像的一个可运行实例。你可以使用Docker提供的API或CLI来创建、启动、停止、移动或者删除一个容器;
- 容器可以运行在本地机器,虚拟机,或者部署到云上;
- 容器是可移植的,可以运行在任何操作系统上;
- 与其它容器隔离,只运行它自己的软件、可执行文件、配置等。
5.什么是仓库(Repository)
仓库用于存放和管理镜像,将制作好的镜像推送(push)到远程仓库,或者从远程仓库拉取别人制作好的镜像,跟源代码管理工具SVN、Git仓库一样的概念。
- Docker官方公有仓库:https://hub.docker.com/
由于DNS被污染了,无法直接访问Docker Hub,可以使用国内的镜像加速:
网易:http://hub-mirror.c.163.com
腾讯:https://mirror.ccs.tencentyun.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://cr.console.aliyun.com
Docker Desktop:
{
"builder": {
"features": {
"buildkit": true
},
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"insecure-registries": [],
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com"
]
}
Linux:
vi /etc/docker/daemon.json
修改后记得使用 systemctl restart docker重启Docker服务
- 使用Docker Registry搭建本地私有仓库
Registry是一个无状态、高度可扩展的服务器端应用程序,用于存储和分发Docker镜像。
关于Docker Registry本地仓库的搭建,后面有时间了单独出一篇。