2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。

这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。

docker repository 哪家好 docker哪个公司_容器

 LXC,就是Linux容器虚拟技术(Linux container)

后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker

docker repository 哪家好 docker哪个公司_运维_02

Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。

正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。

什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。

                                           

docker repository 哪家好 docker哪个公司_数据_03

 有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。

2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。   

docker repository 哪家好 docker哪个公司_容器_04

不开则已,一开惊人。

越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。

Docker的人气迅速攀升,速度之快,令人瞠目结舌。

开源当月,Docker 0.1 版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日,Docker 1.0 版本正式发布。

此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、VMware这样的巨头,都对它青睐有加,表示将全力支持。

Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc. 。

Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻”。

在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWareOpenStack

相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。

docker repository 哪家好 docker哪个公司_运维_05

在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。

虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化

虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。

而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。

docker repository 哪家好 docker哪个公司_数据_06

它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。

正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。

我们具体来看看Docker。

大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

想要搞懂Docker,其实看它的两句口号就行。

第一句,是“Build, Ship and Run”

docker repository 哪家好 docker哪个公司_docker_07

也就是,“搭建、发送、运行”,三板斧。

举个例子:

我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。

docker repository 哪家好 docker哪个公司_数据_08

结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。

但是,跑来一个老巫婆,教会我一种魔法。

这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。

docker repository 哪家好 docker哪个公司_docker_09

等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。 

docker repository 哪家好 docker哪个公司_Docker_10

怎么样?是不是很神奇?

所以,Docker的第二句口号就是:“Build once,Run anywhere(搭建一次,到处能用)”。

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。

每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!

也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。

这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?

docker repository 哪家好 docker哪个公司_数据_11

于是乎,就变成了一个大的公共仓库。

负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?

所以,Docker Registry服务对镜像的管理是非常严格的。

最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

常用命令--------------------------------------------------------------------------------------------

docker run 镜像名    启动一个容器

他会检查本地是否存在指定的镜像,不存在就从公有仓库下载

利用镜像创建并且启动一个容器

分配一个文件系统,并且在只读的镜像层外面挂载一层可读写层

从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去

从地址池配置一个ip地址给容器

执行用户指定的应用程序

systemctl start docker启动docker服务

systemctl status docker    查看docker状态

systemctl enable docker 设置docker开机自启

systemctl disable docker 禁用docker开机自启

systemctl restart docker   重启docker服务

systemctl stop docker   停止docker服务

docker info   成功安装docker后,检查docker安装状态

docker pull ***    下载***镜像

docker images  查看本地下载的镜像

docker inspect 镜像名或镜像id  查看镜像详情

docker history 镜像名或镜像id   查看镜像历史

一个镜像是由多个层(layer)组成的,那么我们要如何知道各个层的具体内容呢,通过docker history 镜像名或镜像id 命令,可以查看各个层(layer)的创建信息

docker image rm 镜像名或镜像id   删除镜像  假如有容器在使用此镜像,会删除不掉

解决办法            先删除容器,再删除镜像

docker container(可省略) rm 802      删除容器 

docker save 镜像名或镜像id | gzip > 自己起个名字   导出镜像文件

docker load < 镜像名   从本地导入镜像

docker ps -a  查看所有容器

docker ps 查看正在运行的容器(要在宿主机中执行命令)

docker run -it *** bash  创建并且启动容器 

*** 指的是镜像名或者image id 的前几位

-it 这两个参数  -i表示交互式操作    -t 表示终端

bash 表示进入操作终端,基于交互式进行相关操作

docker container logs 802   查看容器日志    802为自己容器的id

docker container stop 802      停止容器

docker container restart 802   重启容器

docker exec -it 802 bash    进入指定容器

exit   从容器中退出

docker container rm 802 删除容器

docker container rm -f 802  强制删除容器

docker container prune  清理所有处于终止状态的容器

容器中管理数据主要有两种方式

数据卷挂载主机目录

数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,默认会一直存在,即使容器被删除

1.先查看docker的状态 确认docker是在运行的

docker repository 哪家好 docker哪个公司_容器_12

docker repository 哪家好 docker哪个公司_运维_13

 2.然后创建数据卷

docker repository 哪家好 docker哪个公司_容器_14

 3.查看数据卷

docker repository 哪家好 docker哪个公司_数据_15

 4.查看数据卷的信息

docker repository 哪家好 docker哪个公司_docker_16

 5.将数据卷挂载到容器

docker repository 哪家好 docker哪个公司_docker_17

 touch hello.java      创建一个名为hello.java的文件

docker repository 哪家好 docker哪个公司_容器_18

 说明宿主机中的文件和容器中的文件是同步的,

假如在宿主机中把文件删除

docker repository 哪家好 docker哪个公司_数据_19

 容器中的文件也没了

数据卷可以由docker平台去管理,创建数据卷的时候,数据卷会有一个对应的映射目录,

挂载主机目录,这个目录是由我们自己手动来管理的,不会由docker来管理,所以就不需要数据卷了

在启动容器时,以目录直接挂载的方式进行数据操作

docker run -it -v /usr/app:/opt/app

其中:
1)/usr/app:为宿主机目录
2)/opt/app: 为启动容器的一个目录
3)-v 用于指定挂载目录,如果本地目录(宿主机目录)不存在, Docker 会自动为你按照挂载目录进行目录的创建。

例如:

 

docker repository 哪家好 docker哪个公司_Docker_20

 docker inspect 91a

显示结果

...

"Mounts": [
    {
        "Type": "bind",
        "Source": "/usr/app",
        "Destination": "/opt/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

...