zoukankan      html  css  js  c++  java
  • docker使用的一些需要注意事项

    1、程序需要前台运行

          程序必须前台执行,如果是java进程的话  不要有nohup   或者使用service的方式进行后台运行

          否则可能会出现频繁启动应用的问题

          原因就是docker只能管理运行中的镜像的一个进程(所以没有特殊需要不要一个镜像执行后出现两个进行的现象,尽量使用k8s的pod来解决)

    2、日志要前台打印

          日志直接console前台输出即可,docker会自动收集stdout输出的日志。不要存在打两份日志的设置,比如一份file,一份console等。

    3、配置文件最好放在镜像内或远程可读取,非必要不要进行卷挂载目录进行读取

          有些程序的配置文件是外置的,运行包和配置文件没有在一个执行包中。

          如果有以上情况可以将配置文件和运行包都包含在镜像当中。

          如果有些配置文件需要在不同的环境下做出修改或更换,就需要对应用程序进行分别打镜像或者改造一下程序,使其只是远程获取配置文件。分别打镜像不太符合整个发布流程,因为分别打镜像包中间可能会有差异,造成生产和开发测试不同。

          还有一种方法就是使用k8s的configmap的服务来解决对应读取文件的问题。

    4、数据卷的使用

          每个容器运行之后不管你有没有显示的指定创建数据卷,都会有一个临时卷的存在,来存储一些临时生成的文件

          这些临时文件会随着容器的生命周期而变化

          如果你直接指定创建了数据卷,一定要创建在共享存储里面

          否则会出现容器漂移之后读不到数据的情况

          这种服务就叫做“有状态”的服务,一般我们的服务要做到“无状态”的

          如果你的服务是有状态的,可以借助k8s的statuefulset来实现,包括启动顺序和给服务编号等操作。

    5、网络相关的注意事项(不要有创建网络相关的操作)

          (我们几乎用不到)

          要让docker内服务识别正确的网卡

    6、dockerfile

          这里我定义了一个springboot微服务对应的dockerfile文件用来打镜像包,不管你现在用什么方式最后本质上都是使用 dockerfile来打镜像的

          (如果我们的上线流程不是一个人完成,那么不建议使用maven插件的形式进行打镜像包,因为运维或者测试人员很可能不懂你的maven文件也不能修改你的pom配置,这样可能会给后期维护造成麻烦。dockerfile是唯一知道生成镜像依据的文件,可以使用版本控制进行管理随着你的应用进行升级等。镜像是一个黑盒子可以在docker文件系统中使用它,但是他不是一个独立的文件。)

       
    FROM com.cn/java:8-jdk-alpine-asla-shanghai-1-skyagent-3
    VOLUME /tmp
    ADD springcloud-zjs-example-mysql-0.0.1.jar app.jar
    EXPOSE 11005
    ENV JAVA_OPTS="" AGENT_SERVICE_NAME="default" AGENT_COLLECTOR_ADDRESS="10.10.6.79:11800"
    ENTRYPOINT java -javaagent:/usr/local/skyagent/skywalking-agent.jar=agent.service_name=${AGENT_SERVICE_NAME},collector.backend_service=${AGENT_COLLECTOR_ADDRESS} ${JAVA_OPTS} -jar /app.jar

           下面的链接是对上面文件的解释

         https://github.com/zygfengyuwuzu/docker-miscellaneous

           这个dockerfile中设置了三个参数

                  JAVA_OPTS是jdk的参数,这个参数可以自己设置内存等jvm相关的优化

                  AGENT_SERVICE_NAME 是设置skywalking的名称

                  AGENT_COLLECTOR_ADDRESS 设置skywalking数据传输的地址

                 SpringBoot项目中的所有可配置项都是可调参数,不用特殊指定。

            如果你不需要skywalking进行监控最后一句可以修改成下面这样,只保留jdk参数

            ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar

    7、打镜像的一些问题

          打包的时候将 dockerfile和jar包最好放在同一路径下

          这样是比较容易指定要打进镜像中 文件的路径

          不容易出错和误将不需要文件打进镜像的可能的

          (可以将需要打进镜像的文件都放在一个目录文件夹中或者和dockerfile相同目录)

           打镜像包最好使用一个服务器进行打包和上传,因为多次生成镜像本地会有缓存文件使用会非常快

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

           对于怎么样实现集成自动化可以参考如下博客(这个博客是jenkins与docker swarm集成的例子,可以将swarm换成k8s,对应的插件换一下)

        https://www.cnblogs.com/zhyg/p/7845612.html

  • 相关阅读:
    多线程与高并发常见面试题(1)
    LoadRunner 多用户并发 登录,上传数据,登出的脚本教程
    windows cmd 链接远程mysql服务器
    Ubuntu 16.04添加阿里云源
    sqlite 数据库与mysql 数据库使用区别记录
    jdk源码之 hashmap 与hashtable 的区别
    通过构造器启动线程的实现方式及其缺点记录。
    eclipse 中过滤空包,目录树中不显示。
    javascript中正则实现读取当前url中指定参数值方法。
    Reactjs+Webpack+es2015 入门HelloWord(一)
  • 原文地址:https://www.cnblogs.com/zhyg/p/11239043.html
Copyright © 2011-2022 走看看