一、什么是Docker
1、Docker的作用与原理
Docker容器技术可以想象成是软件工业上的集装箱,它可以快速的将不同应用或者一个应用的不同版本打包到一个可移植的容器中实现服务快速部署,减少环境不一致带来的问题,而且每个容器之间相互隔离互不影响,这好比船上有很多集装箱,装水果的集装箱出了问题,但是不影响装酒水的集装箱。但是需要明白的是严格来说Docker并不是容器,它是对容器进行了封装,以实现简化管理。Docker底层技术是Linux内核所自带的LXC技术。
2、Docker名词解释
CGROUP:它负责对Docker各容器之间资源占用进行分配管理。相比传统虚拟化来说Docker容器会共享宿主机的内核资源,而且少了系统层面的开销,不需要为每个容器去虚拟化一个完整的系统,而且即使是下载一个Centos系统镜像也才200M(底层会使用宿主机的内核,也因此容器的内核是无法升级的,必须和宿主机一致)。Docker不太适合对数据或日志进行存储,数据文件一般会通过NFS\MFS等技术挂载到Docker容器之外。
Namespace:负责容器之间资源隔离的实现。不同的Namespace隔离的资源不同:
· UTS:隔离主机名和域名,要求系统内核版本2.6
· IPC:隔离消息队列、共享内存、信号量,要求系统内核版本2.6
· PID:隔离进程编号,要求系统内核版本,要求系统内核版本2.6
· NETWORK:隔离网络设备和端口等,要求系统内核版本2.6
· MOUNT:隔离文件系统与挂载点,要求系统内核版本2.4
· USER:用于隔离用户和用户组,需要注意的是登陆容器后看到的root通常不是真正的root,比如要用那个用户去cat /etc/passwd,那一样会报出权限错误。要求系统内核版本3.8,这也是为什么要在Centos 7使用Docker的原因
注:UTS、NET、IPC这三个名称空间通常是共享给各容器使用,这样可以更方便的实现多容器使用同端口的需求。否则需要DNAT、SNAT两次网络转换才可以。
docker镜像:可以理解为模板文件,也可以想象成平时装系统用的.iso文件
docker容器:镜像运行之后成为docker容器,就像程序运行后变成进程
docker仓库(registry):镜像仓库,就像github一样可以存放很多做好的镜像。比如需要LAMP环境可以去公有仓库里看看有没有合适的镜像,有的话直接下载就可以使用,无需配置。也可以自建仓库,存放适合内部使用的镜像。Docker采用分层构建机制,最底层为bootfs,上层为rootfs。在bootfs中包含了bootloader和kernel,它的作用就是用于引导和启动容器,在容器启动完成后就会卸掉bootfs节约内存,rootfs则是容器的根文件系统。而且不同的镜像如果使用到了相同的内容,只会存一份,节约了磁盘空间。Aufs是Docker最初使用的容器文件系统,而现在最主流的则是overlay2(已经从3.18版本开始被Linux内核合并)、devicemapper(CentOS7早期所使用)。
二、Docker的安装与启动
1、使用YUM安装Docker
前面已经提到过要使用Docker的话系统内核要求3.8以上,所以最好使用CentOS 7作为平台。目前安装Docker的主流方法就是使用第三方YUM仓库,比如阿里云、清华大学等。Docker从V1.13之后分为了CE和EE两个分支,CE为社区免费版,EE为收费版。Docker的版本号也改为用年月命名,如18.03代表18年3月发行的版本。
yum install docker-ce #安装docker-ce程序,老版本中命名则是docker.io、docker-engine、docker
2、使用Docker Machine远程安装Docker
Docker Machine的作用就是可以通过一台配置好Docker Machine的机器对远程其他服务器安装Docker,这个仅需了解即可
3、查看Docker版本信息
使用docker version命令查看当前Docker版本号,使用docker info命令可以查看更详细信息,比如启动了多少个容器、默认的仓库地址、下载了多少镜像等,还有上面说到的文件系统,overlay2。如果提示"Is the docker daemon running on this host",说明服务没有启动,如图:
4、启动Docker服务,由于Docker没有认证机制,所以默认是使用sock文件而不是端口,这样可避免入侵
systemctl start docker.service
systemctl enable docker
#如果要监听端口的话
vi /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}