Technology and experience learned from THE DOCKER BOOK 5
列出镜像
docker images
查找镜像
docker search ubuntu
我们可以通过该命令来查找所有Docker Hub上公共可用镜像
构建镜像
commit
参考 博客:docker镜像复制到自己的存储库使用- dockerfile
推荐使用Dockerfile方法来代替docker commit
是因为前者构建镜像更具备可重复性、透明性以及幂等性。
一旦有了Dockerfile
,我们可以使用用docker build
命令基于该Dockerfile
中的指令构建一个新的镜像。
创建一个示例仓库
我们创建了一个名为static_web
的目录来保存Dockerfile
,这个目录就是我们的构建环境,Docker
则称此环境为上下文 或者构建上下文。Docker
会在构建镜像时将构建上下文和该上下文的文件和目录上传到Docker
守护进程。这样Docker
守护进程就能直接访问用户想在镜像中存储的任何代码、文件或者其他数据。
第一个Dockerfile
# Version:0.0.1
FROM ubuntu:14.04
MAINTAINER ZHOUJIAWEI "1084186870@qq.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'hi,i am your container' \
>/user/share/nginx/html/index.html
EXPOSE 80
该Dockerfile由一系列指令和参数组成。每条指令,如FROM,都必须为大写字母,且后面要跟随一个参数:FROM ubuntu:14.04
。Dockerfile
中的指令会按照顺序从上到下执行,所以应该根据需要合理安排指令的顺序。
每条指令都会创建一个新的镜像层并对镜像进行提交。Docker
大体上按照如下流程执行Dokcerfile
中的指令。
Docker
从基础镜像运行一个容器- 执行一条指令,对容器进行修改。
- 执行类似
docker commit
的操作,提交一个新的镜像层。 Docke
r再基于刚提交的镜像运行一个新容器。- 执行
Dockerfile
中的下一条指令,直到所有指令都执行完毕。
从上面也可以看出,如果用户的Dockerfile
由于某些愿意(某条指令失败)没有正常结束,那么用户将得到一个可以使用的镜像。这对调试非常有帮助:可以基于该镜像运行一个具备交互功能的容器,使用最后创建的镜像对为什么用户的指令会失败进行调试。Dockerfile
也支持注释。以#开头的行都会被认为是注释,我们的代码中的第一个就是注释的例子。
每个Dockerfile
的第一条指令必须是FROM
。FROM
指令指定一个已经存在的镜像,后续指令都将基于该镜像进行,这个镜像被称为基础镜像。
在前面的Dockerfile
示例里,我们指定了ubuntu:14.04
作为新镜像的基础镜像。基于这个Docerfile
构建的新镜像将以Ubuntu14.04
操作系统为基础。在运行一个容器时,必须要指明是基于哪个基础镜像再进行构建。
接着我们指定了MAINTAINER
指令,这条指令会告诉Docker
该镜像的作者是谁,以及作者的电子邮件地址。这有助于标识镜像的所有者和联系方式。
再这些指令之后,我们指定了两条RUN指令。RUN
指令会在当前镜像中运行指定的命令。在这个例子里,我们通过RUN
指令更新了已经安装的apt仓库,安装了nginx
包,之后创建了 /usr/share/nginx/html/index.html
文件,该文件有一些简单的示例文本,像前面说的那样子,每条RUN命令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条指令。
默认情况下,RUN
指令会在shell
里使用命令包装器/bin/sh -c
来执行,如果是在一个不支持shell的平台上运行或者不希望在shell
中运行(比如避免shell
字符串篡改),也可以使用exec
格式的RUN
指令,如:
RUN [ "apt-get"," install ","-y" ,"nginx" ]
在这种方式中,我们使用一个数组来指定要运行的命令和传递给该命令的每个参数。
接着设置了EXPOSE
指令,这条指令告诉Docker
该容器内的应用程序将会使用容器的指定端口。者并不意味着可以字段访问任意容器运行服务中的端口(这里的例子是80)。出于安全的考虑,Docker并不会自动打开该端口,而是需要用户在使用Docker run 运行容器时来指定需要打开哪些端口。可以指定多个EXPOSE指令来向外部公开多个端口。EXPOSE指令也可以来将多个容器连接。docker run 命令通过 –expose选项来指定对外部公开的端口。
本作品采用《CC 协议》,转载必须注明作者和本文链接