docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker是一种容器技术,它能够对软件及其依赖进行标准化的打包;容器之间先对独立,基于容器运行的应用之间也是相互隔离的;而且容器之间是共享一个OS kernel的,充分利用服务器资源,容器能够运行在不少主流的操做系统之上。python
容器时在linux上运行,并与其它容器共享主机的内核,它运行一个独立的进程,不占用其它任何可执行文件的内存,很是轻量。虚拟机运行的是一个完成的操做系统,经过虚拟机管理程序对主机资源进行虚拟访问,相比之下须要的资源更多。mysql
docker本质就是宿主机的一个进程,docker是经过namespace实现资源隔离,经过cgroup实现资源限制,经过写时复制技术(copy-on-write)实现了高效的文件操做(相似虚拟机的磁盘好比分配500g并非实际占用物理磁盘500g)linux
namepace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NEWWORD | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8之后的内核才支持) |
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
#查询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
sudo systemctl start docker
sudo docker version
sudo docker run hello-world
docker基于linux内核空间,在基础镜像的基础上一层层构建出用户镜像。容器是镜像的运行实例。经过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所须要的全部内容包含代码,运行时间,库、环境变量、和配置文件。git
docker镜像就是一个只读模板,好比,一个镜像能够包含一个完整的centos,里面仅安装apache或用户的其余应用,镜像能够用来建立docker容器。github
docker image ls docker 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 #经过镜像ID docker history f6509bac4980
#制做base image FROM scratch #使用base image FROM centos FROM ubuntu:14.04
说明:为了安全起见,尽可能使用官方的镜像做为基础镜像。sql
LABEL version="1.0" LABEL description="this is description"
说明:此关键字的做用是定义镜像的元数据,相似于注释及帮助信息,仍是很是必要的docker
RUM yum update && yum install -y vim \ python-dev #反斜线换行
说明:RUN关键字用来执行命令,值得注意的是每运行一次RUN,都会生成一层layer,为了不无用分层,务必合并多条命令成一行,反斜线换行,&&合并成多条命令apache
#若是不存在此目录,则会自动建立目录,并进入目录 WORKDIR /test WORKDIT demo RUN $PWD #输出结果应为/test/demo
说明:WORKDIR设定当前工做目录,进入目录应当使用WORKDIR,避免使用RUN cd,由于RUN会新增层,还有尽可能使用绝对目录。ubuntu
ADD test.tar.gz / #添加到根目录并解压缩 COPY hello /
说明:AND and COPY本地文件添加到Docker Image里面,大部分状况,COPY优于ADD,ADD相比COPY有解压缩的功能。如须要添加远程文件或目录,请使用RUN关键字执行curl或者wget命令。vim
ENV MYSQL\_VERSION 5.7 #设置常量 RUN apt-get install -y mysql-servier= "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量
说明:设置常量,增长可维护性。
docker利用容器来运行应用,容器是从镜像建立的运行实例,它能够被启动,开始、中止、删除、每一个容器都是互相隔离的,保证安全的平台,能够吧容器看作是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
#当前正在运行的容器列表 docker container ls #列出全部容器,包含已退出的 docker container ls -a docker ps -a
docker run centos #以交互模式运行一个容器 docker run -it centos
#指定容器ID删除 docker container rm d02f80816fbb #简写 docker rm d02f80816fbb #删除全部的容器,-q选项只列出容器ID docker rm $(docker container ls -aq) #删除退出状态的容器,-q选项只列出容器ID docker rm $(docker container ls -f "status=exited" -q)
仓库是集中存储镜像文件的地方,registry是仓库注册服务,实际上仓库注册服务器上存放着多个仓库,每一个仓库中又包含了多个镜像,每一个镜像有不一样的标签(tag)。仓库分为两种,即公有仓库和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下载,国内的docker pool,这里仓库的概念与Git相似,registry能够理解为github这样的托管服务