zoukankan      html  css  js  c++  java
  • docker. 打包

    Docker镜像打包示例

    一、war包(SpringMVC项目)镜像部署

    1、拉取tomcat镜像

    docker pull tomcat:8.5.30

    2、上传需要部署的war包(以hello.war为例)到自定义的工作目录下

    3、在上个步骤创建的工作目录下创建Dockerfile文件。将war包和Dockerfile文件放在同一目录下。Dockerfile文件内容如下:

    1.  
      from tomcat:8.5.30
    2.  
       
    3.  
      ENV LANG C.UTF-8
    4.  
       
    5.  
      ENV TZ=Asia/Shanghai
    6.  
       
    7.  
      ENV JAVA_OPTS "-Djava.awt.headless=true"
    8.  
       
    9.  
      RUN touch /usr/local/tomcat/bin/setenv.sh && chmod +x /usr/local/tomcat/bin/setenv.sh && echo "CLASSPATH=/xx/hello" >/usr/local/tomcat/bin/setenv.sh
    10.  
       
    11.  
      RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    12.  
       
    13.  
      RUN rm -rf /usr/local/tomcat/webapps/*
    14.  
       
    15.  
      ADD hello.war  /usr/local/tomcat/webapps/
    16.  
       
    17.  
      WORKDIR /usr/local/tomcat/bin/
    18.  
       
    19.  
      CMD ["catalina.sh", "run"]

    4、创建镜像(注:-t 表示为该镜像起名称,另外,构建命令后面有个英文实心点,表示当前目录。)

    docker build -t hello .

    5、通过docker images可以查看该镜像是否已经创建成功了

    docker images | grep hello

    6、运行自己的镜像,查看是否正常启动(注: -d:表示在后台运行该镜像,按ctrl+C不会终止该程序;-p:表示指定本机的访问端口对应容器的端口)

    docker run -d -p 30802:8080 hello

    7、docker镜像导出,tar镜像包可以拷贝到其他机器docker环境中加载

    docker save hello -o hello.tar

    8、docker镜像加载

    docker load -i hello.tar

    9、测试示例

    http://ip:30802/hello

    二、zip包(SpringBoot项目)镜像部署

    1、拉取tomcat镜像

    docker pull java:8

    2、上传需要部署的zip包(以hello.zip为例)到自定义的工作目录下。

    3、在上个步骤创建的工作目录下创建Dockerfile文件。将zip包解压,和Dockerfile文件放在同一目录下。Dockerfile文件内容如下:

    1.  
      from java:8
    2.  
       
    3.  
      ENV LANG C.UTF-8
    4.  
       
    5.  
      ENV TZ=Asia/Shanghai
    6.  
       
    7.  
      ENV JAVA_OPTS=" -Dspring.config.location=/hello/application.properties"
    8.  
       
    9.  
      RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    10.  
       
    11.  
      ADD hello.zip  .
    12.  
       
    13.  
      RUN unzip hello.zip
    14.  
       
    15.  
      RUN chmod +x /hello/bin/start.sh
    16.  
       
    17.  
      RUN chmod +x /hello /bin/stop.sh
    18.  
       
    19.  
      CMD cd /hello /bin/&&./start.sh

    4、创建镜像(注:-t 表示为该镜像起名称,另外,构建命令后面有个英文实心点,表示当前目录。)

    docker build -t hello .

    5、通过docker images可以看到该镜像已经创建成功了

    docker images | grep hello

    6、运行自己的镜像(注: -d:表示在后台运行该镜像,按ctrl+C不会终止该程序;-p:表示指定本机的端口对应容器中的端口。-it表示以交互模式运行容器并分配伪终端。uap-service项目内置了一个tomcat容器,在其application.properties配置文件中server.port=8080。若设置server.port=xxx,则命令相应位置为30803:xxx)(打开伪终端,进去容器)

    docker run -p 30803:8080 hello

    7、docker镜像导出,tar镜像包可以拷贝到其他机器docker环境中加载

    docker save hello -o hello.tar

    8、docker镜像加载

    docker load -i hello.tar

    9、测试示例

     http://ip:30803/hello

    三、镜像部署常用操作

    查看所有容器

    docker ps -a

    停止容器运行

    docker stop {containerID}

    删除容器(-f强制删除,正在运行的容器也删除)

    docker rm -f {containerID}

    删除镜像(-f强制删除,否则需先停止容器运行才能删除镜像)

    docker rmi -f hello

    镜像打tag(可以用这种方法更新tag)

    docker tag hello hello:1.0.0

    查看指定镜像

    docker images |grep hello

    查看指定进程

    docker ps | grep hello

    将镜像push到镜像仓库

    docker push xx.xx.xx.xx/hello

    进入正在运行的容器执行指令(exec命令进入容器再退出后,容器不会停止;attach进入容器再退出后,容器停止)

    docker exec -it 0e6d50eb1469(container ID) /bin/bash

    docker attach 0e6d50eb1469(container ID)

    退出容器

    exit / ctrl + c

    根据容器的状态,删除exited状态的容器

    sudo docker rm $(sudo docker ps -qf status=exited)

    退出容器伪终端

    按顺序依次ctrl+p,ctrl+q(退出终端不关闭容器)

    exit或ctrl+d(退出终端并关闭容器)

    CMD

    支持三种格式

    CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;

    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

    CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

    指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

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

    ENTRYPOINT  

    两种格式:

    ENTRYPOINT ["executable", "param1", "param2"]

    ENTRYPOINT command param1 param2(shell中执行)。

    配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

    在容器执行脚本时,注意。当前容器本身是主进程,start.sh的操作是守护进程,必须保证最后一个守护进程处于前台运行状态,否则容器会在执行脚本完成会自动关闭容器,容器停止运行后,所有的脚本里面的进程也随之终止。

    之所以出现这种现象,究其原因,一个docker容器同时只能管理一个进程,这个进程退出后,容器也就退出了。这并不意味着一个容器里只能同时运行一个进程(那样太浪费了),只是最后一个运行的进程不能退出。

    修改start.sh,保持java命令前台运行,即可避免容器在执行完脚本后exited的情况。start.sh修改如下:

    1.  
      #! /bin/sh
    2.  
       
    3.  
       
    4.  
      APPNAME=com.xx.xx.rest.Application
    5.  
       
    6.  
      java -Xms2048m -Xmx2048m -classpath $CLASSPATH $APPNAME >/dev/null 2>&1

    start.sh总结总结:

    (1)容器中运行多个守护进程时,前面的进程要用后台方式运行(或添加 &),否则后面的服务无法启动。

    (2)容器中最后一个守护进程一定要用前台方式运行,否则start.sh退出,容器退出,所有的服务就白启动了。

  • 相关阅读:
    45个非常有用的Oracle查询语句(转自开源中国社区)
    Oracle创建表空间及用户
    table里面,怎么根据checkbox选择的一行中的某个单元格的值是否为空,来判断是否该选中
    点击上传按钮,文件自动上传
    如何给frame标签的src属性以及a标签的href属性自动设值
    Tomcat内存溢出的三种情况及解决办法分析
    Java中判断字符串是否为数字的五种方法
    SSH项目里面 忘记密码的邮件发送功能
    form表单提交时,action怎么带参数
    因为多余jar包,所报的错
  • 原文地址:https://www.cnblogs.com/xiexun/p/13695736.html
Copyright © 2011-2022 走看看