在 Docker 体系里,有四个对象 ( Object ) ,几乎所有 Docker 以及周边生态的功能,都是围绕着它们所展开的。它们分别是:镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )
镜像 ( Image )
所谓镜像,可以理解为一个 只读的 文件包,其中包含了 虚拟环境运行最原始文件系统的内容
每次对镜像内容的修改,Docker 都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。当然,每一个镜像层单独拿出来,与它之下的镜像层都可以组成一个镜像。
另外,由于这种结构,Docker 的镜像实质上是无法被修改的,因为所有对镜像的修改只会产生新的镜像,而不是更新原有的镜像。
查看镜像
1 | docker images |
获取镜像
1 | docker pull node |
搜索镜像
1 | docker search node |
当然上面的太极客了,我一般是去Docker Hub搜索
使用阿里云仓库
linux 下
1 | sudo vim /etc/docker/daemon.json |
Docker Desktop直接在首选项的Daemon面板添加Registry mirrors项即可
从容器创建一个新的镜像
1 | docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 |
标记镜像
1 | docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] |
保存镜像
将指定镜像保存成tar包
1 | docker save -o my_node_v1.tar node |
导入镜像
只是导入
1 | docker load -i my_node_v1.tar |
从压缩包创建镜像
1 | docker import my_node_v1.tar my_node_v1 |
查看镜像创建历史
1 | docker history my_node_v |
查看镜像元数据
1 | docker inspect IMAGE |
删除镜像
通俗易懂,牛逼的在下面
1 | docker rmi IMAGE |
构建镜像
参见Dockerfile部分
实用技巧
删除untagged镜像
构建镜像时产生的中间层,那些id为
1 | docker rmi $(docker images | grep "^<none>" | awk "{print $3}") |
删掉全部镜像
1 | docker rmi $(docker images -q) |
镜像缓存
利用上面每一层不可修改的特性,每次的修改会产生缓存层,在制作自己的镜像时可以加速镜像的构建
例如: 精油官网的Dockerfile
1 | FROM node:8.16.0-alpine |
执行编译结果
1 | Building webapp |