Docker(初识整理)

来源:互联网 发布:贵州大数据 编辑:程序博客网 时间:2024/05/17 08:55

一. Docker简介

       Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。


       Docker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

二. Docker核心概念

       VM虚拟机的出现可以让服务器资源可以充分利用,一台服务器上可以安装多个VM,而每个VM又形成资源隔离,使不同的VM可以使用同一台服务器,却互相不干扰。Docker同理,它也是将硬件资源抽象。

       Docker两个最重要的概念是镜像和容器。镜像类似虚拟机的快照,但更轻量,非常非常轻量。举例来说,VM相当于绿皮火车,Docker就相当于劳斯莱斯小汽车。VM的快照通常2~3G,而Docker只有100~300M。

1. 镜像image

       简单说,镜像就是一个只读模板。

       创建Docker镜像有几种方式,多数是在一个现有镜像基础上创建新镜像,因为几乎你需要的任何东西都有了公共镜像,包括所有主流Linux发行版,你应该不会找不到你需要的镜像。不过就算你想从头构建一个镜像也有好几种方式。

       实现的方式有两种:在一个文件Dockerfile中指定一个基础镜像及需要完成的修改;或通过“运行”一个镜像,对其进行修改并提交。不同方式各有优点,不过一般会使用文件Dockerfile来指定所做的变化。

       镜像拥有唯一ID,以及一个供人阅读的名字和标签对。镜像可以命名为类似ubuntu:latest、ubuntu:precise、django:1.6、django:1.7等等。

2. 容器container

       每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

       可以从镜像中创建容器,这等同于从快照中创建虚拟机,不过更轻量。应用是由容器运行的。容器与虚拟机一样,是隔离的。它们也拥有一个唯一ID和唯一的供人阅读的名字。容器有必要对外暴露服务,因此Docker允许暴露容器的特定端口。




       容器启动时,将被分配一个随机的私有IP,其它容器可以使用这个IP地址与其进行通讯。这点非常重要,原因有二:一是它提供了容器间相互通信的渠道,二是容器将共享一个本地网络。

       要开启容器间通讯,Docker允许你在创建一个新容器时引用其它现存容器,在你刚创建的容器里被引用的容器将获得一个(你指定的)别名。我们就说,这两个容器链接在了一起。

       因此,如果DB容器已经在运行,我可以创建web服务器容器,并在创建时引用这个DB容器,给它一个别名,比如dbapp。在这个新建的web服务器容器里,我可以在任何时候使用主机名dbapp与DB容器进行通讯。



3. 数据卷volume

       Docker是只读的,那就产生一个问题,例如mysql,用户有自己的数据,那这部分数据怎么保存呢?Docker提供了数据卷就用来保存持久的数据。

       卷是针对容器的,你可以使用同一个镜像创建多个容器并定义不同的卷。卷保存在运行Docker的宿主文件系统上,你可以指定卷存放的目录,或让Docker保存在默认位置。




       注意:定义了数据卷,Docker迁移就可能失败,可能新的机器没有对应目录。另外,如果数据量非常大,Tb级别的,docker镜像才几百兆。所以并不推荐使用数据卷方式,最好就是只读的,运行时只产生临时数据,不产生业务数据,退出、删除无需额外处理。

4. 仓库repository

       Docker有一个类似版本管理仓库(Repositry)的东西,有docker.io提供的官方仓库(index.docker.io,相当于github),也可以自建(叫docker-registry,相当于自己搭建一个小型github)。

 

Git

Docker

  GitHub

  DockerHub

  用户 User Account

  用户 User Account

  仓库 Repository

  仓库 Repository

  分支 Branch

  镜像 Image

  标签 Tag

  标签 Tag

  Push 推送,上传

  Push 推送,上传

  Pull/Clone 拉取/克隆

  Pull 拉取

  Commit 提交

  Commit 提交

  Merge 合并

  N/A


注意:提供以下一些比较,有助于更好地理解Docker中的概念

Image和Container的区别是什么?
很简单,它们的区别仅仅是一个是只读的层,一个是可写的层。你可以使用docker commit 命令,将你的Container变成一个Image,也就是提交你所运行的Container的修改内容,变成一个新的只读的Image,这非常类似于git commit命令。

Docker与VM虚拟机的不同点?
(1)虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization容器技术,所以docker甚至可以在虚拟机上运行。
(2)启动速度快,比VM快太多了,启动、停止、开始、重启都是秒级甚至毫秒级。
(3) 轻量级虚拟化,在一台服务器上可以部署100~1000个Container容器。而VM一台服务器能部署10到20就很不错了。
(4)*Docker是单线程,Docker设计者极力推崇“一个容器一个进程的方式”。无法很好地模拟一个完整的环境(详细参加LXC)。
(5)*当停止一个虚拟机时,可能除了一些临时文件,没有文件会被删除(业务产生的文件);但当停止一个Docker容器,对初始状态(创建容器所用的镜像的状态)做的所有变化都会丢失。这是使用Docker时必须做出的最大思维变化之一:容器是短暂和一次性的。所以有种说法,例如mysql这样的数据库还是不要用Docker的好,因为数据库在使用过程中会有很多业务数据。
(6)Docker的安全性目前比VM要差。VM做到资源完全隔离,而Docker会共享资源,这就带来了安全的风险。



三. 在Centos7下安装Docker

Docker官方文档要求必须运行在Linux kernel 3.8以上,所以需要安装在Centos7或者Ubantu系统上。
yum install lrzsz      #安装上传下载组件uname –a               #检查当前Linux内核版本
配置好虚拟机之后,VM配置好NAT模式上网,详细配置我在之前的文章里写好了,可以参照配置下。
CentOS 7安装后的网络设置:http://blog.csdn.net/weixin_29115985/article/details/78203672

安装Docker

1. 安装工具包,缺少这些依赖将无法完成
$ yum install -y yum-utils

2. 设置远程仓库
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3. 安装Docker
$ yum install docker-ce



注意:安装过程中共有三次手动输入,都输入 y 就可以了





4. 启动安装好的Docker
$ systemctl start docker
或者:
$ service docker startservice docker start        #启动dockerchkconfig docker on         #加入开机启动

5. 查看当前的Docker版本
$ docker version



6. 校验,当看到 Hello from Docker! 就大功告成啦
$ docker run hello-world



Docker常用帮助命令:
docker --help#帮助docker –v#简单查看版本docker version#查看版本docker info#查看信息