【Docker教程】Docker 镜像

获取镜像

官方的 DockerHub 上有很多开源的高质量镜像,可以直接供我们使用

  • 使用docker pull 命令直接从 DockerHub 上获取

格式:

1
docker pull [选项] [docker registry 地址]:<仓库名>:<标签>

示例:

1
2
3
4
5
6
7
8
9
# 获取nginx镜像
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
2a72cbf407d6: Pull complete
fefa2faca81f: Pull complete
080aeede8114: Pull complete
Digest: sha256:c4ee0ecb376636258447e1d8effb56c09c75fe7acf756bf7c13efadf38aa0aca
Status: Downloaded newer image for nginx:latest
  • 使用Dockerfile构建Docker镜像 (建议使用Dockerfile构建自己的Docker镜像

格式: docker image build [OPTIONS] PATH | URL | - [flags]

简写: docker build [OPTIONS] PATH | URL | - [flags]

创建一个nginx目录,编写dockerfile文件

1
2
3
4
5
6
7
8
9
# 创建一个nginx目录
$ mkdir nginx

# 编写Dockerfile文件 (注意名称必须为:Dockerfile)
$ vim Dockerfile

# Dockerfile 文件中内容
FROM nginx
RUN echo '<h1>Hello, nginx!</h1>' > /usr/share/nginx/html/index.html

在 Dockerfile 文件所在目录执行下面命令,构建名为 gulj/nginx:v1 的docker镜像

1
2
# 构建名为 mynginx:v1 的镜像
$ docker build -t gulj/nginx:v1 .
  • 使用docker commit 命令通过已有的 容器 创建镜像(不建议使用

格式:docker container commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

简写:docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

既然通过容器创建镜像,那么首先需要运行一个容器,而运行一个容器需要一个基础镜像,下面将使用官方的centos镜像,通过加工来构建自己的镜像

大致流程如下:

① 获取官方的centos镜像

② 对获取的centos镜像执行docker run 命令获取一个容器

③ 对获取的容器进行安装vim操作,安装结束,退出容器(默认官方的centos镜像没有vim命令)

④ 通过docker commit 命令构建镜像,这样我们就能得到了一个带有vim命令的centos镜像

按照流程操作演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 获取centos镜像
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
5e35d10a3eba: Pull complete
Digest: sha256:dcbc4e5e7052ea2306eed59563da1fec09196f2ecacbe042acbdcd2b44b05270
Status: Downloaded newer image for centos:latest

# 以交互式方式获取一个容器,这样我们就会进入容器内,安装vim,安装完之后退出容器
$ docker run -it centos
# 在容器内安装vim
[root@34046cf71732 /] yum install vim -y
# 退出容器
[root@34046cf71732 /] exit

# 查看我们刚才运行的容器
$ dokcer ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34046cf71732 centos "/bin/bash" 10 minutes ago Exited (0) 15 seconds ago cocky_euler

# 构建安装vim的centos镜像, --author 是指定修改的作者,而 --message 则是记录本次修改的内容,可省略
$ docker commit --author "gulj <sqgulj@gmail.com>" --message "安装了vim" cocky_euler gulj/centos-vim:1.0
sha256:1109b8f3ea7826225d1dc1ee2693507fe8402eaeeafc57d24b907018a5cc0951

# 查看我们构建的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gulj/centos-vim 1.0 1109b8f3ea78 15 seconds ago 354MB
centos latest 2d194b392dd1 3 weeks ago 195MB

下面我们通过docker history 命令查看镜像内的历史记录,与 centos:latest 的镜像历史记录比较,我们会很明显地发现,gulj/centos-vim:1.0 的镜像历史记录比 centos:latest 的镜像历史记录多了一层,也就是我们提交的一层(sha256:1109b8f3ea7826225d1…)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# centos:latest 镜像
$ docker history centos
IMAGE CREATED CREATED BY SIZE COMMENT
2d194b392dd1 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:8d83f3e2c14f39e7f… 195MB

# 我们自己构建的gulj/centos-vim:1.0镜像
$ docker history gulj/centos-vim:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
1109b8f3ea78 9 minutes ago /bin/bash 158MB
2d194b392dd1 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:8d83f3e2c14f39e7f… 195MB

docker commit 操作只专注于可读可写层(Read-Write Layer),数据卷 VOLUME 挂载的目录内容,还有类似于 hosts、hostsname 和resolv.conf 等挂载文件,当然还有一些如 /proc 和 /sys 等虚拟文件系统的内容都将不会出现在打包后的镜像中

镜像常用命令

搜索镜像

使用 docker search 命令从DockerHub中搜索
格式:

1
docker search [OPTIONS] TERM

OPTIONS说明:

-f, --filter filter  根据指定条件过滤结果

--format string      通过Go语言模板文件展示镜像

--limit int          限制显示的个数

--no-trunc           显示完整的镜像描述

示例:

从Docker Hub查找所有镜像名包含nginx,并且收藏数大于500的镜像

1
2
3
4
5
docker search -f=stars=500  nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 8227 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1300 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 538 [OK]
列出镜像

使用 docker images 命令列出本地镜像
格式:

1
docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:

-a, --all             显示所有的镜像 (默认隐藏中间层镜像)

--digests             显示摘要

-f, --filter filter   显示满足条件的镜像

--format string       通过Go语言模板文件展示镜像

--no-trunc            显示完整的镜像信息

-q, --quiet           只显示镜像ID

示例:

查看本地镜像列表

1
2
3
4
5
6
docker images 或者 docker images ls
gulj/centos-vim 1.0 1109b8f3ea78 4 hours ago 354MB
nginx latest 7f70b30f2cc6 6 days ago 109MB
centos latest 2d194b392dd1 3 weeks ago 195MB
postgres latest 6152297591eb 3 weeks ago 289MB
busybox latest f6e427c148a7 3 weeks ago 1.15MB

其它使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker image ls

docker images -q # 只展示镜像的ID

docker images mysql

docker images mysql:5.7

docker images --digests mysql:5.7

docker images -f since=mysql:5.7 # 展示 mysql:5.7 之后建立的镜像

docker images --format "{{.ID}}\t{{.Repository}}" # 只展示镜像ID和仓库

docker images -f "dangling=true" # 展示虚悬镜像
删除镜像

使用 docker rmi 命令删除本地一个或多个镜像
格式:

1
docker rmi [OPTIONS] IMAGE [IMAGE...] [flags]

OPTIONS说明:

-f, --force     强制删除
--no-prune      不移除该镜像的过程镜像,默认移除

示例:

强制删除本地指定名称的镜像

1
docker images rmi -f gitlab/gitlab-ce

其它使用方式:

1
2
3
4
5
6
7
8
9
docker rmi -f 2aa1fe2f052b                       # 根据镜像ID删除指定镜像

docker rmi gulj/centos-vim nginx busybox # 删除多个镜像

docker rmi $(docker images -q redis) # 删除所有仓库名为reids的镜像

docker rmi $(docker images -q -f dangling=true) # 删除所有的虚悬镜像

docker rmi $(docker images -aq) # 删除所有的镜像