• Dockerfile的使用以及docker部署java项目


    https://blog.csdn.net/xibei19921101/article/details/108385022

    DockerFile定制一切
    docker可以利用简单的编写程序构建出任何你想要的环境,同时可以跟业务代码相结合,快速构建和生成所需要的应用。

    Dockerfile用来创建一个自定义的Image,包含了用户指定的软件依赖等。使用Docker的build命令可以直接构建新的Image。它简化了从头到尾的流程并极大地简化了部署工作。

    一、Dockerfile语法
    Dockerfile语法由两部分构成:注释和命令+参数

    简单示例:构建一个简单的镜像

    Dockerfile可以将文件名字设置为Dockerfile,若是别的文件名需结合-f指令,指定Dockerfile的文件名

    在/gangye/dockerImageTestFile目录下编写两个Dockerfile文件,一个就为Dockerfile,另一个命名为helloDockerFile,里面的内容一致,皆为:

    FROM centos
    #只是单纯的打印"hello world"
    RUN echo "hello world"


    查看当前docker中的已有的镜像

    根据之前的Dockerfile创建镜像

    docker build -t my_first_docker_image /gangye/dockerImageTestFile/
    创建后再查看已有的镜像,刚刚的build执行语句已生效

    上述中执行使用另一个文件名为helloDockerFile的Dockerfile,执行后报错:

    Error checking context: 'no permission to read from '/proc/sys/net/ipv4/route/flush''.

    解决方案:docker创建镜像最好是在自定义的Dockerfile文件中执行创建

    .的含义:.表示docker使用当前目录作为构建上下文。这个目录与shell的工作目录一样,不是docker的工作目录。

    二、Dockerfile命令
    Dockerfile 的指令如下。

    FROM
    FROM命令可能是最重要的Dockerfile命令。此命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,则Docker将试图从Docker image index来查找该镜像。

    格式为FROM <image>或FROM <image>:<tag>。

    第一条指令必须为FROM指令(虽然目前最新的docker版本支持第一条不一定是FROM指令,但是为避免后续出错,最好第一条指令就是FROM)。并且,在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

    MAINTAINER
    格式为MAINTAINER <name>,指定维护者信息。其实就是类似javadoc注释中的@author,用于声明创作者,一般都放在文件比较靠上的位置。

    RUN
    从名称上就可以看出,RUN是执行或运行的意思。

    格式为RUN <command>或RUN["executable","paraml","param2"]。

    前者将在Shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如,RUN["/bin/bash","-c","echo hello"]。

    每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用"\"来换行。

    EXPOSE
    格式为EXPOSE <port>[<port>...]。

    告诉Docker服务端容器暴露的端口号,供互联系统使用。

    CMD
    支持三种格式:

    CMD ["executable","paraml","param2"]使用exec执行,推荐方式;
    CMD command paraml param2在/bin/sh中执行,提供给需要交互的应用;
    CMD ["paraml","param2"]提供给ENTRYPOINT的默认参数。
    指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,则只有最后一条会被执行。

    如果用户启动容器时指定了运行的命令,则会覆盖CMD指定的命令。

    ENTRYPOINT
    两种格式:

    1.ENTRYPOINT["executable","paraml","param2"]

    2.ENTRYPOINT command paraml param2(Shell中执行)。

    配置容器启动后执行的命令,并且不可被Docker RUN叫提供的参数覆盖。

    每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

    ENV
    格式为ENV <key> <value>。指定一个环境变量,会被后续RUN叫指令使用,并在容器运行时保持。

    例如 :

    ENV PG_MAJOR 9.3

    ENV PG_VERSION 9.3.4

    RUN curl - SL http://example.com/postgres-$PG_VERSION.tar.xz | tar-xJC/usr/src/postgress && …

    ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
    ADD
    格式为ADD <src> <dest>。

    该命令将复制指定的<src>到容器中的<dest>,其中<src>可以是 Dockerfile 所在目录的一个相对路径:也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

    COPY
    格式为 COPY <src> <dest> 。

    复制本地主机的<src> ( Dockerfile所在目录的相对路径)到容器中的<dest>。

    当使用本地目录为源目录时,推荐使用COPY。

    VOLUME
    格式为VOLUME ["/data"]。

    创建一个可以从本地主机或其他容器挂载的挂载点 , 一般用来存放数据库和需要保持的数据等。

    WORKDIR
    格式为WORKDIR /path/to/workdir。

    为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。

    可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

    WORKDIR /a

    WORKDIR b

    WORKDIR c

    RUN pwd

    最终路径为/a/b/c 。

    USER
    格式为USER daemon。

    指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。

    当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如,RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用go钮,而不推荐使用sudo。

    ONBUILD
    格式为ONBUILD [INSTRUCTION]。

    配置当创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。

    例如,Dockerfile使用如下内容创建了镜像image-A 。

    [...]

    ONBUILD ADD . /app/src

    ONBUILD RUN /usr/local/bin/python-build --dir /app/src

    [...]

    如果基于A创建新的镜像,新的Dockerfile中使用FROM image-A指定基础镜像,则会自动执行ONBUILD指令内容,等价于在后面添加了两条指令。

    FROM image-A

    #Automatically run the following

    ADD . /app/src

    RUN /usr/local/bin/python-build --dir /app/src
    使用ONBUILD指令的镜像,推荐在标签中注明,例如,ruby:1.9-onbuild。

    三、Dockerfile构建过程
    Dockerfile其实可以看作一个命令集,每行均为一条命令,每行的第一个单词就是命令command,后面的字符串是该命令所要接收的参数。比如ENTRYPOINT /bin/bash。ENTRYPOINT命令的作用就是将后面的参数设置为镜像的entrypoint。

    docker build的流程

    (1)提取Dockerfile(evaluator.go/RUN)。
    (2)将Dockerfile按行进行分析(parser/parser.go/Parse),每行第一个单词(如CMD、FROM等)叫作command。根据command,将之后的字符串用对应的数据结构进行接收。
    (3)根据分析的command,在dispatchers.go中选择对应的函数进行处理(dispatchers.go)。
    (4)处理完所有的命令,如果需要打标签,则给最后的镜像打上tag,结束。
    Dockerfile逆向

    通过docker history image可以看到该镜像的历史来源。即使没有Dockerfile,也可以通过history来逆向产生Dockerfile。

    四、构建Java环境
    1.首先做好准备工作,创建一个目录,在目录下,创建Dockerfile文件,以及准备好jdk以及一个可运行的jar文件

    2.在Dockerfile中编写内容

    # Set the base image to centos
    FROM centos

    ###############################################################
    # Dockerfile to build java container images
    # Based on CentOS
    # File Author / Maintainer
    ###############################################################
    MAINTAINER qigangye 2664725818@qq.com

    RUN mkdir /var/tmp/jdk
    COPY jdk-8u221-linux-x64.tar.gz /var/tmp/jdk
    RUN tar xzf /var/tmp/jdk/jdk-8u221-linux-x64.tar.gz -C /var/tmp/jdk
    RUN rm -rf /var/tmp/jdk/jdk-8u221-linux-x64.tar.gz
    # 将目录中的springboot_demo-1.0-SNAPSHOT.jar复制到容器中
    ADD springboot_demo-1.0-SNAPSHOT.jar app.jar

    ENV JAVA_HOME=/var/tmp/jdk/jdk1.8.0_221
    ENV PATH=$JAVA_HOME/bin:$PATH
    ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar

    EXPOSE 7001

    ENTRYPOINT ["java","-jar","/app.jar"]
    注意:若第一行不是FROM的指令,有的版本的docker会报Please provide a source image with `from` prior to commit这个错,升级docker的版本,或者将第一行的指令改为FROM即可

    3.在目录下执行docker build

    docker build -t jdk8demo .
    注意最后面的小数点,上面已说明,代表当前目录

    4.查看所有镜像

    5.执行镜像,并查看当前启动的容器以及所有容器

    docker run --name javademo -d -p 7001:7001 jdk8demo


    6.使用postman工具测试部署的java项目,成功

  • 相关阅读:
    Function overloading and return type
    Function overloading and const keyword
    Function Overloading in C++
    web安全测试相关内容(三)
    web安全测试相关内容(二)
    web安全测试相关内容(一)
    CDNDrive 第一个版本发布 & 布客新知第二次备份完成
    PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN
    布客&#183;ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.2
    计算机电子书 2019 BiliDrive 备份
  • 原文地址:https://www.cnblogs.com/zhoading/p/15806425.html
Copyright © 2020-2023  润新知