Docker 官方网站: https://www.docker.com/
在虚拟化技术出现之前,如果我们想搭建一台服务器,我们需要做如
下的工作:
→ 购买一台硬件服务器;
→ 在硬件服务器上安装配置操作系统系统;
→ 在操作系统之上配置应用运行环境;
→ 部署并运行应用;
这种方式的缺点就是:
→ 部署应用非常慢;
→ 需要花费的成本非常高(时间成本、服务器成本);
→ 应用迁移麻烦;要将应用迁移,又得重复部署应用的过程:购买服务器 -> 安装操作系统 OS -> 配置运行环境 -> 部署应用
所以,为了解决这个问题,后续出现了虚拟化技术。
虚拟化(英语:Virtualization)是一种计算机资源管理技术,是将计算机的各种硬件资源,比如服务器、网络、 CPU、内存及存储等,予以抽象和转换后呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破计算机硬件资源不可切割的障碍,使我们可以比原本的计算机硬件资源结构更好的方式来组合应用这些资源。
虚拟化一般分为:
硬件级虚拟化(hardware-level-virtualization)
操作系统级虚拟化(os-level-virtualization)
硬件级虚拟化 是运行在硬件之上的虚拟化技术,它的核心技术是Hypervisor 发音 [,haipə’vaizə], Hypervisor 是一种运行在基础物理服务器硬件之上的软件层,可以虚拟化硬件资源,例如 cpu、硬盘、内存资源等。然后我们可以通过在虚拟化出来的资源之上安装操作系统,这也就是所谓的虚拟机。像 VMWare, VirtualBox 等都是使用该技术,我们经常使用的桌面版的虚拟机 VMWare就是采用这种虚拟化技术。
虚拟化技术的优点:
一台物理服务器可以虚拟化出多个虚拟的服务器,让计算机资源得以
充分利用;
虚拟化技术的缺点:
1、每创建一个虚拟机的时候,都会创建一个操作系统,这个操作系统会占用很多资源,这样无疑大大的增加了资源的消耗,当安装的虚拟机越多,资源消耗就越多。
2、环境兼容性问题,开发时的环境运行正常,部署到虚拟机环境测试则有可能发生错误;
基于硬件级虚拟化技术的缺点和不足,后续又发展出来了另一种虚拟化技术,即操作系统级虚拟化技术;
操作系统级虚拟化 是运行在操作系统之上的虚拟化技术,它模拟的是运行在一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,该技术也称为容器化技术。
在容器化技术领域, Docker 是目前最流行的一种实现。 Docker 发布于 2013 年, Docker 基于 LXC 技术, LXC 是 Linux 平台上的容器化技术实现。
注: LXC 是 Linux Container 的简写,它是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,它与宿主机使用同一个内核,性能损耗小,这种技术是 Linux 提供的,但是直到 Docker出世,该技术才被发挥出来。
1、 Docker 是一个开源的应用容器引擎,它基于 Google 公司推出的 Go 语言实现,项目代码托管在 GitHub 上进行维护; https://github.com/docker/docker-ce
2、 Docker 技术让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,打包好的容器可以发布到任何流行的 Linux 服务器上运行,这样就可以解决开发环境与运维环境不一致的问题了,所以容器技术解决了开发和运维之间的矛盾,让开发专注于开发,运维专注于运维,不要被环境问题所打扰
3、 Docker 彻底释放了虚拟化的威力,极大降低了计算机资源供应的成本, Docker 重新定义了程序开发测试、交付和部署过程, Docker 提出了“构建一次,到处运行”的理念,让应用的开发、测试、部署和分发都变得前所未有的高效和轻松!
4、 Docker 是一种轻量级的操作系统虚拟化解决方案, Docker 的基础是 Linux 容器(LXC)技术,在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单; Docker自开源后受到广泛的关注, Docker最早是基于 Ubuntu开发的,但后续 CentOS、 Debian、 Fedora 等主流的 Linux 操作系统都支持 Docker;
总结:简单地说, Docker 是对软件和其依赖环境的标准化打包,应用之间相互隔离,共享一个 OS Kernel(解决了资源浪费的问题),可以运行在很多主流操作系统上;
但是也需要澄清一下, Docker 本身不是容器, Docker 只是管理容器的引擎。
容器是将代码和环境的关系打包在一起的一个集合,而虚拟机是在物理层面上,分出来的一个操作系统;
多个容器可以运行在同一台物理服务器上,并共享一个操作系统的内核资源。多个虚拟机也可以运行在同一台机器上,但每个虚拟机都需要一个完整的操作系统;
容器是在本地操作系统层面上实现虚拟化,直接复用本地主机的操作系统,不需要单独安装操作系统,而传统的虚拟化技术方式则需要单独安装每个虚拟机的操作系统。
作为一种新兴的虚拟化技术, Docker 跟传统的虚拟化方式相比具有众多的优势。
1、 Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
2、 Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
3、容器除了运行其中的应用外,基本不消耗额外的系统资源,使得应用的性能很高。传统虚拟机方式运行 10 个完全不同的应用可能我们会起 10 个虚拟机来部署,而 Docker 只需要启动 10 个隔离的应用即可。
4、 Docker 可以更快速的交付和部署,大量地节约开发、测试、部署的时间,对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
5、更高效的虚拟化, Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
6、更轻松的迁移和扩展, Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性可以让用户轻松地把一个应用程序从一个平台直接迁移到另一个平台。
我们知道 Docker 并不是容器,而只是一个管理容器的引擎;
Docker 的底层运行原理:
Docker 服务启动→下载镜像→启动该镜像得到一个容器→容器里运行着我们想要的程序;
根据 Docker 的运行机制,我们将按照如下步骤运行第一个 Docker 容
器;
1、将 Docker 服务启动;
2、下载一个镜像, Docker 运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地, Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库 https://hub.docker.com)。
==CentOS 下怎么下载(pull)镜像? ==
从 docker hub 官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如 docker search tomcat 进行搜索,然后下载所需要的镜像:
下载镜像: docker pull tomcat
运行镜像: docker run tomcat 前台运行, 要后台运行,加参数 -d
显示本地已有的镜像: docker images
在列出信息中,可以看到几个字段信息
REPOSITORY:来自于哪个仓库,比如 docker.io/tomcat
TAG:镜像的标记,比如 latest
IMAGE ID:镜像的 ID 号(唯一)
CREATED:创建时间
SIZE:镜像大小
3、启动下载下来的镜像得到一个容器:
docker run -d docker.io/tomcat
默认是前台启动,如果需要后台启动,指定-d 参数;
通过 ps -ef | grep tomcat 查看,检查 tomcat 镜像是否启动容器成功;
进入容器: docker exec -it 【容器ID】 bash
其中 i 表示交互式的,也就是保持标准输入流打开;
t 表示虚拟控制台,分配到一个虚拟控制台;
退出容器: exit
从客户机上访问容器,需要有端口映射, docker 容器默认采用桥接模式与宿主机通信,需要将宿主机的 ip 端口映射到容器的 ip 端口上;
停止容器: docker stop 容器 ID/名称
启动容器: docker run -d -p 8080:8080 docker.io/tomcat
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建。
镜像与容器的关系类似于面向对象编程中的类与对象的关系。
镜像—>类
容器—>对象
Docker 包括三个核心要素镜像(Image)、容器(Container)、仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。
Docker 的运行离不开以上核心几个组件的支持, Docker 的成功也是拜这几个组件所赐。
有人会误以为, Docker 就是容器,但 Docker 不是容器,而是管理容器的引擎。
Docker 镜像就是一个只读的模板,可以用来创建 Docker 容器。
例如:一个镜像可以包含一个完整的 centos 操作系统环境,里面仅安装了 mysql 或用户需要的其它应用程序。
Docker 提供了一个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个 root 文件系统 rootfs, root 文件系统通常是某种操作系统,比如 centos、 Ubuntu,在 root 文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成 docker 中的镜像;
容器是从镜像创建的运行实例。它可以被启动、停止、删除。每个容器都是相互隔离的、保证安全平台。可以把看做一个简易版的 Linux环境,包括 root用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序。
Docker 利用容器来运行应用,镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务器(Registry)看做同一事物,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag);
仓库分为公开仓库(Public)和私有仓库(Private)两种形式;
最大的公开仓库是 Docker Hub (https://hub.docker.com/),存放了数量庞大的镜像供用户下载;
当然,用户也可以在本地网络内创建一个私有仓库;
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来即可;
注: Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务;
用户可通过 docker search 命令来查找官方仓库中的镜像:
docker search rabbitmq
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建;
官方的镜像说明是官方项目组创建和维护的, automated 资源允许用户验证镜像的来源和内容;
根据是否是官方提供,可将镜像资源分为两类;
一种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字;
还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 user_name/ 来指定使用某个用户提供的镜像,比如 tianon 用户;
并利用 docker pull 命令来将它下载到本地:
docker pull rabbitmq
docker pull centos
Dockerfile 用于构建 Docker 镜像, Dockerfile 文件是由一行行命令语句组成,基于这些命令即可以构建一个镜像,比如下面就是一个Dockefile 文件样例:
FROM XXX/jdk:8
MAINTAINER docker_user
ENV JAVA_HOME /usr/local/java
ADD apache-tomcat -8.0.32.tar.gz /usr/local/
RUN mv apache-tomcat -8.0.32 tomcat8
EXPOSE 8080
RUN chmod u+x /usr/local/tomcat8/bin/*.sh
CMD /usr/local/tomcat8/bin/catalina.sh start
一般的, Dockerfile 分为四部分:
基础镜像信息;
维护者信息;
镜像操作指令;
容器启动时执行指令;
FROM
格式为 FROM 或 FROM :
Dockerfile 文件的第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次);
MAINTAINER
格式为 MAINTAINER ,指定维护者信息;
ENV
格式为 ENV ,指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持;
ADD
格式为 ADD ;
复制指定的到容器中的;
EXPOSE
格式为 EXPOSE […]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用,在启动容器时需要通过 -p 映射端口, Docker 主机会自动分配一个端口转发到指定的端口;
RUN
格式为 RUN
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行;
CMD
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。