DockerFile

  • 初识DockerFile

    DockerFile就是用来构建docker镜像的构建文件,命令脚本。

    通过这个脚本可以生成镜像,镜像是一层一层的,脚本的每个命令都是一层。

    小例子:

    • dockerfile1
    1
    2
    3
    4
    5
    6
    FROM centos

    VOLUME ["volume01","volume02"]

    CMD echo "-------end-------"
    CMD /bin/bash
    • docker build -f dockerfile1 -t yio/centos:1.0 . (-t 后不能以 “/” 开头)

    • 根据fockerfile创建容器镜像

      image-20220716233049319

    • 运行容器,查看容器的文件目录

      运行容器

    • 查看挂载目录的数据卷信息 docker inspect [docker id]

      image-20220716233939299

    • 查看同步信息:

      cd /var/lib/docker/volumes/873e4aad2ecc323526142d2a491d9ed51a0d762f6094cae5643469369c545ae7/_data
      image-20220716234108711

    • 倘若使用DockerFile构建镜像时没有挂载卷,要手动挂载卷 -v 卷名:容器内路径

    数据卷容器

    例如多个MySQL同步数据

    容器中的数据在容器删除后就会消失,$\textcolor{yellow}{所以需要持久化到本地}$。此时,我们可以使用-v来实现数据挂载到本地目录:

    • -v :[容器内路径]来实现匿名挂载
    • -v [name]:[容器内路径]来实现具名挂载

    image-20220716234818879

    小例子:

    • 启动一个docker01

      image-20220716235208104

    • 启动docker02

      docker run -it --name docker02 --volumes-from docker01 66b

      image-20220716235507556

    • 在docker01中的volume01目录中创建数据,查看同步结果

      image-20220716235734836

      image-20220717000023463

    • 删除docker01文件仍然存在,类似于备份机制。都挂载在宿主机的同一个目录下。

    • 结论:

      数据卷容器的生命周期一直持续到没有容器使用为止。一旦持久化到了本地,本地数据就是不会删除的了。

    DockerFile

    是用来构建docker镜像的文件,命令参数脚本。

    构建步骤:

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

    例如:

    image-20220717001919508

    看一眼Centos的DockerFile

    image-20220717002049690

    DockerFile小知识

    • 基础知识

      • 每个保留关键字(指令)都必须是大写字母
      • 执行顺序按照从上到下
      • # 表示注释
      • 每一指令都会创建提交一个新的镜像层,并提交
    • DockerFile 是面向开发的,也就是说我们以后发布项目做镜像,就需要编写dockerfile文件,这个文件十分简单!

    • tips:

      • DockerFile:构建文件,定义了一切步骤,源代码文件
      • DockerImages:通过DockerFile构建生成的镜像,是最终发布和运行的产品
      • Docker容器:容器就是镜像运行起来的服务器

    DockerFile的指令

    FROM 基础镜像,一切从这里开始构建
    MAINTAINER 镜像的作者:姓名+邮箱
    RUN 镜像构建时需要运行的命令
    CMD 设置容器的启动命令 CMD /bin/bash 一个CMD执行多个只有最后一个会生效,可被替代。可以写多个CMD命令
    COPY COPY <源路径>… <目标路径>,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
    ADD 复制文件到镜像中,ADD 指令和 COPY 的格式和性质基本一致。但是ADD的<源路径>可以是一个 URL,下载到<目标路径>去。
    WORKDIR WORKDIR /path/to/workdir镜像的工作目录
    VOLUME 挂载的目录
    ENTRYPOINT 指定这个容器在启动时要运行的命令 可以追加命令。用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序
    ONBUILD ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src用于设置镜像触发器。当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发
    EXPOSE 暴露端口
    ARG ARG <name>[=<default value>]用于指定传递给构建运行时的变量
    STOPSIGNAL 用于设置停止容器所要发送的系统调用信号,必须是内核系统调用表中的合法的值
    SHELL 用于设置执行命令(shell式)所使用的的默认 shell 类型,SHELL在Windows环境下比较有用,Windows 下通常会有 cmd 和 powershell 两种 shell,可能还会有 sh。这时就可以通过 SHELL 来指定所使用的 shell 类型
    LABEL LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"用于为镜像添加元数据,以键值对的形式指定。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
    USER USER user:group用于指定运行镜像所使用的用户。使用USER指定用户时,可以使用用户名、UID 或 GID,或是两者的组合(使用 : 间隔)
    ENV K V orK=V 形式。这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。

    CMDENTRYPOINT的区别

    • CMD的命令会被 docker run 的命令覆盖而 ENTRYPOINT 不会,且ENTRYPOINT可以追加命令

    • CMD 指令的目的是:为容器提供默认的执行命令。
      CMD 指令有三种使用方式,其中的一种是为 ENTRYPOINT 提供默认的参数:

      1. CMD ["param1","param2"] 写在ENTRYPOINT下面,将作为参数添加到ENTRYPOINT []
        另外两种使用方式分别是exec 模式和shell 模式:
      2. CMD ["executable","param1","param2"] // 这是 exec 模式的写法,注意需要使用双引号。
      3. CMD command param1 param2 // 这是 shell 模式的写法。
        注意命令行参数可以覆盖 CMD 指令的设置,但是只能是重写,却不能给 CMD 中的命令通过命令行传递参数。
    • ENTRYPOINT 指令的目的也是为容器指定默认执行的任务。
      ENTRYPOINT 指令有两种使用方式,就是我们前面介绍的exec 模式和shell模式:

      1. ENTRYPOINT ["executable", "param1", "param2"] // 这是 exec 模式的写法,注意需要使用双引号。
      2. ENTRYPOINT command param1 param2 // 这是 shell 模式的写法。会完全忽略命令行参数
        exec 模式和 shell 模式的基本用法和 CMD 指令是一样的,下面我们介绍一些比较特殊的用法。

      指定 ENTRYPOINT 指令为 exec 模式时,docker run命令行上指定的参数会作为参数添加到 ENTRYPOINT 指定命令的参数列表中。

    • ```dockerfile
      #1.如果dockerfile如下
      FROM centos
      CMD [“ls”,”-a”]
      #2.构建
      docker build -f dockerfile -t cmdtest
      #3.run运行 发现 CMD命令运行正常
      docker run cmdtest
      #4.想追加命令 运行失败 -l 替换了 dockerfile中的CMD命令
      docker run cmdtest -l
      #5.新dockerfile
      FROM centos
      ENTRYPOINT [ “ls”, “-a” ]
      CMD [“-l”]
      #构建后运行
      docker run cmdtest
      #运行成功 最后执行的是 ls -a -l 命令
      docker run cmdtest -S
      #运行成功 最后执行的是 ls -a -S 命令

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26

      ### 实战测试

      Docker Hub中99%的镜像都是从这个基础镜像过来的: `FROM scratch`,然后再配置需要的软件和配置来进行构建。

      创建一个自己的Centos

      - DockerFile

      ```dockerfile
      #mydockerfile

      FROM centos:7
      MAINTAINER yio<3226314806@qq.com>

      ENV MYPATH /usr/local
      WORKDIR $MYPATH

      RUN yum -y install vim
      RUN yum -y install net-tools

      EXPOSE 80,3310

      CMD echo $MYPATH
      CMD echo "===end==="
      CMD /bin/bash
    • 通过这个文件构建镜像

      docker build -f mydockerfile -t mycentos:0.1 .

      image-20220717220432980

    docker run -it mycentos:0.1

    image-20220717220755678

    • 看一眼官方的mysql是怎么做的

      image-20220717221348444

    Dockerfile制作tomcat镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # Dockerfile
    FROM centos:7
    MAINTAINER yio<3226314806@qq.com>
    COPY readme.txt /usr/local/readme.txt
    #添加 并解压
    ADD jdk-8u11-linux-x64.tar.gz /usr/local
    ADD apache-tomcat-9.0.22.tar.gz /usr/local

    RUN yum -y install vim
    #工作目录
    ENV MYPATH /usr/local
    WORKDIR $MYPATH

    ENV JAVA_HOME /usr/local/jdk1.8.0_11
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

    EXPOSE 8080

    #启动tomcat
    CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
    #end

    #构建
    docker build -f Dockerfile -t mytomcat .
    #运行
    docker run -d -p 9090:8080 --name diytomcat -v /home/yio/docker-test/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/yio/docker-test/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs mytomcat
    #做了挂载,在本地目录发布项目就可以同步到容器内部了

    发布自己的镜像

    DockerHub

    1. https://hub.docker.com/ 注册

    2. 在服务器上登录docker

      docker login -u 用户名 -p

    3. 登录之后就可以提交了

      • 先使用docker tag 原镜像名:1.0 用户名/镜像名:1.0将镜像名修改成标准的名字

      • 然后使用docker push 用户名/镜像名:1.0提交

    Docker图

    20200913222649722

    20200913223111483

    参考

    作者: Meow Mii

    本文链接: https://blog.yiochin.top/p/f5f9fa9b.html

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议,转载请注明出处!


    📝 Comment