目录
一、Docker简介
1、Docker是什么
2、Docker与虚拟机
3、为什么要使用Docker
4、常用命令
二、基本概念
1、镜像
2、容器
3、仓库
三、Docker compose
四、总结
一、Docker简介
1、Docker是什么
Docker是一个开源容器化平台,通过它,我们可以将应用程序及所有依赖项都打包到一个称为容器的标准化单元中。容器重量轻,这使得它们具有便携性,并且它们与底层基础设施以及彼此的容器隔离。Docker 镜像可以在任何安装了 Docker 的机器上作为 Docker 容器运行,而不需要依赖于主机操作系统的用户空间组件。就像Docker的图标一样,将应用程序和依赖项打包成一个一个集装箱进行输送,各自都有独立环境,互不干扰。
平时做项目,程序可能在我的主机下运行成功,但是放到其他人的主机下却错误连连。这是因为环境的不同, 如果针对每个环境单独写一套部署脚本工程量太大了。但是Docker的出现便解决了该问题,所以,我是这样理解Docker的---Docker就是一个用于解决“在我的机器上是正常的,为什么在你的机器上无法正常运行”问题的工具。
2、Docker与虚拟机
Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 容器的基础镜像实际上只包含了操作系统的核心依赖库和配置文件等必要组件。它利用一个叫 Namespace 的能力让它看起来就像是一个独立操作系统一样。再利用一个叫 Cgroup 的能力限制它能使用的计算资源。所以说,容器本质上只是个自带独立运行环境的特殊进程,底层用的其实是宿主机的操作系统内核。
图1---虚拟机
图2---Docker
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB
|
一般为 GB
|
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
3、为什么要使用Docker
Docker 可用于打包应用程序及其依赖项,这使得它轻量级且易于更快地、更可靠地发布代码。Docker 使得在生产环境中运行应用程序非常简单:如果机器中安装了 docker 引擎,docker 容器可以独立于平台
(1)更高效的利用资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
(2)更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
(3)一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
(4)迁移性好:由于 Docker
确保了执行环境的一致性,使得应用的迁移更加容易。Docker
可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
4、常用命令
docker -v //查看版本
docker images //查看镜像
docker ps //查看容器
sudo service docker start //启动 docker 服务
sudo service docker stop //停止 docker 服务
sudo service docker restart //重启 docker 服务
docker exec -it <容器Id> /bin/bash //进入一个运行中的容器
二、基本概念
1、镜像
镜像就是一种特殊的文件系统。简单来说,镜像就是将程序和环境打包在一起的一个“压缩包”。镜像可以推到Docker Hub,也可以从Docker Hub上进行拉取(Docker Hub 是一个云端的公共注册表服务,用于存储和共享 Docker 镜像)。
镜像充分利用了Union FS的技术,将其设计为分层存储结构。镜像其实是由多层文件系统联合组成。镜像构建时会一层层构建,前一层是后一层的基础。每一层构建完就不会在发生改变,后一层的任何改变只发生在自己这一层。分层技术允许镜像构建过程中重用已有的层,从而大大提高了镜像的复用。
镜像就像容器的只读副本,容器只是运行状态的镜像。当拉取镜像并使用该镜像运行容器时,实际上就是在原来的只读层之上创建另一个临时可写层。
2、容器
容器是镜像运行的实体。我们可以通过命令docker pull 从仓库中拉取镜像,然后执行docker run 命令,将这个类似“压缩包”的镜像进行“解压缩”,获得一个独立的环境和应用程序并运行起来。这样一个独立的环境和应用程序就是所谓的容器。我们可以在一个操作系统上同时跑多个容器,且这些容器之间都是互相独立,互相隔离的。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
3、仓库
仓库就是Docker用来集中存放镜像文件的地方,类似于我们平时使用的github代码仓库。一个仓库会包含同一个软件的不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是哪个版本的镜像。
我们最常使用的是仓库是Docker Hub,这是默认的镜像仓库,但是国内访问很慢,建议切换至国内镜像源。
三、Docker compose
获取镜像后,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。但是我们做项目时通常需要多个多个Docker容器相互配合,这时就需要用到compose了。compose你可以这样理解,这就是一个用于定义和运行多容器Docker应用程序的工具。通过compose,我们可以使用YML文件来配置应用程序需要的所有服务。然后使用一个命令就可以从YML文件配置中创建并启动所有服务。
常用命令:
docker-compose up //启动yml文件定义的 container
docker-compose up -d //后台运行
docker-compose up --help //查看up帮助
docker-compose -f docker-compose.yml up //-f 指定yml文件
docker-compose stop //停止
docker-compose start
docker-compose ls //查看
docker-compose down //停止删除
docker-compose pull //重新下载
docker-compose ps
docker-compose images
四、总结
Docker本质上就是一个将程序和环境打包并运行的工具软件,而Docker容器本质上只是个自带独立运行环境的特殊进程,底层用的其实是宿主机的操作系统内核。
Docker软件通过Dockerfile 描述环境和应用程序的依赖关系进行构建镜像,而Docker compose 则解决了多个容器组成的一套服务的部署问题。