获取镜像
1 | docker pull [选项] [Docker Registry地址]<仓库名>:<标签> |
- Docker Registry地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
- 仓库名:两段式名称,既 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
比如:
1 | docker pull ubuntu:14.04 |
上面的命令中没有给出 Docker Registry 地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:14.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 14.04 的镜像。
列出镜像
1 | docker images |
虚悬镜像
上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为
1 | <none> <none> 00285df0df87 5 days ago 342 MB |
这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:
1 | docker images -f dangling=true |
中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker images 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。
1 | docker images -a |
列出部分镜像
根据仓库名列出镜像
1 | docker images ubuntu |
列出特定的某个镜像,也就是说指定仓库名和标签
1 | docker images ubuntu:16.04 |
过滤器参数 –filter,或者简写 -f
1 | docker images -f since=mongo:3.2 |
想查看某个位置之前的镜像也可以,只需要把 since 换成 before 即可
此外,如果镜像构建时,定义了 LABEL,还可以通过 LABEL 来过滤
1 | docker images -f label=com.example.version=0.1 |
搜索镜像
1 | docker search (image-name) |
查看镜像历史
1 | docker history (image-name) |
运行镜像
1 | docker run -it --rm ubuntu:14.04 bash |
-it
: 这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。- ubuntu:14.04:这是指用 ubuntu:14.04 镜像为基础来启动容器。
- bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
进入容器
1 | docker exec -it webserver bash |
查看容器差异
1 | docker diff webserver |
保存镜像的修改内容
1 | docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] |
例如:
1 | docker commit \ |
慎用 docker commit!!! 使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
使用 Dockerfile 定制镜像
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。
FROM 指定基础镜像
FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
1 | FROM nginx |
Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
1 | FROM scratch |
RUN 执行命令
RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:
shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockrfile 中的 RUN 指令就是这种格式。
1
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的最后一定要清理掉无关文件。
构建镜像
1 | docker build [选项] <上下文路径/URL/-> |
在 Dockerfile 文件所在目录执行:
1 | docker build -t nginx:v3 . |