Docker 将应用程序与该程序的依赖,打包在一个文件里面,该文件包括了所有打包的应用程序的所有依赖,像数据库等;直接运行该文件,就可以让程序跑起来,从而不用再去考虑环境问题。
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板
。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体
。
Docker利用容器独立运行一个或一组应用,容器是用镜像创建的运行实例
它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证安全的平台
可以把容器看做是一个简易版的LINUX环境
(包括root用户权限,进程空间,用户空间和网络空间等)和运行在器中的应用程序。
容器的定义和镜像几乎一样,也是一堆层的统一视角,唯一的区别是容器的最上面那一层是可读可写的
仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载
。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
因为镜像包含操作系统完整的root 文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层
。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
或者通过下载源安装:
yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
或者离线安装:
下载rpm文件
rpm -ivh docker-engine-1.7.1-1.el6.x86_64.rpm
先卸载老版本的Docker
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-config-manager --enable docker-ce-nightly
sudo yum-config-manager --enable docker-ce-test
sudo yum-config-manager --disable docker-ce-nightly
安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
启动Docker
sudo systemctl start docker
参考官方文档:
https://docs.docker.com/engine/install/centos/
阿里云镜像加速,官网链接:
阿里云镜像加速
注册阿里云账号,点击容器镜像服务,镜像加速器,获取个人加速器地址。不同系统对应的配置方法在操作文档配置镜像加速器位置。Centos的配置加速器方法针对于centos7。
centos6在配置文件中配置阿里云镜像加速器
针对Centos6.8,编辑配置文件
vim /etc/sysconfig/docker
修改other_args后面的内容,改为–registry-mirror=个人镜像地址。
service docker restart 重启docker
centos7以上配置阿里云加速器
注意:daemon.json该文件可能不存在,这个时候正常创建即可
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
配置完重启服务即可
命令1:sudo systemctl daemon-reload
命令2:sudo systemctl restart docker
启动docker后台容器,测试运行hello-world
docker run hello-world
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟
同一个仓库源可以有多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY :TAG来定义不同的镜像
如果你不指定一个镜像的版本标签,例如只适用ubuntu,docker将默认使用ubuntu:latest镜像
OPTIONS说明:
docker images -a
docker images -qa
docker images --digests
docker images --no-trunc
网站:
https://hub.docker.com
命令:
docker search [OPTIONS] 镜像名字
OPTIONS说明:
–automated:弃用,只列出自动构建类型的镜像
–filter , -f:基于给定条件过滤输出
–format:使用模板格式化显示输出
–limit:Max number of search results ,默认值25
–no-trunc:禁止截断输出
–stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到–filter中使用
搜索镜像名中包含busybox的镜像
docker search busybox
搜索不小于3星,描述不截断,镜像名中包含busybox的镜像
docker search --filter=stars=3 --no-trunc busybox
限制搜索输出个数
docker search redis --limit 5
docker search的使用详解
docker pull tomcat 等价于 docker pull tomcat:latest,拉取最新版本
docker pull tomcat :8.0 拉取tomcat8.0版本
-f是强制删除
首先下载一个Centos镜像演示: docker pull centos
以刚刚拉取的centos的镜像ID为模板生成一个对应的容器,30f779ea5784可以看做生成的容器的地址
手动指定容器名字,此时会依照centos镜像重新生成一个容器实例,该容器的名字叫做mycentos01
docker start 容器ID或者容器名
docker restart 容器ID或者容器名
docker stop 容器ID或者容器名
docker kill 容器ID或者容器名
docker rm 容器ID
一次性删除多个容器:
加上-f就是删除已经关闭的容器,没有加上-f就是关闭当前容器然后删除
对比交互式容器: 使用centos:latest以交互模式启动一个容器,在容器内部指向/bin/bash命令
docker run -it centos /bin/bash (/bin/bash可以省略,因为默认都是以此种方式进行交互)
docker logs -f -t --tail 容器ID
docker run -d centos /bin/sh -c “while true;do echo hello zzyy;sleep 2;done”
以后台的形式运行centos,循环打印hello zzyy,每隔两秒打印一次,这样前台就会有响应,以后台启动centos也不会被关闭
docker top 容器ID
docker inspect 容器ID
docker exec -it 容器ID bashShell
重新进入: docker arrach 容器ID
上面两个的区别:
exec命令可以直接进入容器,然后执行,或者可以直接在外面执行,获取到结果
docker cp 容器ID: 容器内路径 目的主机路径
例如:
docker cp 容器ID:/tmp/yum.log /root