5、Dockerfile

5.1、Dockerfile镜像常用指令

  FROM
    指定构建新镜像时使用的基础镜像
  MAINTAINER
    作者的信息
  ADD
    将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
  COPY
    功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。同样需求下,官方推荐使用 COPY
  LABEL
    用于为镜像添加元数据
  ENV
    设置环境变量
  EXPOSE
    指定于外界交互的端口
  VOLUME
    用于指定持久化目录(指定此目录可以被挂载出去)
  WORKDIR
    工作目录,类似于cd命令。设置了工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等都会在该目录下执行。
  USER
    指定运行容器时的用户名或 UID
  ARG
    定义构建镜像时的变量,相当于构建镜像时可以在外部为里面传参
  ONBUILD
    用于设置镜像触发器
  格式: 
    ONBUILD [INSTRUCTION]
  示例:
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src
  注:
    NNBUID后面跟指令,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
  RUN
    镜像构建【docker build】时执行的命令。如果有多个RUN,自上而下依次运行
  CMD
    容器启动【docker run】时执行的命令。如果有多个CMD,只有最后一个运行。
    当使用docker run命令的时候,可以在整个 docker 命令的【最后】加上其他额外的命令,那么额外的命令会覆盖Dockerfile中所有的CMD命令,
    例如我们执行如下命令:【docker run -it centos ls / -l】,【ls / -l】会覆盖Dockerfile中所有的CMD命令。
  ENTRYPOINT
    功能类似CMD,如果有多个Entrypoint,只有最后一个运行。如果CMD和ENTRYPOINT共存,则只有ENTRYPOINT运行,且最后的CMD会被当做ENTRYPOINT的参数。
  例一:
  Dockerfile:
    FROM centos
    MAINTAINER zhengjingmao@163.com
    RUN mkdir -p /datas/
    ENTRYPOINT ["echo", "hello"]
    CMD ["world"] #会将world作为echo hello的参数,最后的命令其实为echo hello world
  例二:
  Dockerfile:
    FROM centos
    MAINTAINER zhengjingmao@163.com
    RUN mkdir -p /datas/
    ENTRYPOINT ["echo", "hello"]
  执行启动命令:
    docker run -it my-centos word
    命令最后面的 word 会作为 Dockerfile ["echo", "hello"] 中的参数,最终形成的命令为 ["echo", "hello", "word"]

5.2、Dockerfile制作镜像

  如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
  如果有多个CMD,只有最后一个运行
  如果有多个Entrypoint,只有最后一个运行
  如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数

  构建镜像命令: docker build -f /path/Dockerfile
  docker build . # "."表示当前目录

  build并不是在本地构建,而是在docker引擎中构建的。
  实际上Dockerfile的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,
  比如可以用 -f …/Dockerfile 参数指定某个文件作为 Dockerfile。当然,一般大家习惯性的会使用默认的文件名Dockerfile,以及会将其置于镜像构建上下文目录中。

  【docker build -t nginx:v3 .】
  上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
  解析:
  由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。
  这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
  注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

5.3、Dockerfile部署springboot服务案例

  1、创建springboot项目,使用:mvn clean package命令打包【demo-1.0-SNAPSHOT.jar】;

  2、创建Dockerfile文件,编写内容

FROM java:8
MAINTAINER hs
ADD demo-1.0-SNAPSHOT.jar app.jar
CMD ["java", "-jar", "app.jar"]
EXPOSE 8081

  3、上传jar包和Dockerfile文件到linux服务器,放在同一目录下;

  4、构建镜像

    docker build -t demo:1.0 .

    demo:镜像名,1.0:镜像tag

    注意后面的“.”

    

  5、创建容器

    docker run --name demo -d -p 8081:8081 demo:1.0/镜像id

     

    可更改容器名和映射端口继续创建容器快速集群部署:

    docker run --name demo2 -d -p 8082:8081 cd3fed94b7cf

posted @ 2022-06-21 09:48  java小天地  阅读(96)  评论(0编辑  收藏  举报