-
Docker使用go基于linux lxc计数实现的开源容器。通过对应用封装、分发、部署、运行全生命周期管理,达到“一次封装,到处运行”。
虚拟机 vs 容器
-
虚拟机需要有额外的虚拟机管理应用和虚拟机操作系统层,操作系统不仅占用空间而且运行速度也相对慢。docker容器是在本机操作系统层面上实现虚拟化,因此很轻量级,速度接近原生系统速度。
-
虚拟机启动速度是分钟级别,性能较弱、内存和硬盘占用大,一个物理机最多跑几十个虚拟机,但它的隔离性比较好。
docker启停都是秒级实现,内存和硬盘占用非常小,单机支持上千个容器,在ibm服务器上可运行上万个容器
-
Docker由镜像、容器、仓库组成
镜像文件与ZIP压缩包类似,将一系列文件按照一定的格式制作成单一的文件,像照镜子一样。可以在很短的时间还原出一个完整的系统来(iso,gho都是镜像)。
例如镜像网站就是将一个完全相同的站点放到几个服务器,分别有自己的URL,在这些服务器上互为镜像网站。它和主站并没有太大差别,或者可算是为主站作的后备措施。 -
镜像 = 文件系统+数据,由多个层加上一些docker元数据组成,容器运行着由镜像定义的系统。
可以理解为面向对象编程中的“类”,以某一具体镜像为模板,运行具体的容器,提供服务。
-
容器 = 镜像运行实例,可以理解为面向对象编程中的“对象”,可以使用同一个镜像运行多个实例。
从读写角度来说,镜像是只读的,容器是在镜像上添加了一层可读写的文件系统。
-
Docker容器可以简单的季节为提供了系统硬件环境,是真正跑项目程序、消耗机器资源、提供服务的东西。例如,我们可以暂时把容器看作一个 Linux 的电脑,它可以直接运行。容器是基于镜像启动的,并且每个容器都是相互隔离的。
-
Docker 的仓库用于存放镜像。这一点,和 Git 非常类似。我们可以从中心仓库下载镜像,也可以从自建仓库下载。同时,我们可以把制作好的镜像 commit 到本地,然后 push 到远程仓库。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库 Dock Hub,国内的公开仓库也有很多选择,例如阿里云等。
-
层:文件变更集合。像传统虚机应用,每个应用都需要拷贝一份文件副本,运行成百上千上磁盘空间会迅速耗光,而docker采用写时复制来减少磁盘空间,当一个运行中的容器要写入一个文件时,它会把该文件复制到新区域来记录这次的修改,在执行docker提交时将这次修改记录下并产生一个新的层。docker分层解决大规模使用容器时碰到的磁盘和效率问题。
创建docker镜像
- 常用docker命令+手工提交、Dockerfile
- 创建一个docker应用只需要三步:编写dockerfile、构建镜像、运行容器
-
Dockerfile:包含一系列命令的文本文件。
FROM:镜像名字 : 标签名字
- 指定之后构建新镜像所使用的基础镜像,启动构建后Docker会基于该镜像构建新镜像。
RUN:<command>
(linux命令,将代码重定向)- 在镜像构建过程中执行特定命令,并生成一个中间镜像,中间镜像会被缓存并在下次构建中使用。如果不想使用可以指定
--no-cache参数
EXPOSE
:声明要开放的端口
WORKDIR
:启动容器后默认目录
ENTRYPOINT
:容器启动后,根据它启动一个进程
HEALTHCHECK
:通过这个指令执行的陈工与否来判断容器当前的状态。HEALTHCHECK [option] CMD <command>
- –interval=: 两次健康检查命令执行的间隔时间. default value 是 30 seconds.
- –timeout=: 设置某一个次health check执行的timeout时间,一旦超时代表这一次healthcheck失败. default value 是 30 seconds.
- –retries=: 设置health check连续失败次数一旦达到设置的值容器状态就会变成unhealthy. default value 是 3.
-
构建镜像
docker build --tag 镜像名字:标签
生成镜像
每个命令都会有个输入输出,输入是命令,输出是给到层的id,所以,基本上每个命令都会产生一个层
-
运行容器
docker run -p 8000:8000 --name 容器名
运行镜像,-p将容器的8000端口映射到本机8000端口。
curl http://locakhost:8000
,对端口发起请求,测试容器是否运行成功。