Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
本人引鉴了他人写的一个很形象的比喻描述来说明一下Docker:
首先你有一个 100 平方的房子(服务器),已知你(PHP 应用)需要吃喝拉撒睡觉,所以整个房子划分了卧室、厨房、卫生间等,然后供你一个人享用,但其实挺浪费的,你一个人并不需要 100 平方这么大,可能需要 20 平方(服务器占用 20%)就好了。
后来又来了个别人(Java 应用)也被安排到了这个房子里生活,他也需要吃喝拉撒睡,所以你们挤在了一个床上,用一个卫生间(比如 http 服务器)。如果你改了你的习惯(例如 http 服务配置项)同样会影响别人的生活。
后来又来了人(Node 应用),这时候房东发现房子不够大了,所以搬家(迁移、升级服务器)到另一个 150 平的房子,但是搬家成本好高。由于户型不同(系统版本、环境等)需要装修好久,此外还要把住户(应用代码)搬过来,还需要把住户自定义的习惯都带过来简直麻烦死了。
这时候,房东了解到了一个叫 Docker 的产品。
Docker 是一个可自由伸缩的集装箱房屋。
这个集装箱房屋虽小但是五脏俱全,而且可以满足一切用户需求,并支持高度自定义,比如 Node 这位住户不需要厨房,那么他的集装箱房子就小一点,当然房租(服务器消耗)也便宜一些。
房东用了 Docker 这个产品之后,发现租房这个事情变简单了:
(1)房东不需要划分卫生间、厨房、卧室并进行装修了,一切由用户自己定制集装箱。房东只需要把集装箱放到房间里即可。
(2)住户也不需要打架了,以前一起付房租(消耗服务器资源),现在按照自己集装箱大小付费。而且你可以在你集装箱里面随便折腾,爱怎么改配置就怎么改,也不会影响到别人。
(3)集装箱对于空间的使用,更加直观,房东可以更轻松了解到当前房间的空间使用率等,以便升级房间。
(4)房东搬新家的时候也开心了,只要把一面墙炸开,把里面一个个集装箱直接移过去新房子就好了,啥也不需要配置,都在集装箱里面呢。
你就是房东。房间是服务器,空间大小表示服务器硬件配置。
住户就是你的业务、应用,提供服务的。
伸缩集装箱房屋,就是 Docker 容器,里面是完全分离、独立、自由的环境和业务代码。你可以在里面装一个 Ubuntu(消耗大)或者简版的、可以跑业务代码的环境(消耗低)。
Docker 抹平系统差异,相当于把你多个房间都砸成长方形方便存放集装箱。这样你可以快速把独立容器丢到各个配置了 Docker 的不同系统、硬件配置的服务器上面。
因此也可以得到很高的伸缩性,可以瞬间部署很多服务器很多容器,然后负载均衡来提供大促服务等。
通过cgroups和namesapce进行实现资源隔离,实现一台机器运行多个容器互不影响。
使用docker,开发人员可以利用镜像快速构建一套标准的研发环境;开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。
docker容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
docker容器几乎可以在任意的平台上运行,包括乌力吉、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。
yum install docker
查看docker版本:
docker version
测试:
docker run hello-world
查看docker的安装包
yum list installed | grep docker
Docker的镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 centos操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
创建镜像有多种方式。
镜像可以用来创建 Docker 容器。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker 利用容器来运行应用。
镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
容器 = 镜像 + 读写层。
一个镜像可创建多个容器,每个容器都有各自的一个可读写层,这些容器又相互独立,但共享一个的镜像。
仓库是集中存放镜像的地方。
目前Docker官方仓库维护了一个公共仓库https://hub.docker.com,其中已经包括15000多个的镜像。
大部分需求都可以通过在Docker Hub中直接下来镜像来实现。
用户可以通过 docker search命令来查找官方仓库中的镜像,并利用docker pull 下载到本地,可以通过docker push 命令将本地镜像推送到docker hub。
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。
2)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,
就可以在其他容器中通过–volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。
3)如果有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。
这样,即使删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其他容器使用数据卷,数据卷都不会被删除的。
4)不能使用docker export、save、cp等命令来备份数据卷的内容,因为数据卷是存在于镜像之外的。备份的方法可以是创建一个新容器,挂载数据卷容器,同时挂载一个本地目录,
然后把远程数据卷容器的数据卷通过备份命令备份到映射的本地目录里面。
docker search
使用docker search 命令可以搜索远端仓库中共享的镜像,默认搜索Docker hub官方仓库中的镜像。
docker pull
使用docker pull 命令从网络上下载镜像。对于镜像来说,如果不显式地指定tag,则默认会选择latest标签,即下载仓库中最新版本的镜像。
docker images
使用docker images 命令可以列出本地主机上已有的所有镜像。
docker inspect
使用docker inspect 命令返回的是一个JSON的格式消息,如果我们只要其中的一项内容时,可以通过-f参数来指定。Image_id通常可以使用该镜像ID的前若干个字符组成的可区分字符串来替代完成的ID。
可以具体到查看镜像的某条信息,比如MySQL的镜像id。
docker inspect -f {{.Id}} mysql
docker rmi
使用docker rmi 命令可以删除镜像,其中image可以为标签或ID。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
docker save -o
-o:设置存储压缩后的文件名称
使用docker save命令来迁出镜像,其中image可以为标签或ID。
docker load --input
使用docker load命令可以载入镜像,其中image可以为标签或ID。这将导入镜像及相关的元数据信息(包括标签等),可以使用docker images命令进行查看。
docker push
使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录)
docker ps
查看当前正在运行的容器
docker ps -a
查看所有的容器
CONTAINER ID:docker守护进程启动容器时候为容器分配的唯一id
NAMES:docker守护进程启动容器时候为容器分配的名称
docker rm
使用docker rm命令删除终止状态的容器。
docker start
使用docker start命令重启已经停止状态的容器。
docker stop
使用docker stop命令停止容器。
docker logs
--details(显示提供给日志的额外细节)
-follow或-f(按日志输出)
–since(从某个时间开始显示)
--tail(从日志末尾多少行开始显示)
–timestamps或-t(显示时间戳)
–until(打印某个时间以前的日志)
使用docker logs命令获取容器的日志。
docker top
使用 docker top 可以查看运行中容器的进程