docker 实践二:操作镜像

本篇我们来详细介绍 docker 镜像的操作。

注:环境为 CentOS7,docker 19.03

之前已经说过,容器是 docker 的核心概念之一,所以对应的就需要知道它的使用方法,接下来我们就来了解 docker 镜像的添加、删除、查找等操作。

获取镜像

docker 获取镜像使用的命令为:docker [image] pull NAME[: TAG]

  • pull:docker 的子命令,用来获取仓库中的镜像
  • NAME:镜像的名称
  • TAG:TAG是镜像的标签(往往⽤来表⽰版本信息)

例如我们获取一个 Ubuntu18.04 系统的基础镜像,就可以使用命令:

docker pull ubuntu:18.04

如果不指定版本,默认就拉取最新的版本 ubuntu:latest

注:一般来说,镜像的 latest 表示该镜像内容为最新,出于稳定性考虑,不要在生产中使用最新版本的,最好拉取是带上版本号。

使⽤docker pull命令下载中会获取并输出镜像的各层信息。 当不同的镜像包括相同的层时, 本地仅存储了层的⼀份内容, 减⼩了存储空间。

如果我们要从指定的仓库中拉取,可以通过补全镜像的路径实现,例如从网易上拉取 ubuntu18.04,命令如下:

docker pull hub.c.163.com/public/ubuntu:18.04

pull⼦命令⽀持的选项主要包括:

  • -a, --all-tags=true|false: 是否获取仓库中的所有镜像, 默认
  • --disable-content-trust: 取消镜像的内容校验, 默认为真

一般在国内,拉取官方的镜像速度,所以我们可以改成默认从国内云服务供应商的仓库上拉取,比如阿里云的。需要修改配置文件如下:

