Dockerfile指令集

dockerfile主要组成部分:

#基础镜像信息
FROM openjdk:8-jdk-slim-bullseye
#暴露端口
EXPOSE 8080
#容器启动时执行指令 
CMD ["catalina.sh", "run"]

dockerfile常用指令:

  • FROM 这个镜像的父亲是谁?(指定基础【base】镜像)

  • MAINTAINER 告诉别人,它的作者?(指定维护者信息,可以没有)

  • RUN 容器构建时需要运行的命令(在命令前面加上RUN即可 ps:用来执行shell 命令)

  • ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

  • WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点(设置当前工作目录)

  • VOLUME 容器数据卷,用于数据保存和持久化工作(设置卷,挂载主机目录)

  • EXPOSE 当前容器对外暴露出的端口(指定对外的端口)

  • CMD 指定容器启动后的要干的事情

    • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  • COPY 复制文件 (从容器外 复制到容器内,ps:建议同一目录下)

  • ENV 用来在构建镜像过程中设置环境变量

  • USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root

  • ENTRYPOINT 容器启动后执行的命令

    • 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
    • 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
    • ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
      当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令

创建第一个Dockerfile文件

FROM centos
MAINTAINER xxx<xxx@xx.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-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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

基础镜像的选择

  • 一是 应当尽量选择官方镜像库里的基础镜像;
  • 二是 应当选择轻量级的镜像做底包

就典型的Linux基础镜像来说,大小关系如下:

Ubuntu>CentOS>Debian

因此相比 Ubuntu,其实更推荐使用最轻量级的 Debian镜像,而且它也是一个完整的Release版,可以放心使用

ADD 与 COPY 指令的正确使用

虽然两者都可以添加文件到镜像中,但在一般用法中,还是推荐以COPY指令为首选,原因在于ADD指令并没有COPY指令来的纯粹,ADD会添加一些额外功能,典型的如下 ADD 一个压缩包时,其不仅会复制,还会自动解压,而有时我们并不需要这种额外的功能。

启动守护式容器(后台服务器)

问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,
我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,
常见就是命令行模式,表示我还有交互操作,别中断

#nginx 的处理方式  dockerfile中
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。

docker run -d 容器名
  • 前台交互式启动

     docker run -it redis:6.0.8
    
  • 后台守护式启动

    docker run -d redis:6.0.8
    

dockerfile参考

tomcat的dockerfile

https://github.com/docker-library/tomcat

samba

https://github.com/dperson/samba

参考

https://github.com/CentOS/CentOS-Dockerfiles

总之 参考常见开源的,就对了,学学大佬写的!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