查看镜像及其Dockerfile
查看镜像
docker images
mac没有tac命令
brew install coreutils
查看镜像的dockerfile
docker history --format {{.CreatedBy}} --no-trunc=true 21978c3803ca|sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac
DockerFile介绍
现在我们简单介绍一下dockerfile:
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile 用于指示 docker image build 命令自动构建Image的源代码
# 对该目录下的dockerfile进行镜像的构建
docker build -f Dockerfile
通过dockerfile创建镜像大致上分为三步:写Dockerfile ——>docker build——>docker run
Dockerfile 可以大致分为4个部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
dockerfile也有一些需要注意的地方:
- dockerfile是通过从上到下的顺序运行指令的。其中第一条指令是 FROM,表示源镜像是基于什么镜像,因此也就有了所有镜像的源镜像:scratch。
- 每条保留字指令都必须是大写字母, 并且后面要跟随至少一个参数。
- 每条指令可用 # 添加注释。
- 每条指令都会创建一个新镜像层, 并对镜像进行提交。
Dockerfile指令解析
| 指令 | 解析 |
|---|---|
| FROM | 指定基础镜像,必须为第一个命令 |
| MAINTAINER | 维护者邮箱等信息 |
| RUN | 构建镜像docker build时执行的命令 |
| ADD | 将本地文件添加到容器中,tar 类型文件会自动解压 |
| COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 |
| CMD | 在docker run时会执行的命令,如果存在多个则仅最后一个生效,例如一个镜像的dockerfile的结尾是“ CMD ["/bin/bash"] ”,那么进入容器可以使用docker exec -it imageName或docker exec -it imageName /bin/bash,后者是在“ CMD ["/bin/bash"] ”的指令下面多加了一个“ CMD ["/bin/bash"] ”,根据CMD的特性,存在多个时,只让最后一个CMD生效,因此不影响 |
| ENTRYPOINT | 可执行化 |
| LABEL | 用于为镜像添加元数据 |
| ENV | 设置环境变量 |
| EXPOSE | 指定于外界交互的端口 |
| VOLUME | 用于指定持久化目录 |
| WORKDIR | 工作目录 |
| ARG | 用于指定传递给构建运行时的变量 |
| ONBUILD | 用于设置镜像触发器 |
1 FROM
# 格式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# 例子
FROM mysql:5.6
2 MAINTAINER
# 格式
MAINTAINER <name>
# 例子
MAINTAINER xiehgz@foxmail.com
3 RUN
# 格式
RUN <command>
# 例子
RUN yum install -y mysql
4 ADD
# 格式
ADD <src>... <dest>
# 例子,添加 "name" 到 `WORKDIR`/dir/
ADD name Dir/
5 COPY
# 格式
COPY <src>... <dest>
# 例子
COPY name in /dir
6 CMD
# 格式
CMD ["executable","param1","param2"]
# 例子
CMD ["mysqld"]
7 ENTRYPOINT
# 格式
ENTRYPOINT ["executable", "param1", "param2"]
# 例子:让什么可执行化
ENTRYPOINT ["ls", "/usr/local"]
8 LABEL
# 格式
LABEL <key>=<value> <key>=<value> ...
# 例子
LABEL version="1.0"
9 ENV
# 格式
ENV <key> <value>
ENV <key>=<value> ...
# 例子
ENV name guazi
ENV name=guazi
10 EXPOSE
# 格式
EXPOSE <port> [<port>...]
# 例子
EXPOSE 3306
11 VOLUME
# 格式
VOLUME ["/path"]
# 例子
VOLUME ["/mydata"]
12 WORKDIR
# 格式
WORKDIR /path
# 例子
WORKDIR /mydata
13 ARG
# 格式
ARG <name>[=<default value>]
# 例子,外部传入一参数testparm,默认值为1
ARG testparm=1
14 ONBUILD
# 格式
ONBUILD [INSTRUCTION]
# 例子
ONBUILD ADD . /app/src
制作镜像
以自定义一个centos镜像为例,在官方镜像的基础上添加vim和net-tools工具
- 首先创建dockerfile:
cat Dockerfile
FROM centos:7
MAINTAINER xiehgz
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD /bin/bash
- 构建镜像:
docker build -t mycentos:3.0 .
- 查看镜像:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 3.0 b2d59a130341 About a minute ago 453MB
- 检验是否正常启动:
docker run -it mycentos:3.0
- 构建成功
docker ps