DockerFile概述
DockerFile 是用来构建 Docker 镜像的构建文件,是由一系列的命令和参数构成的脚本。
DokcerFile的构建步骤:
1、编写Dokcerfile文件
2、docker build 生成新的镜像
3、docker run 运行镜像
以Centos的镜像为例来说明 https://hub.docker.com/_/centos。
#Centos的Dockerfile
FROM scratch
ADD centos-7.8.2003-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200504" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]
DockerFile构建过程
基础知识
1、每条保留字指令都必须为大写字母后面要跟随至少一个参数。
2、指令从上到下顺序执行。
3、#表示注释。
4、每条指令都会创建一个新的镜像层,并对镜像进行提交。
大致流程
1、Docker从基础镜像运行一个容器。
2、执行一条指令并对容器进行修改。
3、执行类似于docker commit的操作提交一个新的镜像。
4、Docker再基于刚提交的新的镜像运行一个新的容器。
5、执行dockerfile的下一个指令再人生第2点直到没有指令。
总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:Dockerfile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。
Dockerfile 面向开发,Docker 镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。
1、Dockerfile,需要定义一个Dockerfile,Dockerfile 定义了进程需要的一切东西。
Dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace 的权限控制)等等;
2、Docker镜像,在用 Dockerfile 定义一个文件之后,docker build 时会产生一个 Docker 镜像,当运行 Docker 镜像时,会真正开始提供服务;
3、Docker 容器,容器是直接提供服务的。
DockerFile体系结构
FROM:基础镜像,当前新镜像是基于哪个镜像的。
MAINTAINER:镜像维护者的姓名和邮箱地址。
RUN:容器构建时需要运行的命令。
EXPOSE:当前容器对外暴露的端口。
WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录。
ENV:用来在构建镜像过程中设置环境变量。
ADD:将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理URL和解压tar包。
COPY:类似ADD,拷贝文件和目录到镜像中,语法COPY src dest COPY [''src","dest"]
。
VOLUME:容器数据卷,用于数据保存和持久化工作。
CMD:指定一个容器启动时要运行的命令格式。shell:CMD <命令>
,exec CMD ['可执行文件',"参数1","参数2"]
,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
ENTEYPONT:指定一个容器启动时要运行的命令。ENTRYPOINT 的目地和 CMD 一样,都是在指定容器启动程序及参数。
OBBUILD:当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子镜像继承后触发父镜像的 onbuild 。
自定义mycentos镜像
docker Hub上99%的镜像都是通过 base 镜像中安装和配置需要的软件构建出来的。
目的:设置登陆后的默认路径、vim编辑器。
# 进入mydocker目录创建DockerFile文件编写
[root@localhost ~]# mkdir dockerfile
[root@localhost ~]# cd dockerfile/
[root@localhost dockerfile]# pwd
/root/dockerfile
[root@localhost dockerfile]# mkdir mycentos
[root@localhost dockerfile]# cd mycentos/
[root@localhost mycentos]# pwd
/root/dockerfile/mycentos
[root@localhost mycentos]# touch Dockerfile
[root@localhost mycentos]# chmod 777 Dockerfile
[root@localhost mycentos]# vim Dockerfile
#基于centos镜像
FROM centos
#设置作者和邮箱
MAINTAINER coydone<coydone@qq.com>
#声明变量
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH
#安装VIM -y表示所有的确认的地方全部yes
RUN yum -y install vim
#设置对外暴露的端口,提示作用
EXPOSE 80
#打开一个终端
CMD echo $MYPATH
CMD echo "success---------ok"
CMD /bin/bash
#使用docker build命令构建镜像
[root@localhost mycentos]# docker build -t mycentos:1.0 .
#使用docker run命令运行
[root@localhost mycentos]# docker run -it mycentos:1.0 /bin/bash
#列出镜像的变更历史
docker history 镜像名:TAG
Dockerfile 中可以有多个CMD的命令,但只有最后一个生效,CMD会被docker run之后的参数替换掉。
使用ENTRYPOINT来运行命令,在run 运行的参数会追加到新的命令后面。
自定义项目Docker
打Jar包镜像
准备工作:创建一个SpringBoot项目并打Jar包,把Jar包拷贝到Linux的/mydocker/myjarproject目录下。
# 编写Dockerfile
FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD coydone.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
#构建镜像
docker build -t myapp:1.0 .
#运行镜像
docker run -it --name 'myapp' -p 8888:8080 myapp:1.0
打War包镜像
准备工作:把上面的项目改成War项目打War包放到Linux。
#编写Dockerfile
#基于tomcat
FROM tomcat:alpine
#作者信息
MAINTAINER coydone<coydone@qq.com>
#声明环境变量
ENV TOMCATPATH=/usr/local/tomcat
#设置工作目录
WORKDIR ${TOMCATPATH}/webapps
#删除webapps下面的所有项目
RUN rm -rf *
#添加war包到当前的工作目录下的webapps
COPY coydone.war ./coydone.war
#更改war包的名字
RUN mv ./coydone.war ./ROOT.war
#显示webapps下面的文件
RUN ls -lh ./
#解压war包
RUN unzip ./ROOT.war -d ./
#删除ROOT.war包
RUN rm -rf ./ROOT.war
EXPOSE 8080
CMD ["bin/catalina.sh", "run"]
#构建镜像
docker build -t mywarapp:1.0 .
#运行镜像
docker run -it -p 8888:8080 mywarapp:1.0
评论区