Docker的镜像是增量的修改,每次创建新的镜像都会在老的镜像上面构建一个增量的层
,使用到的技术是Another Union File System(AUFS)。
要创建一个Docker的镜像,可以通过:
1 从Docker Hub 下载
2 通过Dockerfile创建
3 通过 docker import来导入一个容器快照而生成一个新的镜像
4 通过 docker commit 提交对容器的修改生产一个新的镜像
5 通过 docker load 来导入一个保存的镜像文件
使用Docker Hub 查找和下载镜像
Docker Hub 是Docker官方提供公共仓库,提供大量的常用镜像,由于国内网络原因经常连接Docker Hub会比较慢,所以我们也可以选择一些国内提供类似Docker Hub镜像服务站点。连接Docker Hub的常用命令包括:
搜索镜像 docker search
下载镜像 docker pull
通过Dockerfile创建镜像
Dockerfile文件里包含若干条命令,每个命令都会创建一个新的层,Dockerfile创建的层数不可以超过127层。
下面是官方网站上的一个Dockerfile sample
FROM docker/whalesay:latest RUN apt-get -y update && apt-get install -y fortunes CMD /usr/games/fortune -a | cowsay
创建好Dockerfile之后可以通过Docker build来创建image
$ docker build --help Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile
比如 docker build -t imagename:tagname .
查看本地镜像
docker images 命令查看本地的镜像列表,信息包括:
REPOSITORY:仓库名称
TAG:标签名,一个仓库可以有若干个标签对应不同的镜像,默认都是latest
IMAGE ID:镜像ID
CREATED:创建时间,注意不是本地的pull时间
SIZE:镜像大小
其中需要注意的是运行容器时候如果不指定镜像的TAG,则默认为latest。镜像的唯一标识符是镜像ID,不是TAG,有的时候同一个镜像可以有不同的TAG,但实际指向的是同一个镜像ID。TAG可以理解为镜像的别名。
查看镜像详细信息 docker inspect
docker inspect
可以查看指定镜像的详细信息。这条命令可以查看容器或镜像的详细信息,输出是一个JSON格式的内容,比较重要的信息是创建时间,启动命令等。
常用的参数是--format, -f, 用来指定输出的格式,比如:
获取instance的log path
docker inspect --format='{{.LogPath}}' $INSTANCE_ID
导出及导入镜像
镜像可以被导出到本地文件,也可以从本地文件中加载。导出命令是 docker save
命令,导出后的镜像如果需要导入到新的Docker 服务器,则使用docker load
命令。
docker save
可以用于备份一个镜像,用法如下:
$ docker save busybox > busybox.tar $ ls -sh busybox.tar $ docker save --output busybox.tar busybox $ ls -sh busybox.tar $ docker save -o fedora-all.tar fedora $ docker save -o fedora-latest.tar fedora:latest
docker load
从STDIN或者tar 包加载一个镜像
$ docker load < busybox.tar.gz
$ docker load --input fedora.tar
注意:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
更新/删除镜像
docker commit
如果需要对镜像进行更新的话,一种方法是创建容器,在容器中进行修改,然后将修改后容器提交到镜像中。提交使用 docker commit
命令。
注意:本方法不推荐用在生产系统中,未来会很难维护镜像。最好的创建镜像的方法是Dockerfile,修改镜像的方法是修改Dockerfile,然后重新从Dockerfile中构建新的镜像。
docker commit -m 'add 3 dirs' -a 'author' -p updateimage newimage
几个参数的说明:
- -m 本次提交的描述
- -a 指定镜像作者信息
- -p 提交时暂停容器运行
- 容器的ID或名称
- 目标镜像
如果指定了目标镜像,Docker会创建新的镜像。
docker rmi
docker rmi
命令可以删除本地的镜像,删除前需要先使用docker rm
删除所有依赖该镜像的容器。
docker rmi -f
可以强制删除存在容器依赖的镜像,但这不是一个好习惯,请先删除容器再清理镜像。