#二、 镜像
##2.1 镜像工作原理:
当启动一个新的容器时,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
所有信息都在/var/lib/docker 下
会在containers目录下生成此容器的目录:
ll /var/lib/docker/containers/
##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 exec test02 ls /home #查看基于新镜像生成的容器是否成功(有文件ok)
命令 | 说明 |
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 images
docker run -itd --name test03 ubuntu2 #现在使用导入的镜像生成容器,会报错
docker run -itd --name test03 ubuntu2 /bin/bash #需添加运用啥解释器来运行此 文件系统
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 !