一、简介
1、介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
1、docker Client 客户端
Docker提供给用户的客户端。Docker Client提供给用户一个终端,用户输入Docker提供的命令来管理本地或者远程的服务器。
2、Docker Daemon守护进程
Docker服务的守护进程。每台服务器(物理机或虚机)上只要安装了Docker的环境,基本上就跑了一个后台程序Docker Daemon,Docker Daemon会接收Docker Client发过来的指令,并对服务器的进行具体操作。
3、Docker Image镜像
俗称Docker的镜像,可以认为这个就像我们要给电脑装系统用的系统CD盘,里面有操作系统的程序,并且还有一些CD盘在系统的基础上安装了必要的软件,做成的一张 “只读” 的CD。
4、Docker Container容器
俗称Docker的容器,这个是最关键的东西了。Docker Container是真正跑 项目程序、消耗机器资源、提供服务的地方,Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。 你可以认为 Docker Container提供了系统硬件环境,然后使用了Docker Images这些制 作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。
5、Docker Registry
这个可认为是Docker Images的仓库,就像git的仓库一样,用来管理Docker 镜像的,提供了Docker镜像的上传、下载和浏览等功能,并且提供安全的账 号管理可以管理只有自己可见的私人image。就像git的仓库一样,docker 也提供了官方的Registry,叫做Dock Hub。
我们通过客户端写命令,然后客户端将命令发送给守护进程,守护进程再将命令执行的结果返回给客户端,这就使我们能通过命令查看执行结果,镜像就是容器的源代码,容器通过镜像启动,使用仓库来保存用户构建的镜像,仓库分为共有和私有。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 面向对象
容器 对象
镜像 类
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
上层的image依赖下层的image,因此docker中把下层的image称作父image,没有父image的image称作base image,因此想要从一个image启动一个container,docker会先加载其父image直到base image。
2、优势
docker image的体积非常的小,一个完整功能的ubuntu才100多mb。docker image如此小的体积,让我们可以方便的在网络上传输和分享,对于公司来说就提供了对大量image的管理和分发的可能。
docker的系统启动的耗时为0。启动系统的耗时,命令完成就直接输出了结果。程序执行完后container也跟着关闭,也并没有保存镜像的时间,但下次再运行还是会保留你处理过的状态。
docker系统占用资源极少,我们知道如果我们开启了一个vm的系统,不论是linux的或者windows,就算什么都不运行都会占用一部分内存,但是docker container启动后如果不运行程序,你是看不到系统资源被占用的。
3、与虚拟机的区别
下图是虚拟机与docker的大概原理图,直观上来讲vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,所以资源利用率相对docker低也是比较容易理解的。
虚拟机技术通过Hypervisor层抽象底层基础设施资源,提供相互隔离的虚拟机,通过统一配置、统一管理,计算资源的可运维性,以及资源利用率都能够得到有效的提升。同时,虚拟机提供客户机操作系统,客户机变化不会影响宿主机,能够提供可控的测试环境,更能够屏蔽底层硬件甚至基础软件的差异性,让应用做到的广泛兼容。然而,再牛逼的虚拟化技术,都不可避免地出现计算、IO、网络性能损失,毕竟多了一层软件,毕竟要运行一个完整的客户机操作系统。容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等等封装起来,以最简洁的方式支持应用运行,轻装上阵,当然是性能更佳。Docker镜像特性则让这种方式简单易行。当然,因为共享内核,容器隔离性也没那么好。
二、安装
1、环境需求
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
2、安装
(注:执行安装过程中切记一定要吧防火墙关掉)
防火墙查看状态:firewall-cmd --state
防火墙关闭:systemctl stop firewalld.service
防火墙开启:systemctl start firewalld.service
禁止开机启动启动防火墙:systemctl disable firewalld.service
安装执行:yum -y install docker
(注:在Centos6.x中安装docker首先需要安装epel,如果没有安装epel,会报 “No package docker available”)
查看版本:docker -v 或 docker version
启动执行: service docker start
3、卸载
yum remove docker
yum remove docker-selinux
三、常用命令
1、镜像
1、docker镜像检索:
# docker search 镜像名
docker search centos
2、docker镜像下载:
# docker pull 镜像名
docker pull centos
3、docker镜像列表:
docker images
4、docker镜像删除:
# docker rmi image-id (镜像id)
docker rmi 34336sdf12
5、删除所有镜像:
docker rmi $(docker images -q)
6、镜像导出:
docker save -o gitlab.tar b0c14a03d594
7、镜像导入:
docker load -i gitlab.tar
8、镜像名称修改:
docker tag b0c14a03d594 gitlab/gitlab-ce:latest
2、 容器
1、创建并运行容器:
# docker run 镜像命名
docker run centos
# 指定容器名
docker run --name webcentos centos
# 以守护进程的方式运行容器
docker run --name webcentos -d centos
2、容器列表:docker ps
3、容器状态:docker ps -a
4、停止容器:
# docker stop 容器名称/容器Id
docker stop webcentos
5、启动容器:
# docker start 容器名称/容器Id
docker start webcentos
6、删除容器:
# docker rm 容器id
docker rm 235483s15c
7、删除所有容器:docker rm $(docker ps -a -q)
8、登陆容器:
容器名称/容器id /bin/bash
docker exec -it webcentos /bin/bash
若/bin/bash 目录报错则
docker exec -it 容器名称/容器id /bin/sh
9、容器日志:
# docker logs 容器名称/容器id
docker logs webcentos
实时查看docker容器日志
$ sudo docker logs -f -t --tail 行数 容器名
Run启动时:
-it 为交互式运行,/bin/bash 会启动一个新的shell,运行容器后,我们会离开当前的shell,进到我们新启动的shell中,我们被这个shell带到虚拟的容器环境中。我们在这个虚拟环境中的操作都是相对于容器的。例如查看目录、系统版本等信息时和宿主机就会不同。这时在新终端宿主机shell环境中执行docker ps时可以看到当前运行的容器,但是在容器shell中执行exit,可退出当前容器,这时容器也会停止,可通过docker ps -a 才会查看到我们之前运行过的容器。
-d 为守护式运行,容器直接运行在后台。运行完成后我们还停留在当前shell中,通过docker ps命令我们可以发现 运行在后台的容器。
Docker inspect ID :命令可以查看容器更多属性。