前面章节已经初步使用 Dockerfile 构建了镜像。Dockerfile 其实就是镜像的构建文件,由一系列的参数和特定指令构成的文件。本章将介绍 Dockerfile 的保留字指令。
个人学习总结:
链接:【springboot、springcloud、docker 等,学习目录】
基本指令:
FROM:基础镜像,当前镜像是基于那个镜像的。
MAINTAINER:作者 邮箱。
RUN:容器构建时需要运行的命令。
EXPOSE:暴露端口号 启动容器的时候还需使用 –p 指定端口。
WORKDIR:指定在创建容器后,终端默认登录后进来的工作目录,一个落脚点,默认根目录,通常绝对路径,CMD ENTRYPOINT 都会在这个目录下执行。
ENV:构建镜像的过程中设置环境变量, 构建和运行时都有效可以使用$引用。
ADD:将宿主机目录下的文件拷贝到镜像且会自动处理URL和 解压tar 压缩包。
COPY:拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/复制到新的一层镜像内<目标路径>的位置。语法:COPY src dest COPY [“src”, “desc”]。
VOLUME:容器数据卷, 数据保存和持久化。
USER:指定该镜像由什么用户运行 不指定由root 运行。
CMD:指定容器启动时要运行默认的命令,Dockerfile中可以有多个cmd , 但只有最后一个生效,。
ENTERPOINT:指定容器启动时要运行的命令。
ONBUILD:触发器, 当构建一个被继承的dockerfile时运行命令, 父镜像在被子继承后的父镜像的onbuild 被触发。
COPY 和 ADD 区别:
相同:都是从宿主机拷贝文件到容器。
不同:ADD 支持 URL 和 压缩包。
3、CMD 和 ENTERPOINT 区别:
相同:都是指定容器启动程序和参数。
不同:CMD 会被docker run 之后的参数替换;ENTERPOINT docker run 之后的参数会被当做参数传递给ENTRYPOINT , 之后形成新的命令组合。追加
1、利用上面保留字指令和参数编写 Dockerfile 文件。
2、docker build 构建镜像。
3、docker run 利用镜像创建容器。
编写好的Dockerfile 指令从上往下执行,# 代表注释。
流程:
1、从基础镜像运行一个容器。
2、执行一条指令对容器做出修改。并对修改做出提交,构建成一个新的镜像。
3、Docker 再基于刚刚提交的镜像运行一个新的容器。
4、执行下一条指令,对容器做出修改并提交为一个新的镜像。
5、如此循环,直到所有指令执行完毕。
例如tomcat镜像:
1、编写 Dockerfile
# 自定义一个centos
FROM centos
MAINTAINER ron
# 登录之后的工作目录 落脚点
# WORKDIR /
# 使用环境变量的方式指定工作目录
ENV mypath /usr/local
WORKDIR $mypath
# 数据卷
VOLUME ["/dataVolume"]
# 基础镜像不支持vim 和 ipconfig命令
# 构建容器时运行的命令
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
#ENTRYPOINT /bin/bash
# 子镜像继承此镜像(父镜像)时执行
ONBUILD RUN echo "hello ron, father image is extended..."
2、docker build 构建镜像
可以看到镜像构建的过程。
3、docker history 查看镜像的构建顺序
从下往上看。
4、docker run 创建容器
可以看到进入到容器后的工作目录为/usr/local,与Dockerfile中指定的一致。
5、docker inspect 查看容器信息
可以看到容器的端口和数据卷信息。
注意:
EXPOSE 指令只是声明一个端口,运行时并没有打开该端口,仅仅提醒用户使用该端口,若运行时 使用 -P(upper case) 指定端口,会自动映射该端口。
总结:
1、Dockerfile 是镜像的构建文件
2、所有保留字指令全部大写,后面至少跟随一个参数。格式:指令名称 参数。
3、指令从上到下执行,每一条指令都会基于前一个运行的容器创建一个新的镜像层,并提交。
4、cratch : 基础 base 镜像,类似 java 中 Object 类。
5、三部曲:编写Dockerfile、docker build、docker run。
个人学习分享
更多 springboot、springcloud、docker 文章,关注微信公众号吧: