1)Dockerfile简介
由一系列命令和参数构建成的脚本
构建三步骤
编写Dockerfile文件 ==> docker build(打包为镜像) ==> docker run
1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
2)指令按照从上到下的顺序执行
3)#表示注释
4)每条指令都会创建一个新的镜像层,并对镜像进行提交
2)DockerFile保留字指令
FROM # 基础镜像,当前镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名
RUN #容器构建时需要运行的命令
EXPOSE #当前容器对外暴露的端口号
WORKDIR #指定在创建容器后,终端默认登录的工作目录
ENV #用来在构建镜像过程中设置环境变量
ADD #将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY #类似ADD,拷贝文件和目录到镜像中。
VOLUME #创建容器数据卷,用于数据保存和持久化
CMD #指定一个容器启动时要运行的命令;dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。
ENTRYPOINT #指定一个容器启动时要运行的命令;ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。但是ENTRYPOINT不会覆盖参数,而是会追加。
ONBUILD #当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
3)使用dockerfile构建镜像
(1)案例一
要求使其具备vim、ifconfig、httpd、更换yum源为阿里云源和jdk8环境
#下载JDK
wget https://mirrors.yangxingzhen.com/jdk/jdk-8u181-linux-x64.tar.gz
#下载yum源
wget https://mirrors.aliyun.com/repo/Centos-8.repo
创建dockefile文件
FROM centos
ENV HOMEPWD /root
WORKDIR $HOMEPWD #设置登录目录
RUN rm -rf /etc/yum.repos.d/* #删除镜像自带的yum源
#RUN curl -o /etc/yum.repos.d/centos8.repo https://mirrors.aliyun.com/repo/Centos-8.repo
ADD Centos-8.repo /etc/yum.repos.d/centos8.repo #将本地下载好的镜像源复制到镜像内
RUN yum clean all
RUN yum makecache
RUN yum install vim httpd net-tools -y #使用yum安装软件包
RUN yum install glibc.i686 -y
ADD jdk-8u181-linux-x64.tar.gz /usr/local/java
ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
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
ENTRYPOINT [ "/bin/bash" ]
使用docker build命令打包镜像
docker build -t centosjdk:1.8 .
验证镜像是否拥有封装的功能
docker run -it centosjdk:1.8
验证软件包是否安装成功:
JAVA:
VIM:
net-tools:
httpd:
(2)案例二
注意事项:当DockerFile中存在CMD参数时如果此时启动容器时末尾追加了命令,则会将dockerfile中最后一个CMD命令覆盖掉。
#构建时使用CMD执行命令
FROM centos
MAINTAINER qclr<你的邮箱地址>
ENV HOMEPWD /root
WORKDIR $HOMEPWD
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/centos8.repo https://mirrors.aliyun.com/repo/Centos-8.repo
RUN yum clean all
RUN yum makecache
CMD curl https://ifconfig.io
运行容器时末尾追加命令则会将原本的CMD命令进行覆盖执行
使用ENTRYPOINT构建dockerfile文件
FROM centos
MAINTAINER qclr<你的邮箱地址>
ENV HOMEPWD /root
WORKDIR $HOMEPWD
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/centos8.repo https://mirrors.aliyun.com/repo/Centos-8.repo
RUN yum clean all
RUN yum makecache
ENTRYPOINT [ "curl","-s","https://ifconfig.io" ]
运行容器时末尾追加命令则会在原本的命令后进行追加执行
4)ONBUILD的用法
当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
(1)案例
构建一个包含基础软件包的父类镜像,在dockerfile文件中继承该父类镜像触发ONBUILD
#父类dockerfile文件
FROM centos
MAINTAINER qclr<你的邮箱地址>
ENV HOMEPWD /root
WORKDIR $HOMEPWD
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/centos8.repo https://mirrors.aliyun.com/repo/Centos-8.repo
RUN yum clean all
RUN yum makecache
RUN yum install vim httpd net-tools openssh-server -y
ENTRYPOINT [ "curl","-s","https://ifconfig.io" ]
ONBUILD RUN echo "this is father------886"
docker build -f dockefileson2 -t my_centos .
在继承父类镜像后进行打包时会触发ONBUILD参数
FROM my_centos
MAINTAINER qclr<你的邮箱地址>
ENV HOMEPWD /root
WORKDIR $HOMEPWD
ENTRYPOINT [ "curl","-s","https://ifconfig.io" ]
#继承父类镜像进行重新打包
docker build -f dockerson -t my_son .
4)虚悬镜像
对于仓库和标签都是none的称之为虚悬镜像。
#查询系统中存在的所有虚悬镜像
docker images ls -f dangling=true
#删除所有的虚悬镜像
docker image prune