#二、 镜像

##2.1 镜像工作原理:

下载docker镜像文件 docker镜像文件删除层_docker

当启动一个新的容器时,docker会加载只读镜像,并在其之上添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID目录下,可以使用chroot进入此目录。
如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的文件会被覆盖,但还存在,==》实现了文件系统隔离。
当删除容器后,读写层的数据将会删除,只读镜像不变。
docker相关文件存放在:/var/lib/docker目录下
/var/lib/docker/aufs/diff #每层与其父层之间的文件差异
/var/lib/docker/aufs/layers # 每层一个文件,记录其父层一直到根层之间的ID,大部分文件的最后一行一样??。。表示继承来自同一层。
/var/lib/docker/aufs/mnt # 联合挂载点从只读层复制到嘴上层,可读写层的文件系统数据
在建立镜像时,每次写操作,都被视作一种增量操作,即在原有的数据层上添加一个新层,所以一个镜像会有若干个层组成,每次commit提交就会产生一个ID,就相当于在上一层又加了一层,可以通过这个ID对镜像回滚。
官网:
hub.docker.com/explore 国内源,提高下载速度:

curl -SL https://get.daocloud.io/daotools/set_mirror.sh | sh -s  http://04be47cf.m.daocloud.io

举例子
比如拽一个ubuntu,会比较快

docker pull ubuntu
docker  run  -itd  --name  test01  ubuntu #创建一个test01的container,获取ID,x

下载docker镜像文件 docker镜像文件删除层_docker_02

所有信息都在/var/lib/docker 下

下载docker镜像文件 docker镜像文件删除层_docker_03

会在containers目录下生成此容器的目录:

ll  /var/lib/docker/containers/

下载docker镜像文件 docker镜像文件删除层_ubuntu_04

##2.2 镜像安装与使用
###2.2.1 管理命令

命令

说明

search

#docker search mysql ;从repo模糊查询

pull

#下载 docker pull mysql

push

#push 到本地仓库 或docker hub上

images

#docker images 查看本地镜像

commit

将一个更改的镜像内容更新提交

比如,我在一个test容器里写 2 个文件
docker attach test01

touch home/{a.txt,b.txt}
ctrl +p +q 退出
再确认下文件在不在,docker exec test01 ls /home # 能看到a.txt,b.txt
删掉容器后,读写层的东西就没了,即a.txt;b.txt也会没了,
测试如下:
删除这个test01容器 docker rm test01

docker run -itd --name  test01  ubuntu
docker exec  test01  ls /home  #a.txt.b.txt没有了

但,我想保存读写层的东西:

docker exec test01  touch /home/{a.txt,b.txt} #在test01容器里创建 a.txt,b.txt

docker exec test01  ls  /home  #查看是否创建成功,成功后: 		
docker commit  test01  ubuntu:self 	 #提交新镜像
docker run  -itd  --name test02 ubuntu:self    #基于新镜像生成新容器,如下:

下载docker镜像文件 docker镜像文件删除层_下载docker镜像文件_05

docker  exec  test02  ls  /home  #查看基于新镜像生成的容器是否成功(有文件ok)

下载docker镜像文件 docker镜像文件删除层_下载docker镜像文件_06

命令

说明

build

#通过dockerfile 构建镜像

rmi

#删除镜像 docker rmi ubuntu

export

#导出容器的文件系统 -> 导入到一个tar包中(只读层)

...|例1:	#docker  export  test01  >  test01.tar

import |#导入 tar 包生成镜像 docker import test01.tar var_newImageName(新镜像名)

docker import test01.tar  ubuntu2

下载docker镜像文件 docker镜像文件删除层_docker_07

docker images

下载docker镜像文件 docker镜像文件删除层_mysql_08

docker run  -itd --name test03 ubuntu2   #现在使用导入的镜像生成容器,会报错

下载docker镜像文件 docker镜像文件删除层_下载docker镜像文件_09

docker run  -itd --name test03 ubuntu2  /bin/bash  #需添加运用啥解释器来运行此 文件系统

下载docker镜像文件 docker镜像文件删除层_ubuntu_10

save

#将整个镜像导出 docker save mysql > mysql.tar

load

#docker load -i mysql.tar #新名字不用指定,以原有镜像名字为准

镜像加速器

vim /etc/docker/daemon.json
		{
		  "registry-mirrors": [
		    "https://registry.docker-cn.com"
		  ]
		}

之后重新启动服务。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

检查加速器是否生效:

docker info

期望:

Registry Mirrors:
https://registry.docker-cn.com/

Successful !