美文网首页Java技术升华docker容器云
Docker基本概念与实践(五)-使用dockerfile部署简

Docker基本概念与实践(五)-使用dockerfile部署简

作者: Garwer | 来源:发表于2018-04-26 01:16 被阅读124次

    Dockerfile简介

    Dcokerfile是一个文本格式的配置文件,由一系列命令和参数构建的脚本,用户可通过这个快速构建自定义的镜像 
    

    ​ 官方仓库dockerhub和一些镜像仓库已经提供大量的镜像,但有些时候不能满足我们的需求,例如安装一些安装比较少的第三方软件,或自定义的项目,这个时候只能先用公共仓库镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像等等。。。

    ​ 这种方式显得比较臃肿,Dockerfile为自动化创建部署镜像提供了解决方案。

    Dockerfile基本结构

    基础镜像信息:以哪个镜像作为基础进行制作,用法是FROM 基础镜像名称
    维护者信息:指定维护者信息,用法是MANITAINER 名字/邮箱
    镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行特殊配置等,使用run命令
    容器启动执行命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD、ENTRYPOINT命令
    
    几个重要参数
    ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖
    ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
    CMD,表示镜像运行默认参数,可被重写覆盖
    copy与add的区别
    copy:能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统
    add:不仅能将构建命令所在的主机和目录,还能将远程url对应的文件或目录作为资源复制到镜像文件系统。如果是压缩文件如tar还会帮忙解压
    若需要初始化多个命令,彼此可使用&&隔开
    

    很形象的一张图

    来自简书app
    #创建dockerfile文件
    touch dockerfile
    
    #与mkdir的区别 touch能更新文件时间戳,如果不存在可新建文件(file),mkdir则只是新建目录(folder)
    #如果filename存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间
    #如果filename不存在,touch指令会在当前目录下新建一个filename空白文件
    
    需注意的地方

    在Docker daemon(守护进程)模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出,例如

    #以下两种方式运行几秒钟之后,容器就会退出
    ENTRYPOINT service tomcat8 start
    CMD service tomcat8 start 
    
    #以下方式容器不会自动退出
    ENTRYPOINT service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out
    CMD service tomcat8 start && tail -f /var/lib/tomcat8/logs/catalina.out
    

    如创建包含jdk的ubuntu基础镜像不从本地获取 而在容器内apt-get安装,例如
    FROM ubuntu:14.04
    MAINTAINER mhy "641084049@qq.com"
    
    RUN apt-get update
    RUN apt-get install -y -q openjdk-7-jdk
    
    WORKDIR /
    
    ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
    CMD ["/bin/bash"]
    
    定制简单的dockerfile并运行完整例子

    (这边我用已有的会比较快点,实际应用环境在容器内下载,从宿主机copy或add都有可能用到)

    #基础镜像
    FROM ubuntu:latest
    
    #维护者信息
    MAINTAINER Garwer 
    
    #将压缩好的jdk1.8.0_171 命名为jdk8 并配置环境 (tomcat同理)
    COPY jdk1.8.0_171 /usr/local/jdk8/
    COPY apache-tomcat-9.0.7 /usr/local/tomcat9/
    ENV JAVA_HOME /usr/local/jdk8
    ENV PATH $JAVA_HOME/bin:$PATH
    ENV CATALINA_BASE /usr/local/tomcat9
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    ENTRYPOINT /usr/local/tomcat9/bin/startup.sh&&tail -F /usr/local/tomcat9/logs/catalina.out
    
    文件结构
    构建并运行
    #在Dockerfile目录下构建镜像 并自定义 镜像名:标签 需注意后面有个.
    docker build -t="ubuntu_web:v1" .
    
    #启动镜像 
    docker run -d -t -i -p 8080:8080 ubuntu_web:v1
    
    进入容器并测试本地运行 远程访问公网ip测试
    2.定制dockerfile,使用springboot项目,导成jar包在ubuntu容器内运行的镜像
    #springboot内嵌tomcat,例如在本地运行java -jar xxx  
    java -jar docker.jar
    
    #后台运行 后面加& 这种方式缺点是窗口关闭程序中止
    java -jar docker.jar &
    
    #不挂断运行命令 退出或终端关闭仍然运行 缺点:当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件
    nohup java -jar docker.jar &
    
    #指定输出文件运行jar 输出内容不打印到屏幕上 将输出pid 日志文件在自定义新生成的out.log查看
    nohup java -jar docker.jar >out.log &
    
    #根据不同的启动方式CTRL+c或者杀进程来关闭服务
    
    运行springboot项目导出的jar包

    现在将jar包远程到装有docker的宿主机上,再导入到容器中,测试运行,编写dockerfile定制镜像,测试运行

    大致步骤
    1.将jar包传到服务器上,新建一个目录
    2.跟前一个dockerfile大致相同 不过路径要做相应调整,编写dockerfile
    3.构建镜像并运行
    
    #构建镜像
    docker build -t="ubuntu_springboot:v1" .
    
    #启动镜像 
    docker run -d -t -i -p 8080:8080 ubuntu_springboot:v1
    
    #相比于上个dockerfile 因为jar包自带tomcat省掉了tomcat的配置 
    FROM ubuntu:latest
    MAINTAINER Garwer 
    COPY jdk1.8.0_171 /usr/local/jdk8/
    ENV JAVA_HOME /usr/local/jdk8
    ENV PATH $JAVA_HOME/bin:$PATH
    #ENV CATALINA_BASE /usr/local/tomcat9
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    ADD docker.jar app.jar
    
    EXPOSE 8080
    
    #运行这个jar -jar /app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
    成功运行并通过公网访问

    相关文章

      网友评论

      • IT人故事会:贵在坚持,么么哒!我也是个爱写文章的人
        Garwer:@IT人故事会 谢谢支持啊!其实自己也是别学边写的,养成一个习惯对自已也有帮助,洗洗睡了:grin:

      本文标题:Docker基本概念与实践(五)-使用dockerfile部署简

      本文链接:https://www.haomeiwen.com/subject/nhgulftx.html