Docker是在linux容器里运行应用的开源工具,是一种轻量级的虚拟机。Docker包含三大核心概念,分别是:镜像、容器和仓库。Docker的容器技术能够在一台主机上轻松的为任何应用建立一个轻量级的、可移植的、自给自足的容器。经过这种容器打包应用程序,意味着简化了从新部署、调试这些琐碎的重复工做。极大地提升了工做效率。linux
Docker容器与传统虚拟化的比较nginx
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力消耗 | 几乎无 | 消耗50% |
性能 | 接近原生 | 弱于 |
单机系统支持量 | 上千个 | 几十个 |
隔离性 | 资源限制 | 彻底隔离 |
Docker的镜像是建立容器的基础,相似虚拟机的快照,能够理解为一个面向Docker容器的只读模板。例如,一个镜像能够是一个完整的centos操做系统环境,成为一个centos镜像;也能够是一个安装了MySQL的应用程序,称为一个MySQL镜像。docker
Docker的容器是从镜像建立的运行实例,它能够被启动、中止和删除。所建立的每个容器都是相互隔离、互不可见的,能够保证平台的安全性。能够把容器看做是一个简单的linux环境,Docker利用容器来运行和隔离应用。json
Docker仓库是用来集中保存镜像的地方,当建立了本身的镜像以后,可使用push将它上传到公共仓库或者私有仓库,这样,当你下次要在另外一台机器上使用镜像时,只须要pull下来便可。vim
Docker支持在主流的操做平台上使用,包括Windows、Linux、MacOS等,本次使用Docker的yum源来进行安装。centos
vim /etc/yum.repo.d/docker.repo [docker] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg
yum -y install docker-engine
systemctl start docker.service //开启服务 systemctl enable docker.service //设置为开机自启
在使用Docker的过程当中涉及到从仓库下载镜像,利用国外的源下载镜像时,有时下载速度会特别慢,这里我使用的阿里云的镜像加速服务。安装安装1.10.0以上版本的Docker客户端安全
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://j0bdjvov.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
参考:阿里云容器镜像服务bash
docker version //查看所使用Docker版本
使用docker search + 关键字的方式,搜索远端仓库中的镜像,搜索返回不少包含关键字的镜像,其中返回信息包含镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方建立(OFFICIAL)、是否主动建立(AUTOMATED)。默认的输出信息会按照星级进行排序,星级表示了镜像的受欢迎程度,越高越好用。这里我以httpd为例搜索。服务器
docker search httpd
docker pull httpd
从下载的过程能够看出,镜像文件由若干层(layer)组成,这种组成方式称之为AUFS(联合文件系统),是实现增量保存与更新的基础,下载过程当中会输出镜像的各层信息。ide
docker images //查询系统中全部镜像的信息
参数信息:
命令格式:docker inspect 镜像id号
docker inspect 11426a19f1a2
镜像名称的改变包括镜像名称和镜像标签,使用 docker tag进行修改,httpd(修改后名称,自定义):lamp(修改后标签,自定义)
docker tag httpd httpd:lamp
使用docker rmi删除多余的镜像,可使用镜像的标签或者是镜像id删除镜像,当一个镜像有多个标签时,删除命令只会删除该镜像多个标签中的指定标签,并不会影响镜像文件。
当须要将一台机器上的镜像迁移到另外一台机器使用时,需将镜像保存为本地文件,这一过程叫作存出镜像,镜像存出保存在当前目录。
docker save -o nginx nginx:latest
将存出的镜像拷贝到另外一台机器上使用,而后将该导出文件导入到该机器的镜像库中,这一过程叫作载入镜像,这里载入的方式有两种,使用的方式也不尽相同。
docker load < nginx //方式一 docker --input nginx //方式二
使用官方的镜像仓库(Docker Hub),或者采用阿里云镜像仓库。
$ sudo docker login --username=[用户名] registry.cn-qingdao.aliyuncs.com 用于登陆的用户名为阿里云帐号全名,密码为开通服务时设置的密码。
$ sudo docker pull registry.cn-qingdao.aliyuncs.com/[命名空间/仓库名称]:[镜像版本号]
$ sudo docker login --username=46877806@qq.com registry.cn-qingdao.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/[命名空间/仓库名称]:[镜像版本号] $ sudo docker push registry.cn-qingdao.aliyuncs.com/[命名空间/仓库名称]:[镜像版本号] //请根据实际镜像信息替换示例中的[ImageId]、[镜像版本号]和[命名空间/仓库名称]参数。
参考:阿里云容器镜像服务
容器的建立是将镜像加载到容器的过程,Docker的容器十分轻量级,用户能够随时建立或者删除。新建立的容器默认处于中止状态,不运行任何程序,须要在其中发起一个进程来启动容器,这个进程是该容器的惟一进程,因此当该进程结束的时候,容器也会彻底中止。中止的容器从新启动并保留原来的修改。在建立完成容器时会返回惟一的ID。
docker create -it nginx:latest /bin/bash //-i 让容器的输入保持打开 -t 让Docker分配一个伪终端 docker ps -a //查看全部容器的运行状态 -a 显示系统最近一次启动的容器
docker start 9ced2c379b0b //能够是容器的id或者是容器名称
用户能够直接执行docker run,直接建立并启动容器,等同于先执行docker create,再执行docker start。须要注意的是,一旦命令执行结束,容器也会中止。当运用docker run来建立容器时,Docker在后台的标准过程是:
docker run centos /usr/bin/bash -c ls /
docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
docker stop 9ced2c379b0b
想要进入容器,要确保容器处于up状态
用户能够将任何一个docker容器从一台机器迁移到另外一台机器,在迁移过程当中首先要将已经建立好的容器导出为文件,不管容器是处于运行状态仍是关闭状态都可导出,导出以后将文件传输到其余机器上,使用导入命令,实现容器的迁移。
docker export cc10d2c6a7b3 > centos7 cat centos7 | docker import - centos7:test
对于容器的删除,通常是对处于关闭状态的容器操做,可是也可对处于运行状态的容器进行,使用-f选项,不推荐。
docker rm cc10d2c6a7b3
Cgroup是Control group的简写,是Linux内核提够的一种限制使用物理资源的机制,主要包括CPU、内存、blkio。
使用 --cpu-quota 选项来限制cpu的使用率,cpu的百分比是以1000为单位
docker run --cpu-quota 20000 容器名 //cpu的使用率限定为20%
docker run --cpu-shares 1024 容器A docker run --cpu-shares 1024 容器B docker run --cpu-shares 1024 容器C //此时cpu的分配比例为1:1:2
使用 --cpuset-cpus选项来使某些程序独享cpu内核,以便提升其处理速度,选项0表示第一个内核,依次第二个,第三个。
docker run --cpuset-cpus 0,1,2,3 容器名 //使容器绑定1~4内核使用
docker容器中经过命令来限制内存使用量,当容器Cgrop使用的内存超过了限制的容量,Linux内核将会尝试回收这些内存,若是依旧没法控制内存使用在限制范围以内,进程将会被杀死。
docker run -m 1024m 容器名 //限制使用内存为1G
若是在一台服务器上进行容器的混合部署,那么会出现同时有几个程序写磁盘数据的状况,这时能够经过--device-write-iops选项来限制写入的iops,相应的还有--device-read-bps选项限制读取的iops。该方法只针对blkio限制的是设备,而不是分区。
docker run --device-write-bps /dev/sda1:1mb 容器名 //限制容器的/dev/sda1的写入ipos为1MB