Dockerfile自定义镜像

发布时间 2023-03-30 14:20:35作者: uestc2007

一、Dockerfile

1. 简介

​ Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本

​ Dockerfile从FROM命令开始,紧接着各种命令、参数等,最终会生成一个新的镜像

​ 使用Dockerfile构建镜像的步骤:

  1. 编写Dockerfile文件
  2. 使用docker build构建镜像
  3. 使用docker run运行容器

2. 用法

2.1 语法规则

  • 指令必须要大写,且后面必须跟参数
  • 第一条指令必须是FROM,指定Base Image 基础镜像
  • 指令按从上往下的顺序,依次执行
  • 每条指定都会创建一个新的镜像层并提交
  • #表示注释

2.3 docker执行dockerfile的流程

  • docekr从基础镜像运行一个容器
  • 执行一条指令并对容器做出修改
  • 执行类似docker commint的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完

2.3 常用指令

指令解释 
FROM 指定基础镜像,即当前新镜像是基于哪个镜像的

格式:

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

描述: tag和digest可选,不指定时,则使用latest版本基础镜像,digest表示V2版本及以上版本镜像的内容可寻址标识符。

示例: FROM centos:7

MAINTAINER 指定镜像作者命名和邮箱地址

格式:

MAINTAINER <name>

描述: name即为维护者信息,可自定义为姓名、邮箱地址等

示例:

MAINTAINER andya

MAINTAINER andya@163.com

MAINTAINER andya <andya@163.com>

RUN 指定构建过程中要运行的命令  
ENV 用来在构建镜像过程中设置环境变量  
WORKDIR 指定默认的工作目录,即进入容器后默认进入的目录,一个落脚点  
VOLUME 创建挂载点,也称容器数据卷,用于数据共享和持久化  
CMD

指定容器启动时要运行的命令,与RUN不同的是,这些命令不是在镜像构建过程中执行的

Dockerfile中可以又多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

 
ENTRYPOINT

指定一个容器启动时要运行的命令 ENTRYPOINT和CMD一样,都是指定容器启动程序和参数

 
COPY

类似ADD 拷贝文件和目录到镜像中,

将从构建上下文目录中<源文件>的文件/目录复制到新的一层镜像内的<目标路径>位置 COPY src dest 或COPY [“src”,“dest”]

 
ADD 将宿主机目录下的文件拷贝文件到镜像中,且ADD命令会自动处理URL和自动解压tar压缩包  
EXPOSE 指定对外暴露的端口  
ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发  

构建新镜像语法

语法:docker build -f Dockerfile文件的路径 -t 镜像名:tag 命令执行的上下文

3. 案例

3.1 自定义centos镜像

# 1.编写Dockerfile文件
vi Dockerfile2
    FROM centos

    MAINTAINER tangxiaoyang@itany.com

    ENV MYPATH /usr/local/centos
    RUN mkdir -p $MYPATH
    WORKDIR $MYPATH

    RUN yum -y install vim

    RUN yum -y install wget

    # 创建挂载点,无法指定宿主机上对应的目录,是自动生成的
    VOLUME  ["/data1","/data2"]

    CMD ["/bin/bash"]
# 2.使用docker build构建镜像
docker build -f Dockerfile2 -t itany/centos:v1 . 
# 3.使用docker run运行容器
docker run -it b25b1dad795c
# 查看镜像的变更历史
docker history b25b1dad795c
# 验证挂载点:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0ddd/_data

3.2 自定义tomcat镜像

# 准备工作 

# 1.编写Dockerfile文件
vi Dockerfile
    FROM centos
    MAINTAINER tangxiaoyang@itany.com
    
    # 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下 
    # 拷贝文件,文件必须与Dockerfile在同一目录下
    COPY teacher.txt /usr/local
    
    #把java与tomcat添加到容器中
    ADD jdk-8u171-linux-x64.tar.gz /usr/local
    ADD apache-tomcat-8.5.30.tar.gz /usr/local

    # 配置java和tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.8.0_171
    ENV CLASSPATH .:$JAVA_HOME/lib
    ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.30
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
    
    ##设置工作访问时候的WORKDIR路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
   #WORKDIR $CATALINA_HOME 
    

    RUN yum -y install vim
    #容器运行时监听的端口
    EXPOSE 8080
    
        #启动时运行tomcat
       # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
       # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
       #CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache
   CMD ["catalina.sh", "run"]

# 2.使用docker build构建镜像
docker build -t itany/tomcat:1.0 .
# 3.使用docker run运行容器
docker run \
--name mytomcat \
-p 8080:8080 \
-v /my/tomcat/webapps/spring-web.war:/usr/local/apache-tomcat-8.5.30/webapps/spring-web.war \
-d itany/tomcat:1.0

 3.3 CMD和ENTRYPOINT的区别

  • CMD

    在Dockerfile中可以有多个CMD指令,但只有最后一条指令生效,所以一般只有一条CMD指令

    CMD指令在被docker run之后的参数覆盖

    vi aaa
    FROM centos
    CMD ["/bin/ls"]
    CMD ["/bin/bash"]
    docker build -f aaa -t itany/aaa . 
    docker run -it itany/aaa
    docker run -it itany/aaa /bin/pwd
  • ENTRYPOINT

    docker run之后的参数会被作为ENTRYPOINT指令的参数,组合形成新的命令

    vi bbb
    FROM centos
    ENTRYPOINT ["/bin/ls","/usr/local"]
    docker build -f bbb -t itany/bbb .
    docker run -it itany/bbb
    docker run -it itany/bbb -l  #  ls /usr/local -l

案例:

FROM cenos 

RUN yum install -y curl

CMD [ "curl", "-s", "http://ip.cn" ]

命令:docker build -f Dockerfile -t myip .

 

 

 

FROM cenos 

RUN yum install -y curl

ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

命令:docker build -f Dockerfile -t myip .

3.4 ONBUILD应用