镜像
镜像是运行容器的前提。
获取镜像
docker [image] pull NAME[:TAG]
NAME 镜像仓库名称,用来区分镜像
TAG 镜像标签,往往表示版本信息,不显示指定,默认latest标签(跟踪最新版本的变化,不稳定)
通常情况下描述一个镜像需要包括“名称 + 标签”信息
镜像文件一般由若干层(layer)组成,当不同的镜像包含相同的层时,本地仅存储层的一份,减小存储空间
在不同的镜像仓库服务器可能出现镜像同名的情况,镜像的仓库名中还应添加仓库地址(register 注册服务器)作为前缀,默认官方docker hub仓库,前缀可忽略,例如:
docker pull ubuntu:18.04 相当于 docker pull register.hub.docker.com/ubuntu:18.04
pull 子命令支持的选项主要包括:
- -a, --all-tags=false | true: 是否获取仓库的所有镜像,默认否
- --disable-content-trust: 取消镜像的内容校验,默认真
- --registry-mirror=proxy_URL: 指定代理服务器地址
下载镜像到本地后,即可使用,例如用该镜像创建一个容器,在其中运行bash应用,执行打印"hello world"
docker run -it ubuntu:18.04 bash
root@xxxxxxxxx:/# echo "hello world"
查看镜像信息
1. 使用images命令列出镜像
- docker images
- docker image ls
root@ip-172-31-17-146:/etc# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 9f38484d220f 5 months ago 202MB
仓库 镜像标签 镜像ID(唯一标识镜像) 创建时间(镜像最后的更新时间) 镜像大小(逻辑体积,优秀的一般体积较小)
images子命令支持的选项:
- -a, --all=true | false: 列出所有(包括临时文件)镜像文件,默认为否
- --digests=true | false: 列出镜像的数字摘要值
- -f, --filter=[]: 过滤列出的镜像。例如dangling=true只显示没有被使用的镜像;也可指定带有特殊标注的镜像等。
- --format="TRMPLATE": 控制输出格式。如.ID代表ID信息,.Repository代表仓库信息
- --no-trunc=true | false: 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是
- -q, --quiet=true | false: 仅输出ID信息,默认为否
其中,还支持对输出结果控制的选项,如 -f, --filter=[], --no-trunc=true | false, -q, --quiet=true | false等
更多子命令通过 man docker-images 查看
2. 使用tag命令添加镜像标签
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
添加一个新的 myubuntu:latest 镜像标签
docker tag ubuntu:latest myubuntu:latest
再次使用 docker images ,多了 myubuntu:latest 标签的镜像,ID和ubuntu:18.04完全一致
3. 使用inspect命令查看详细信息
- docker [image] inspect
作者,适应架构,各层的数字摘要等。
如果想要 获取其中一项,可以使用 -f 来指定,例如获取镜像的 Architecture:
docker [image] inspect -f {{".Architecture"}} ubuntu:18.04
{{ ".Architecture" }} Wrong 不能有空格
4. 使用history命令查看镜像历史
列出各层的创建信息
- docker history ubuntu:18.04
过长的信息被截断了,可以使用 --no-trunc 输出完整命令
搜寻镜像
docker search 搜docker hub官方仓库
docker search [options] keyword
支持的命令选项主要包括:
- -f, --filter filter: 过滤输出内容
- --format string: 格式化输出内容
- --limit int: 限制输出个数,默认25个
- --no-trunc: 不截断输出结果
搜官方提供带nginx关键字镜像:
root@ip-172-31-17-146:/etc# docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11837 [OK]
镜像名字 描述 收藏数 是否官方创建 是否自动创建
搜索收藏数超过4的关键词包括Tensorflow的镜像
docker search --filter=starts=4 tensorflow
删除和清理镜像
1. 使用标签删除镜像
docker rmi
docker image rm
- docker rmi IMAGE [IMAGE ...],其中 IMAGE 可以是标签或ID
支持选项:
- -f, -force: 强制删除,即使有容器依赖它
- -no-prune: 不要清理未带标签的父镜像
例如删掉myubuntu:latest镜像
docker rmi myubuntu:latest
如果一个ID对应多个标签,删的是副本,即取消tag;如果只有一个,则完全删除
2.使用ID删除镜像
- docker rmi ID(也可以是能区分的前缀)
先尝试删除指向该镜像的标签,然后删除该静态文件本身。
当有该镜像创建的容器存在时,镜像文件默认无法被删除,
docker ps -a 可以看到本机存在的所有容器
强制删除使用 docker rmi -f ubuntu:18.04,不推荐。
正确的做法是,先删除依赖该镜像的所有容器(docker rm),再删除镜像
3.清理镜像
遗留的临时镜像文件,没有被使用的镜像
- docker image prune
支持选型:
- -a, -all: 删除所有无用镜像,不光是临时镜像
- -filter filter: 只清理符合给定过滤器的镜像
- -f, -force: 强制删除镜像,而不是进行提示确认
如下命令会清理临时遗留的镜像文件层,最后会提示释放的空间:
docker image prune -f
创建镜像
1.基于已有镜像的容器创建
- docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
- -a, ---author=""
- -c, --change=[]: 提交时候执行Dockerfile指令,包括CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBULLD | USER | VOLUME | WORKDIRD等
- -m, --message=""
- -p, --pause=true: 提交时暂停容器运行
$ docker run -it ubuntu:18.04 /bin/bash
[root@14c020d8328c /]# touch test
[root@14c020d8328c /]# exit
$ docker [container] commit -m "Added a new file" -a "Docker Newbee" ID(14c020d8328c) test:0.1
sha256:e138c5ed2186f264a889377fccd6a3bfe81526f657b330980617d3d7a6374299
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 e138c5ed2186 49 seconds ago 202MB
centos latest 9f38484d220f 5 months ago 202MB
2.基于本地模板导入
- docker [container] import [OPTIONS] file | URL | - [REPOSITORY[:TAG]]
可以使用openVZ的模板创建
下载了ubuntu18.04的模板压缩包,之后使用一下命令导入即可:
cat ubuntu......tar.gz | docker import - ubuntu:18.04
3.基于Dockerfile创建
最常见的方式。Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
例如,基于debian:stretch-slim镜像安装Python3环境,构成一个新的python:3镜像:
FROM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@github>"
RUN apt-get update && \
apt-get install -y python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
创建镜像的过程可以使用 docker [image] build 命令,编译成功后本地将多出一个python:3镜像:
docker [image] build -t python:3
存出和载入镜像
1.存出镜像
- docker [image] save
支持参数:
- -o, -output string: 导出到指定文件
例如,导出本地的ubuntu:18.04镜像为文件ubuntu_18.04.tar:
docker save -o ubuntu_18.04.tar ubuntu18.04
2.载入镜像
- docker [image] load
支持参数:
- -i, -input string
- <
例如:
docker load -i ubuntu_18.04.tar 或者
docker load < ubuntu_18.04.tar
导入镜像和相关元信息
上传镜像
- docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/] NAME[:TAG]
默认上传到docker hub(需登陆)
例如,用户user上传本地的test:latest镜像,可以先添加标签user/test:latest,然后用docker [image] push上传:
docker tag test:latest user/test:latest
docker push uset/test:latest
第一次上传需要登陆,登陆信息保存在本地 ~/.docker 目录下
docker image help
注意积累自己定制的镜像