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镜像了,想删除它,应该怎么操作呢?