一、DockerFile是什么
用来构建镜像的文本文件, 由一条条构建指令及参数构成的脚本
构建三步骤:
- 编写DockerFile文件
- docker build命令构建镜像
- docker run 依照镜像运行容器实例
二、DockerFile基础知识
- 每条保留字指令都为大写字母且至少跟随一条参数
- 指定从上至下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
三、DockerFile构建大致流程
- Docker根据基础镜像运行容器
- 执行一条DockerFile的指令并对容器进行修改
- 执行类似docker commit的操作提交镜像
- 运行刚提交的镜像
- 执行下一条DockerFile的指令,循环2、3、4、5的操作,直至执行完DockerFile的所有指令
四、DockerFile、镜像、容器的关系
DockerFile:原材料
镜像:交付标准、交付产品
容器:运行的产品
DockerFile --build–>镜像–run–>容器
五、DockerFile保留字
DockerFile保留字
FROM #基础镜像
MAINTAINER #镜像维护者信息:邮箱及姓名
RUN #容器构建时(docker build)需要执行的命令 shell格式&exec格式
EXPOSE #当前容器对外暴露的端口
WORKDIR #指定当前容器进入后,终端默认登录进来的工作目录,落脚点
USER #指定镜像以什么用户去执行,如果不指定默认root
ENV #运行时环境,构建过程中设置环境变量,设置的环境变量可直接在后续RUN指令及其它指令中使用
VOLUME #相当于docker run -v 挂载容器数据卷 用于数据保存及持久化
ADD #将宿主机的文件拷贝进容器指定目录,并自动处理url及解压tar
COPY #类似ADD 目录及文件拷贝入镜像
CMD #指定容器启动后要做的事(执行的指令) 可以有多个指令 但只有最后一个生效 会被docker run后的参数替换
#在docker run 时CMD才会运行
ENTRYPOINT #与CMD相似,但是其不会被docker run后的参数覆盖,docker run后的参数会被当作参数送给ENTRYPOINT指令指定的程序
#ENTRYPOINT指定后,CMD的内容作为参数传给ENTRYPOINT 变成<ENTRYPOINT> "<CMD>"
#ENTRYPOINT + 定参
#ENTRYPOINT + CMD变参
DockerFile构建带vim+ifconfig+jdk8的centos镜像案例:
编写Dockerfile
FROM centos
MAINTAINER hsp<hsp@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#修改yum配置文件解决安装软件异常
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum更新缓存及yum更新
RUN yum makecache
RUN yum update -y
#安装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-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
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
上传jdk8压缩文件至Dockerfile同级目录
构建镜像及运行测试
#构建镜像 最后有一个点 代表当前目录
docker build -t 新镜像名:TAG .
docker build -t centosjava8:1.0 .
#查看镜像
docker images
#运行镜像
docker run -it centosjava8:1.0 /bin/bash
#测试 vim ifconfig java命令
#成功
六、虚悬镜像
仓库名、标签名都为的镜像、俗称dangling image
构建镜像、删除镜像时有概率出现错误导致
#虚悬镜像Dockerfile
From ubuntu
CMD echo 'Hello World'
#构建虚悬镜像
docker build .
#查看虚悬镜像
docker image ls -f dangling=true
#删除虚悬镜像
docker image prune
七、构建带ifconfig+jdk8的ubuntu镜像
Dockerfile
FROM ubuntu
MAINTAINER hsp<hsp@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#apt 更新
RUN apt-get update
#安装ifconfig命令查看网络IP
RUN apt-get install net-tools
#安装vim
RUN apt-get install -y vim
#安装java8
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
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-----ubuntu+vim+ifconfig+jdk8---------ok"
CMD /bin/bash
构建及运行
#构建
docker build -t ubuntujdk8:1.0 .
#查看
docker images
#运行
docker run -it ubuntujdk8:1.0 /bin/bash
#测试
ifconfig
touch a.txt
vim a.txt
java -version
#成功
八、Docker微服务实战
编写微服务工程
编译打jar包
编写Dockerfile
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER hsp
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为rb_ms_docker.jar
ADD robot-service-1.0-SNAPSHOT.jar rb_ms_docker.jar
# 运行jar包
RUN bash -c 'touch /rb_ms_docker.jar'
ENTRYPOINT ["java","-jar","/rb_ms_docker.jar"]
#暴露6088端口作为微服务
EXPOSE 6088
构建及运行
#构建
docker build -t rbsdocker:1.0 .
#查看
docker images
#运行
docker run -d rbsdocker:1.0
#测试、访问接口