Docker Image 基础命令

197 阅读15分钟

1. 镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容包括代码、运行时、库、环境变量和配置文件

1.1 Docker 镜像的特点

Docker镜像都是只读的

当容器启动时,一个新的可写层被加载到镜像的顶部。

这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

1.2. 镜像操作

  • 拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地 ;
  • 重命名镜像,使用docker tag命令“重命名”镜像 ;
  • 查看镜像,使用docker image ls或docker images命令查看本地已经存在的镜像 ;
  • 删除镜像,使用docker rmi命令删除无用镜像 ;
  • 构建镜像,构建镜像有两种方式。
    • 第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式
    • 第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。

1.3 列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。

docker images
[xuyatao@evan171206  ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
minio/minio                  latest              1b749bc60151        4 weeks ago         57.4MB
hello-world                  latest              bf756fb1ae65        4 months ago        13.3kB

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

OPTION 说明
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID。
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息
[xuyatao@evan171206  ~]# docker images -a
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
minio/minio                  latest              1b749bc60151        4 weeks ago         57.4MB
hello-world                  latest              bf756fb1ae65        4 months ago        13.3kB
hicooper/test-case-service   latest              86bdce1a7aa3        7 months ago        183MB
[xuyatao@evan171206  ~]# docker images -q
1b749bc60151
bf756fb1ae65

[xuyatao@evan171206  ~]# docker images --digests
REPOSITORY                   TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
minio/minio                  latest              sha256:ef3e76aca117f86308d3e6e0b46dfa63a35ed88909d6b4def1323689a161d87e   1b749bc60151        4 weeks ago         57.4MB
hello-world                  latest              sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1   bf756fb1ae65        4 months ago        13.3kB

[xuyatao@evan171206  ~]# docker images --no-trunc
REPOSITORY                   TAG                 IMAGE ID                                                                  CREATED             SIZE
minio/minio                  latest              sha256:1b749bc60151145dc7519feeeee15e1689009716f2a9812819186f4d79afcbb7   4 weeks ago         57.4MB
hello-world                  latest              sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b   4 months ago        13.3kB
hicooper/test-case-service   latest              sha256:86bdce1a7aa34d7c18a01f7cca6cf6a083b2bbe01ae2b57a91ed83116959d555   7 months ago        183MB
hicooper/center-service      latest              sha256:2351086228d768cfa3cb593b09d620b11a383f7ea7a45b8a1b70ea03275322c5   7 months ago        198MB

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

[xuyatao@evan171206  ~]# docker run -t -i ubuntu:15.10 /bin/bash 
root@940ce3cbd6c3:/# 

如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:

runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash 
root@940ce3cbd6c3:/# 

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

如果我们想要查询指定的镜像,可以使用docker image ls命令来查询。

 xuyatao@evan171206  ~  docker image ls busybox
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              018c9d7b792b        3 weeks ago         1.22MB

也可以使用docker images命令列出所有镜像,然后使用grep命令进行过滤。使用方法如下:

 xuyatao@evan171206  ~  docker images |grep busybox
busybox             latest              018c9d7b792b        3 weeks ago         1.22MB

1.4 查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

docker search [OPTIONS] 镜像名字
OPTIONS说明:
  • --no-trunc : 显示完整的镜像描述
  • -s : 列出收藏数不小于指定值的镜像。
  • --automated : 只列出 automated build类型的镜像;
[xuyatao@evan171206  ~]# docker search httpd
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                                   The Apache HTTP Server Project                  3008                [OK]                
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   31                                      
centos/httpd                                                                            29                                      [OK]
arm32v7/httpd                           The Apache HTTP Server Project                  9                                       
salim1983hoop/httpd24                   Dockerfile running apache config                2                                       [OK]
lead4good/httpd-fpm                     httpd server which connects via fcgi proxy h…   1                                       [OK]
publici/httpd                           httpd:latest                                    1                                       [OK]
jonathanheilmann/httpd-alpine-rewrite   httpd:alpine with enabled mod_rewrite           1                                       [OK]
solsson/httpd-openidc                   mod_auth_openidc on official httpd image, ve…   1                                       [OK]
dariko/httpd-rproxy-ldap                Apache httpd reverse proxy with LDAP authent…   1                                       [OK]
clearlinux/httpd                        httpd HyperText Transfer Protocol (HTTP) ser…   1                                       
dockerpinata/httpd                                                                      0                                       
e2eteam/httpd                                                                           0                                       
interlutions/httpd                      httpd docker image with debian-based config …   0                                       [OK]
appertly/httpd                          Customized Apache HTTPD that uses a PHP-FPM …   0                                       [OK]
hypoport/httpd-cgi                      httpd-cgi                                       0                                       [OK]
izdock/httpd                            Production ready Apache HTTPD Web Server + m…   0                                       
manasip/httpd                                                                           0                                       
amd64/httpd                             The Apache HTTP Server Project                  0                                       
trollin/httpd                                                                           0                                       
manageiq/httpd_configmap_generator      Httpd Configmap Generator                       0                                       [OK]
itsziget/httpd24                        Extended HTTPD Docker image based on the off…   0                                       [OK]
manageiq/httpd                          Container with httpd, built on CentOS for Ma…   0                                       [OK]
alvistack/httpd                         Docker Image Packaging for Apache               0                                       [OK]
ppc64le/httpd                           The Apache HTTP Server Project                  0                                       

列表字段的含义

  • NAME: 镜像仓库源的名称

  • DESCRIPTION: 镜像的描述

  • OFFICIAL: 是否 docker 官方发布

  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

  • AUTOMATED: 自动构建。

1.5 获取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

$ docker pull [选项][Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

使用命令 docker pull 来下载镜像。

[xuyatao@evan171206  ~]#  docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8b87079b7a06: Pulling fs layer 
a3ed95caeb02: Download complete 
0d62ec9c6a76: Download complete 
a329d50397b9: Download complete 
ea7c1f032b5c: Waiting 
be44112b72c7: Waiting

下载完成后,我们就可以使用这个镜像了。

[xuyatao@evan171206  ~]#  docker run httpd

1.6 运行镜像

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:18.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

 xuyatao@evan171206  /etc   docker run -it --rm ubuntu:18.04 bash
root@ae2f048164b9:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ae2f048164b9:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

docker run 就是运行容器的命令,具体格式我们会在容器一节进行详细讲解,我们这里简要的说明一下上面用到的参数。

  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
  • bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash。

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 18.04.1 LTS 系统。

最后我们通过 exit 退出了这个容器。

1.7 列出镜像

要想列出已经下载下来的镜像,可以使用 docker image ls 命令。

 xuyatao@evan171206/etc docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
nginx              latest    1403e55ab369   5 days ago      142MB
tomcat             latest    fb5657adc892   12 months ago   680MB
ubuntu             latest    ba6acccedd29   14 months ago   72.8MB
ubuntu             18.04     5a214d77f5d7   15 months ago   63.1MB
hello-world        latest    feb5d9fea6a5   15 months ago   13.3kB
harisekhon/hbase   latest    c2f78e407322   2 years ago     413MB

列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。

其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个 标签。因此,在上面的例子中,我们可以看到 ubuntu:18.04 和 ubuntu:bionic 拥有相同的 ID,因为它们对应的是同一个镜像。

1.8 镜像体积

如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,ubuntu:18.04 镜像大小,在这里是 63.3MB,但是在 Docker Hub 显示的却是 25.47 MB。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 docker image ls 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。

另外一个需要注意的问题是,docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

你可以通过 docker system df 命令来便捷的查看镜像、容器、数据卷所占用的空间。

xuyatao@evan171206/etc  docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          6         2         1.371GB   957.3MB (69%)
Containers      5         1         67.36MB   0B (0%)
Local Volumes   1         1         62.3kB    0B (0%)
Build Cache     0         0         0B        0B

1.9 更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

 ✘ xuyatao@evan171206  ~  docker run -i -t ubuntu:18.04 /bin/bash
root@77f06fc0ca7b:/# apt-get update
...
Reading package lists... Done
root@77f06fc0ca7b:/# exit
  • 在运行的容器内使用 apt-get update 命令进行更新。

  • 在完成操作之后,输入 exit 命令来退出这个容器。

1.10 删除镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

1.10.1 用 ID、镜像名、摘要删除镜像

其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。

比如我们有这么一些镜像:

 xuyatao@evan171206  /etc  docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
nginx              latest    1403e55ab369   5 days ago      142MB
tomcat             latest    fb5657adc892   12 months ago   680MB
ubuntu             latest    ba6acccedd29   14 months ago   72.8MB
ubuntu             18.04     5a214d77f5d7   15 months ago   63.1MB
hello-world        latest    feb5d9fea6a5   15 months ago   13.3kB
harisekhon/hbase   latest    c2f78e407322   2 years ago     413MB

我们可以用镜像的完整ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。

 xuyatao@evan171206  /etc  docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
nginx              latest    1403e55ab369   5 days ago      142MB
tomcat             latest    fb5657adc892   12 months ago   680MB
redis              latest    7614ae9453d1   12 months ago   113MB
ubuntu             latest    ba6acccedd29   14 months ago   72.8MB
ubuntu             18.04     5a214d77f5d7   15 months ago   63.1MB
hello-world        latest    feb5d9fea6a5   15 months ago   13.3kB
harisekhon/hbase   latest    c2f78e407322   2 years ago     413MB
 xuyatao@evan171206  /etc  docker image rm 761
Untagged: redis:latest
Untagged: redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Deleted: sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
Deleted: sha256:49c70179bc923a7d48583d58e2b6c21bde1787edf42ed1f8de9e9b96e2e88e65
Deleted: sha256:396e06df5d1120368a7a8a4fd1e5467cdc2dd4083660890df078c654596ddc1c
Deleted: sha256:434d118df2e9edb51238f6ba46e9efdfa21be68e88f54787531aa39a720a0740
Deleted: sha256:2047f09c412ff06f4e2ee8a25d105055e714d99000711e27a55072e640796294
Deleted: sha256:13d71c9ccb39b206211dd1900d06aa1984b0f5ab8abaa628c70b3eb733303a65
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
 xuyatao@evan171206  /etc  docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
nginx              latest    1403e55ab369   5 days ago      142MB
tomcat             latest    fb5657adc892   12 months ago   680MB
ubuntu             latest    ba6acccedd29   14 months ago   72.8MB
ubuntu             18.04     5a214d77f5d7   15 months ago   63.1MB
hello-world        latest    feb5d9fea6a5   15 months ago   13.3kB
harisekhon/hbase   latest    c2f78e407322   2 years ago     413MB

也可以用镜像名,也就是 <仓库名>:<标签>,来删除镜像。

 xuyatao@evan171206  /etc  docker image rm redis
Untagged: redis:latest
Untagged: redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Deleted: sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
Deleted: sha256:49c70179bc923a7d48583d58e2b6c21bde1787edf42ed1f8de9e9b96e2e88e65
Deleted: sha256:396e06df5d1120368a7a8a4fd1e5467cdc2dd4083660890df078c654596ddc1c
Deleted: sha256:434d118df2e9edb51238f6ba46e9efdfa21be68e88f54787531aa39a720a0740
Deleted: sha256:2047f09c412ff06f4e2ee8a25d105055e714d99000711e27a55072e640796294
Deleted: sha256:13d71c9ccb39b206211dd1900d06aa1984b0f5ab8abaa628c70b3eb733303a65
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

1.11. “重命名”镜像

如果你想要自定义镜像名称或者推送镜像到其他镜像仓库,你可以使用docker tag命令将镜像重命名。docker tag的命令格式为

 docker tag [SOURCE_IMAGE][:TAG] [TARGET_IMAGE][:TAG]

下面我们通过实例演示一下:

 xuyatao@evan171206  ~  docker tag busybox:latest mybusybox:latest

执行完docker tag命令后,可以使用查询镜像命令查看一下镜像列表:

 xuyatao@evan171206  ~  docker images
mybusybox                                                 latest                                                                       beae173ccac6   22 months ago   1.24MB
busybox                                                   latest                                                                       beae173ccac6   22 months ago   1.24MB

可以看到,镜像列表中多了一个mybusybox的镜像。但细心的同学可能已经发现,busybox和mybusybox这两个镜像的 IMAGE ID 是完全一样的。为什么呢?实际上它们指向了同一个镜像文件,只是别名不同而已。 如果我不需要mybusybox镜像了,想删除它,应该怎么操作呢?