一、Docker的简介

什么是Docker

docker是一个开源的利用容器引擎,基于go语言开发并遵循了apache2.0协定开源。docker是一种容器技术,它能够对软件及其依赖进行标准化的打包;容器之间先对独立,基于容器运行的利用之间也是互相隔离的;并且容器之间是共享一个OS kernel的,充分利用服务器资源,容器能够运行在很多支流的操作系统之上。

容器和虚拟机的区别

容器时在linux上运行,并与其它容器共享主机的内核,它运行一个独立的过程,不占用其它任何可执行文件的内存,十分轻量。虚拟机运行的是一个实现的操作系统,通过虚拟机管理程序对主机资源进行虚构拜访,相比之下须要的资源更多。

  • 容器是app层面的隔离
  • 虚拟机是物理资源层面的隔离

docker架构和底层技术简介

docker实质就是宿主机的一个过程,docker是通过namespace实现资源隔离,通过cgroup实现资源限度,通过写时复制技术(copy-on-write)实现了高效的文件操作(相似虚拟机的磁盘比方调配500g并不是理论占用物理磁盘500g)

底层技术简介

namespace名称空间

namespace的六项隔离
namepace零碎调用参数隔离内容
UTSCLONE_NEWUTS主机名与域名
IPCCLONE_NEWWIPC信号量、音讯队列和共享内存
PIDCLONE_NEWPID过程编号
NEWWORDCLONE_NEWNET网络设备、网络栈、端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8当前的内核才反对)

control group控制组

cgroup的性能
  • 资源限度:能够对工作应用的资源总额进行限度
  • 优先级调配:通过调配的cpu工夫片数量以及磁盘IO带宽大小,实际上相当于管制了工作运行优先级
  • 资源统计:能够统计零碎的资源使用量,如cpu时长,内存用量等
  • 工作管制:cgroup能够对工作执行挂起、复原等操作

二、Docker的环境搭建

CentOS装置docker

  • 返回官网下载页
  • 卸载docker及相干依赖
sudo yum remove docker \      docker-client \      docker-client-latest \      docker-common \      docker-latest \      docker-latest-logrotate \      docker-logrotate \      docker-engine
  • 装置yum-utils工具包
sudo yum install -y yum-utils
  • 增加docker仓库
sudo yum-config-manager \    --add-repo \    https://download.docker.com/linux/centos/docker-ce.repo
  • 装置最新版docker引擎(社区版)
sudo yum install docker-ce docker-ce-cli containerd.io
  • 装置指定版本的docker引擎
#查问docker版本,版本从高到低排序yum list docker-ce --showduplicates | sort -r#装置指定版本的docker,替换<VERSION_STRING>即可sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  • 启动docker
sudo systemctl start docker
  • 查看docker版本
sudo docker version

  • 测验docker引擎被胜利装置
sudo docker run hello-world

三、Docker的镜像、容器和仓库


docker基于linux内核空间,在根底镜像的根底上一层层构建出用户镜像。容器是镜像的运行实例。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包含运行应用程序所须要的所有内容蕴含代码,运行工夫,库、环境变量、和配置文件。

Docker image镜像

Docker镜像是什么

docker镜像就是一个只读模板,比方,一个镜像能够蕴含一个残缺的centos,外面仅装置apache或用户的其余利用,镜像能够用来创立docker容器。

  • 文件(root filesystem)和meta data的汇合
  • image是分层的,并且每一层都能够增加、批改、删除文件,成为一个新的image
  • 不同的image能够共享雷同的layer
  • image自身是read-only只读的

Docker镜像相干命令

  • 查看本地已有的镜像列表
docker image lsdocker images

  • 删除镜像
docker image rm f6509bac4980#简写docker rmi f6509bac4980
  • 构建镜像
#依据dockerfile构建一个镜像docker image build#从一个被扭转的容器创立一个新的镜像docker container commit#简写,从一个被扭转的容器创立一个新的镜像docker commit
  • 从镜像仓库拉取镜像
#默认从docker hub拉取docker pull ubuntu:14.04
  • 查看指定镜像的创立历史
#通过镜像名称docker history mysql:5.7#通过镜像IDdocker history f6509bac4980

Dockerfile语法及实际

dockerfile语法

  • dockerfile官网参考文档
FROM关键字
#制作base imageFROM scratch#应用base imageFROM centosFROM ubuntu:14.04

阐明:为了平安起见,尽量应用官网的镜像作为根底镜像

LABEL关键字
LABEL version="1.0"LABEL description="this is description"

阐明:此关键字的作用是定义镜像的元数据,相似于正文及帮忙信息,还是十分必要的

RUN关键字
RUM yum update && yum install -y vim \python-dev #反斜线换行

阐明:RUN关键字用来执行命令,值得注意的是每运行一次RUN,都会生成一层layer,为了防止无用分层,务必合并多条命令成一行,反斜线换行,&&合并成多条命令

WORKDIR关键字
#如果不存在此目录,则会主动创立目录,并进入目录 WORKDIR /test WORKDIT demo RUN $PWD #输入后果应为/test/demo

阐明:WORKDIR设定当前工作目录,进入目录该当应用WORKDIR,防止应用RUN cd,因为RUN会新增层,还有尽量应用相对目录。

ADD和COPY关键字
ADD test.tar.gz / #增加到根目录并解压缩COPY hello /

阐明:AND and COPY本地文件增加到Docker Image外面,大部分状况,COPY优于ADD,ADD相比COPY有解压缩的性能。如须要增加近程文件或目录,请应用RUN关键字执行curl或者wget命令。

ENV关键字
ENV MYSQL\_VERSION 5.7 #设置常量 RUN apt-get install -y mysql-servier= "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #援用常量

阐明:设置常量,减少可维护性

VOLUME关键字
EXPOSE关键字
CMD关键字
ENTRYPOINT关键字

Docker container容器

Docker container容器是什么

docker利用容器来运行利用,容器是从镜像创立的运行实例,它能够被启动,开始、进行、删除、每个容器都是相互隔离的,保障平安的平台,能够吧容器看做是要给简易版的linux环境(包含root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序

  • 容器通过image创立(copy)
  • 容器在imagelayer之上建设要一个container layer(可读写)
  • image负责app的存储和散发,container负责运行app
  • 容器与镜像的关系相似于类和实例的关系

Docker容器相干命令

  • 查看容器列表
#以后正在运行的容器列表docker container ls#列出所有容器,蕴含已退出的docker container ls -adocker ps -a

  • 运行一个容器
docker run centos#以交互模式运行一个容器docker run -it centos
  • 删除容器
#指定容器ID删除docker container rm d02f80816fbb#简写docker rm d02f80816fbb#删除所有的容器,-q选项只列出容器IDdocker rm $(docker container ls -aq)#删除退出状态的容器,-q选项只列出容器IDdocker rm $(docker container ls -f "status=exited" -q)

Docker repository仓库

Docker repository仓库是什么

仓库是集中存储镜像文件的中央,registry是仓库注册服务,实际上仓库注册服务器上寄存着多个仓库,每个仓库中又蕴含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为两种,即私有仓库和公有仓库,最大的公开仓库是docker Hub,寄存了数量宏大的镜像供用户下载,国内的docker pool,这里仓库的概念与Git相似,registry能够了解为github这样的托管服务