# cat /etc/docker/daemon.json 
{
      "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}

下载了镜像后,我们就可以使用它了:

# docker run -it ubuntu:18.04 bash
root@fe3ce439f6dc:/# echo "Hello World"
Hello World
root@fe3ce439f6dc:/# exit

这是关于 docker 容器部分的知识,这里暂时不做解释。

查看镜像

查看镜像主要使用 docker 的 lstaginspect子命令:

imges 子命令

使用 images 列出所有镜像:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               a2a15febcdf3        5 days ago          64.2MB
redis               latest              f7302e4ab3a8        5 days ago          98.2MB

我们来说明下输出的信息:

  • REPOSITORY:来⾃于哪个仓库, ⽐如ubuntu表⽰ubuntu系列的基础镜像;
  • TAG:镜像的标签信息, ⽐如18.04、 latest表⽰不同的版本信息。 标签只是标记, 并不能标识镜像内容;
  • IMAGE ID:镜像的ID(唯⼀标识镜像) , 如果两个镜像的ID相同, 说明它们实际上指向了同⼀个镜像, 只是具有不同标签名称⽽已;
  • CREATED:创建时间, 说明镜像最后的更新时间;
  • SIZE:镜像⼤⼩, 优秀的镜像往往体积都较⼩。

images⼦命令主要⽀持如下选项:

  • -a, --all=true|false: 列出所有(包括临时⽂件) 镜像⽂件, 默认为否;
  • --digests=true|false: 列出镜像的数字摘要值, 默认为否;
  • -f, --filter=[]: 过滤列出的镜像, 如dangling=true只显⽰没有被使⽤的镜像; 也可指定带有特定标注的镜像等;
  • --format="TEMPLATE": 控制输出格式, 如.ID代表ID信息, .Repository代表仓库信息等;
  • --no-trunc=true|false: 对输出结果中太长的部分是否进⾏截断, 如镜像的ID信息, 默认为是;
  • -q, --quiet=true|false: 仅输出ID信息, 默认为否。

其中, 还⽀持对输出结果进⾏控制的选项, 如-f.--filter=[]、 --notrunc=true|false、 -q、 --quiet=true|false等

tag 子命令

通过 tag 子命令可以为镜像添加一个新的标签。

[root@CentOS1 ~]# docker tag ubuntu:18.04 myubuntu:18.04
[root@CentOS1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myubuntu            18.04               a2a15febcdf3        5 days ago          64.2MB
ubuntu              18.04               a2a15febcdf3        5 days ago          64.2MB

如果细节看的话会发现 ubuntu 和 myubuntu 的 IMAGE ID 是一样的,因为 tag 子命令其实是给原来的镜像添加了别名,内部指向同一个文件,所以删除其中的某一个,只是删除一个链接而已,实际的镜像文件依然存在。

inspect 子命令

使用 inspect 子命令来查看镜像的详细信息:docker [image] inspect

docker inspect ubuntu

返回 JSON 格式的消息,如果只要其中一项内容,可以使用 -f 指定:

docker inspect -f {{".Architecture"}} ubuntu

history 子命令

使用 history 子命令查看镜像的历史命令

docker history ubuntu 

输出会被截断,带上--no-trunc选项输出全部信息。

搜寻镜像

使用 search 子命令可以在仓库中搜寻我们需要的镜像,语法为 docker search [option] keyword,⽀持的命令选项主要包括:

  • -f, --filter filter: 过滤输出内容;
  • --format string: 格式化输出内容;
  • --limit int: 限制输出结果个数, 默认为25个;
  • --no-trunc: 不截断输出结果。

例如我们搜寻名为 nginx 的镜像:

docker search --limit=4 --filter=starts=4 nginx

删除镜像

删除镜像使用 docker rmi 或者 docker images rm,语法为 docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。⽀持选项包括:

  • -f, -force: 强制删除镜像, 即使有容器依赖它;
  • -no-prune: 不要清理未带标签的⽗镜像。
docker rmi myubuntu:latest

当该镜像存在容器时,不能删除镜像,但可以加上 -f 选项强制删除,同时也删除容器。

注:当一个镜像有多个 tag 时,docker rmi 只是删除该镜像的标签,不会影响到镜像文件

清理镜像

使⽤Docker⼀段时间后, 系统中可能会遗留⼀些临时的镜像⽂件, 以及⼀些没有被使⽤的镜像, 可以通过 docker image prune 命令来进⾏清理。⽀持选项包括:

  • -a, -all: 删除所有⽆⽤镜像, 不光是临时镜像;
  • -filter filter: 只清理符合给定过滤器的镜像;
  • -f, -force: 强制删除镜像, ⽽不进⾏提⽰确认。
# docker image prune -f
Total reclaimed space: 0B

创建镜像

创建 docker 镜像的方法有三种:基于已有镜像的容器创建、 基于本地模板导⼊、 基于Dockerfile创建。

基于已有镜像的容器创建

使用命令 docker [container] commit 命令,语法为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[: TAG]]。主要选项包括:

  • -a, --author="": 作者信息;
  • -c, --change=[]: 提交的时候执⾏Dockerfile指令, 包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m, --message="": 提交消息;
  • -p, --pause=true: 提交时暂停容器运⾏。

下面我们尝试下:首先启动一个镜像,在镜像中做一些修改,之后用修改过的容器创建镜像。

# docker run -it ubuntu:latest bash
root@a93ecdb26b77:/# echo "hello world" > test
root@a93ecdb26b77:/# exit
exit

#  docker commit -m "Added test" -a "xingyys" a93ecdb26b77 test            
sha256:5f538a96c081d2f64356cd64eb38f7cc0b6987bb07ba283032796c8c7dc2cf2f

基于本地模板导⼊

⽤户也可以直接从⼀个操作系统模板⽂件导⼊⼀个镜像, 主要使⽤ docker [container] import 命令。 命令格式为 docker [image] import [OPTIONS] file | URL | - [REPOSITORY[: TAG]]

cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04

基于Dockerfile创建

基于Dockerfile创建是最常见的⽅式。 Dockerfile是⼀个⽂本⽂件,利用 docker 的指令能快速制作一个镜像。
下面给出一个简单的实例,基于基于debian: stretch-slim镜像安装Python 3环境, 构成⼀个新的python:3镜像。创建一个 dockerfile 文件,写入:

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 .

导出和载入镜像

docker 还提供了镜像的导出和载入。使用命令 docker [image] save 导出镜像:

docker save -o ubuntu.tar ubuntu

导出后的文件就可以复制到其他机器上载入了,对应的载入命令为 docker [image] load :

docker load -i ubuntu.tar

或者是

docker load < ubuntu.tar

上传镜像

push⼦命令可以让我们将本地的镜像上传到仓库中。默认上传到Docker Hub官⽅仓库(需要登录)。 格式为 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 user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push: Username: Password: Email:

第⼀次上传时, 会提⽰输⼊登录信息或进⾏注册, 之后登录信息会记录到本地~/.docker⽬录下。

原文地址:https://www.cnblogs.com/xingyys/p/11385457.html