Dockerfile
Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明,每条指令构建一层,通过docker build
命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容,就是描述该层如何构建。有了Dockefile,就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令,就可生成docker镜像。
指令&说明
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置 |
CMD | 指定这个容器启动的时候要运行的命令(只有最后一个会生效) |
EMTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令 |
COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 |
ENV | 构建的时候设置环境变量 |
形象解释
指令 | 解释 |
---|---|
FROM | 这个镜像的妈妈是谁?(指定基础镜像) |
MAINTAINER | 告诉别人,谁负责养它?(指定维护者信息) |
RUN | 你想让它干啥(在命令前面加上RUN即可) |
ADD | 给它点创业资金(COPY文件,会自动解压) |
WORKDIR | 我是cd,换了个命令(设置当前工作目录) |
VOLUME | 给它一个存放行李的地方(设置卷,挂载主机目录) |
EXPOSE | 它要打开的门是啥(指定对外的端口) |
RUN | 跑起来把!(指定容器启动后要做的事) |
注意点
- Dockerfile 中第一个指令必须是FROM。
- Dockerfile 中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录。
- Dockerfile 中相对路径默认都是Dockerfile所在的目录。
- Dockerfile 中一定要惜字如金,能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。
- Dockerfile 中每一条指令被视为一层。
- Dockerfile 中指明大写(约定俗成)。
制作镜像
通过编写Dockerfile
文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在 /root/centos 目录下新建文件 Dockerfile
。然后使用上述指令编写该文件。
mkdir /root/centos
cd /root/centos
vim Dockerfile
FROM centos
MAINTAINER xiaogushi<35672477@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
逐行解释
FROM centos
该image文件继承官方的centos,后面加冒号如centos:7,用于指定镜像的版本。ENV MYPATH /usr/local
设置环境变量MYPATH ,后面有用到。WORKDIR $MYPATH
直接使用上面设置的环境变量,指定 /usr/local 为工作目录。RUN yum -y install vim & RUN yum -y install net-tools
在 /usr/local 目录下,运行 yum -y install vim 和 yum -y install net-tools 命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中。EXPOSE 80
将容器80端口暴露出来,允许外部连接这个端口。CMD
三条 CMD 命令指定容器启动的时候运行命令。
构建镜像
# docker build -f Dockerfile文件路径 -t 镜像名:Tag名 dir
docker build -f Dockerfile -t centos:latest .
完成后可以使用 docker images
查看刚构建的镜像ID。
通过 docker history 容器ID
命令来查看镜像的构建步骤。
# docker history 容器ID
IMAGE CREATED CREATED BY SIZE COMMENT
1185a46e3a12 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
83459c404586 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
9b8661c812c4 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
2064c1540e8e 13 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
1b15d4a1fd5e 13 minutes ago /bin/sh -c yum -y install net-tools 23.3MB
9336c20f0b6d 13 minutes ago /bin/sh -c yum -y install vim 58MB
7d46880ef0fd 14 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
e27a56b5247b 14 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
b2b6851e55fa 14 minutes ago /bin/sh -c #(nop) MAINTAINER ethan<12583985… 0B
300e315adb2f 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
tips
当使用 Dockerfile 构建镜像时,所在的目录一定要使用一个干净的目录(最好新建一个),以免目录下有其他文件(构建会加载当前目录下所有文件,导致磁盘爆满)。