赞
踩
dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
dockerfile定义了进程需要的一切东西,涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
官网:https://docs.docker.com/engine/reference/builder/
UnionFS(联合文件系统): Unin文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a sindle virtual flesystem)。 Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
构建三步骤:
基础知识:
像图中这种ADD,ENV,COPY等就叫保留字指令
docker 执行 dockerfile 的大致流程:
- docker commit 提交容器副本使之成为一个新的镜像:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
使用dockerfile构建docker镜像,再用镜像生成容器
参考tomcat8的Dockerfile入门 https://github.com/docker-library/tomcat/blob/master/9.0/jdk8/corretto-al2/Dockerfile
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
如.
镜像维护者的姓名和邮箱地址
容器构建时需要运行的命令,在 docker build时运行
有两种格式:
RUN <命令行命令>
命令行命令等同于在终端操作的shell命令
例: RUN yum -y install vim
RUN [“可执行文件”,“参数1",“参数2”]
例:RUN [“./test.php”,“dev”,“offline”] ,等价于 RUN ./test.php dev offline
如.
当前容器对外暴露出的端口
指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
如上图这个/,就是默认的工作目录
如.
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,如同在命令前指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量
例:WORKDIR $MY_PATH 指定了登录后的默认工作目录为/usr/mytest
如.
容器数据卷,用于数据保存和持久化工作
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
相比于COPY命令多了个解压功能
指定容器启动后的要干的事情,与RUN的区别是CMD时在docker run时运行
CMD指令的格式和RUN相似,也是两种格式:
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
如.
格式:ENTRYPOINT [“”,“”,“”,…]
也是用来指定一个容器启动时要运行的命令
类似于CMD指令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成"<ENTRYPOINT>"<CMD>"
centos7镜像具备vim+ifconfig+jdk8
jdk压缩包要与Dockerfile文件在同一目录下
Dockerfile文件中的D一定是大写
FROM centos:7 MAINTAINER zy<2351950143@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_341 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
最后有一个点别忘了
docker build -t centosjava8:1.0 .
构建完成:
查看创建的镜像:
docker run -it 镜像ID /bin/bash
仓库名和版本号都为none的就是虚悬镜像
查看所有的虚悬镜像
docker image ls -f dangling=true
删除所有虚悬镜像
docker image prune
端口为6001,只有一些简单的接口
本机测试没问题
打包并把他放进虚拟机目录里
编写Dockerfile文件:
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zy_docker.jar
ADD docker_test-0.0.1-SNAPSHOT.jar zy_docker.jar
# 运行jar包
RUN bash -c 'touch /zy_docker.jar'
ENTRYPOINT ["java","-jar","/zy_docker.jar"]
# 暴露6001端口
EXPOSE 6001
构建:
别忘了最后的点
docker build -t zy_docker:1.1 .
运行容器:
docker run -d -p 6001:6001 661bf8447553
测试:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。