docker镜像和容器和存储
Image的repository实际是名字,tag却是通常表示版本(多个标签也可能对应同一个镜像),不带tag,默认就是latest
image的ID是SHA256的摘要值,对配置文件(manifest)计算出的,这倒是不错。
没有FROM
指令,或是FROM scratch的Dockerfile所构建的镜像是基础镜像(base image)
华为云容器镜像服务,有镜像加速器,配置好后可以检查docker info
Registry Mirrors
:
https://08e8a7ac66000f3d0f6ec00af19568e0.mirror.swr.myhuaweicloud.com/
docker history看镜像构建历史,missing表示对应层不在本地构建也不可用,忽略之。
Dockerfile可以类比Makefile来理解
Register(Docker Hub)可以类比Git托管(GitHub)来理解
容器本质上是进程,但是与主机上的进程不同在于,它运行在自己的独立的名称空间内,因此在一个隔离的环境里。
自动生成的容器名称可以用 docker rename改名
容器与镜像的主要不同是容器在镜像上面多加一个可写层,其大小可以用docker ps -s查看
Copy-on-Write(CoW)写时拷贝。不写时直接访问。
要写时,先搜索,一次一层往下找,找到的第一个执行copy_up,拷贝到容器可写层,任何修改针对这个副本,底层的只读副本对容器不可见。
当attach到一个运行的容器(一般是detach/daemon方式运行的),要CTRL-C不停止容器,可以加参数 --sig-proxy=false
。这是直接连接到容器启动命令的终端。当多个终端窗口同时attach,都会同步显示。
而exec -it
进入容器操作,是彼此独立的。这是打开新的终端,启动新的进程。
--sig-proxy Proxy all received signals to the process (default true)
容器导出,就是快照,会丢失所以元数据和历史记录,仅保存容器当时的状态,相当于传统的虚拟机快照。
但是导入,是生成一个镜像,再基于镜像创建容器才完成容器的迁移。
docker commit可以从容器创建一个新的镜像。提交可写层的修改。
虽然容器有可写层,但是生产上数据是要使用Docker卷写入。
info看存储驱动。
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true #目录条目类型
Native Overlay Diff: true
userxattr: false
可以用mount 看overlay存储驱动的挂载情况
使用卷,会绕过存储驱动。
卷、绑定、tmpfs这是3种挂载类型,区别在数据在主机中存放的位置的不同。
tmpfs是内存里。卷默认是/var/lib/docker/volumes里,由docker管理,非docker进程不能修改。绑定可以存储到主机系统的任何位置,可以用于共享配置文件(比如/etc/localtime挂载让容器的时区设置与主机一致 date +%z查看)等。
docker volume ls列出当前的卷
查看容器可写层大小,并格式化只显示感兴趣部分
docker ps --format "table {{.Image}}\t{{.Size}}"
- 点赞
- 收藏
- 关注作者
评论(0)