• Dockerfile使用介绍(入门教程)



    以下是Docker相关笔记总结,方便自己以后复习,同时也希望对大家有所帮助。


    概念

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

    镜像的定制实际上就是定制每一层所添加的配置。若把每一层修改、安装、构建、操作的命令都写入一个脚本,用该脚本来构建镜像。这个脚本就是 Dockerfile。

    Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可。

    构建步骤

    1. 编写Dockerfile文件
    2. docker build 构建成为一个镜像
    3. docker run 运行镜像
    4. docker push 发布镜像(dockerHub,阿里云镜像仓库)

    基础知识

    1. 每个保留关键字(指令)都必须是大写的
    2. 命令执行从上到下顺序执行
    3. #表示注释
    4. 每个指令都会创建提交一个新的镜像层,并提交

    完整镜像的结构图:
    在这里插入图片描述
    DockerFile:构建文件,定义了一切的步骤,源代码
    DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
    Docker容器:容器就是镜像运行起来提供服务的

    常用指令说明

    指令解释
    FROM基础镜像
    MAINTAINER镜像作者,一般格式为:姓名+邮箱
    RUN镜像构建的时候需要运行的命令
    AND添加内容指令,从上下文目录中添加文件或者目录到容器里指定路径,在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
    COPY复制指令,从上下文目录中复制文件或者目录到容器里指定路径。COPY <源文件> <目标路径>
    WORKDIR镜像的工作目录,进入容器时默认目录
    VOLUME挂载的目录
    EXPOSE暴露端口配置
    CMD指定这个容器启动的时候要运行的命令,可被docker run 的命令行参数指定的指令所覆盖
    ENTRYPOINT指定这个容器启动的时候要运行的命令,不被docker run 的命令行参数指定的指令所覆盖,可在其后追加命令
    ONBUILD用于延迟构建命令的执行,当构建一个被继承 dockerfile 这个时候就会运行ONBUILD的指令,触发指令
    ENV构建的时候环境变量

    实战测试

    编写Dockerfile制作自己的Ubuntu镜像
    在此镜像中存在vim命令和net-tools

    1. 编写Dockerfile文件
    FROM ubuntu 
    MAINTAINER bbx
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    #使用-i 在文件中替换
    RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/#' /etc/apt/sources.list
    RUN apt-get update
    RUN apt-get install -y vim
    RUN apt-get install -y net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    说明
    替换源命令格式: sed -i 's/原字符串/替换字符串/' filename

    1. 构建镜像
      最后的.不要忘记写
     docker build -f mydockerfile -t myubuntu:1.0 .
    
    • 1
    1. 查看构建的镜像
    root@VM-4-3-ubuntu:/home/dockerfile# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
    myubuntu              1.0       3dc827ed14b8   10 minutes ago   176MB
    
    • 1
    • 2
    • 3
    1. 运行镜像
    docker run -it --name myubuntu01 myubuntu:1.0 /bin/bash
    
    • 1
    1. 测试是否安装net-tools
    #5. 测试net-tools
    root@54d0634a778d:/usr/local# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
            RX packets 12  bytes 976 (976.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    扩展

    查看本地镜像的变更历史
    docker history 镜像id

    #查看本地镜像
    root@VM-4-3-ubuntu:~# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
    myubuntu              1.0       3dc827ed14b8   20 minutes ago   176MB
    #查看变更历史
    root@VM-4-3-ubuntu:~# docker history 3dc827ed14b8
    IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
    3dc827ed14b8   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
    20a60530bcd5   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    92eff2556955   20 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
    63f7ce3c1a27   20 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
    b7f427f02e17   20 minutes ago   /bin/sh -c apt-get install -y net-tools         1.46MB    
    527f218c9f27   20 minutes ago   /bin/sh -c apt-get install -y vim               59.3MB    
    8ca15ec4fb21   22 minutes ago   /bin/sh -c apt-get update                       37.7MB    
    dde78790ea52   24 minutes ago   /bin/sh -c sed -i 's#http://archive.ubuntu.c…   2.54kB    
    cc77e008ed87   24 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
    7a96d052bc39   24 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
    05d8fb2ee2a5   24 minutes ago   /bin/sh -c #(nop)  MAINTAINER bbx<1101249732…   0B        
    216c552ea5ba   2 weeks ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B        
    <missing>      2 weeks ago      /bin/sh -c #(nop) ADD file:6cd2e13356aa5339c…   77.8MB    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    【failed to solve: ***: failed commit on ref “unknown-sha256:】
    域名扫描工具subDomainBrute源码分析
    批量检测url是否存在cdn—高准确率
    eBPF会成为服务网格的未来吗?
    插入排序 python实现
    灵性图书馆:好书推荐-《奥修传》
    Python time模块获得当前时间
    linux硬盘分区和挂载
    【小程序】统计字符
    Java Spring框架是什么?它有哪些好处?
  • 原文地址:https://blog.csdn.net/BBQ__ZXB/article/details/127455437