标签: Docker

  • 根据Commit ID自动触发Docker Hub的构建

    根据Commit ID自动触发Docker Hub的构建

    有时候自己的Docker镜像需要上传到Docker Hub上,为了保证镜像的更新,我们需要出发Docker Hub的构建。具体操作有以下几种:

    1. 从Travis CI(或者其他CI)来触发,每次提交自动构建新的镜像到Docker Hub
    2. 从其他镜像触发,比如你的镜像依赖了tomcat,那么就可以在Docker Hub中配置tomcat镜像一更新,你自己就更新
    3. 通过Docker Hub手动触发

    这三个方法看起来第一个最好,但是有个先决条件,项目库或者说CI权限在自己手动。如果你的镜像编译了第三方的repo,那其实你没有办法配置webhook这一类的通知来触发构建。

    因为最近在用阿里云函数计算,所以想到一个取巧的方法,通过commit id来判断是否为最新构建,大致思路如下:

    1. 在Dockerfile中输出commit id
    2. 通过Github API获取目标项目的最新commit id
    3. 通过Docker Hub API获取最新构建的日志
    4. 对比日志,如果commit id一样,就说明构建是最新的
    5. 如果不一样,就调用Docker Hub API触发新的构建

    在Dockerfile中添加:

    RUN git rev-parse HEAD

    然后构建日志中就有commit id信息了

    触发构建用的Docker Hub API地址可以在Build Settings中找到

  • Docker多步构建生成dubbo-admin镜像

    Docker多步构建生成dubbo-admin镜像

    Docker是支持多步构建的,对于需要编译源代码的那种构建,多步构建一方面可以获得更小的镜像,另外一方面也不需要手动清理源代码和别的文件了。

    有时候本地调试的时候需要起一个dubbo-admin看一下,但是每次都是启动一个tomcat,然后拷贝war,久了也有点麻烦。想从Docker镜像启动一个,但是官方没有提供。网上有不少个人构建的镜像,但是版本有些旧了。索性自己搞一下放在Docker hub。

    手动操作比较直接,克隆代码库,然后maven打包出war包,放tomcat运行即可。多步构建的Dockerfile如下:

    FROM maven:3-jdk-8
    RUN git clone --depth 1 https://github.com/apache/incubator-dubbo-ops.git /source
    WORKDIR /source
    RUN mvn package -f dubbo-admin
    
    
    FROM tomcat:8.0-jre8
    RUN rm -rf /usr/local/tomcat/webapps/
    COPY --from=0 /source/dubbo-admin/target/*.war /usr/local/tomcat/webapps/ROOT.war
    EXPOSE 8080

    运行的时候提供一下注册中心的环境变量(dubbo.registry.address)即可。

    如果是docker-compose,简单的例子写法如下:

    version: '3'
    
    services:
      zookeeper:
        image: zookeeper
      
  • 使用Docker多阶段构建生成更小的镜像

    使用Docker多阶段构建生成更小的镜像

    在将源码直接打为Docker镜像的时候,经常纠结的一个问题就是如何获得更小的镜像。

    以一个java项目为例,因为java编译的时候需要jdk,而运行的时候只需要jre,明显jre的大小更有优势。同时由于各种构建工具的存在(比如gradle,maven),下载的构建用的文件也很多,不光是maven的依赖,还有wrapper和一些临时文件。

    之前的做法一直是使用两个Dockerfile,其中一个使用jdk构建出需要的jar文件,然后第二个使用jre直接将jar文件复制进去。虽然效果不错,但是还是觉得麻烦。

    今天使用Daocloud的时候看到了安全构建这个选项(本质就是两段构建),就突然想到Docker会不会已经有了。结果一搜索还真有,亏我还用多Dockerfile构建了很长时间。

    大概使用如下:

    FROM openjdk:8 AS build-env
    ADD . /java/src/app
    WORKDIR /java/src/app
    RUN gradlew build
    
    FROM openjdk:jre
    RUN apk add -U tzdata
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
    COPY --from=build-env /java/src/app/build/libs/target.jar /usr/local/bin/app-server
    EXPOSE 8080
    CMD ["app-server"]

    Docker支持的是多阶段构建,所以如果有需要的话,可以从多个不同的构建中获得生成物。…

  • 利用Docker快速搭建Spark本地环境

    Spark模式是直接local直接开发的,也就是在SparkConf中直接设定为local[*]之类,就可以在本地启动Spark然后开始工作。

    但是有时候还是希望将这些分开,也就是说有一个独立的Spark Master和一些Workers,本地开发,但是运行还是在简单的集群上。

    因为需求很简单,所以直接自己写一个Dockerfile

    FROM java:8
    WORKDIR /opt
    RUN wget -q http://apache.fayea.com/spark/spark-1.6.2/spark-1.6.2-bin-hadoop2.6.tgz -O spark.tgz
    RUN tar xfz spark.tgz && mv spark-1.6.2-bin-hadoop2.6 spark
    EXPOSE 8080 7077 6066
    ENTRYPOINT ./spark/sbin/start-master.sh && ./spark/sbin/start-slave.sh spark://$(ip addr show eth0 | grep "inet\b" | awk '{print 
  • 为wordpress加上Redis

    wordpress随着文章数量增加,有时候访问稍微有一些就变得很慢了。

    今天有空就决定给wordpress加上Redis缓存。

    首先在Docker-compose中加上Redis依赖

    redis:
      image: redis:alpine

    然后link到wordpress中

    links:
    - redis

    然后安装Redis Object Cache,并在wp-config.php中把host改成redis,然后连接即可。

    redis-cache

  • Docker Toolbox配置镜像

    Docker的镜像拉取有时候会花很长的时间,而国内有很多提供镜像服务的公司,随便找一个即可。

    但是在配置的时候经常会出现无法配置成功的问题,比如DaoCloud会告诉你修改profile文件,要么使用它的主机监控程序。一般情况我只想用镜像加速,并不想主机监控服务,所以选用修改profile文件,但是每次重启之后都没有生效。

    比较了阿里百川还有灵雀云的加速配置文档,基本是一个逻辑,但是依照文档,修改镜像的方法只有两种,第一种是创建的时候直接指定

    docker-machine create ... --engine-registry-mirror=<你的加速地址>

    或者是修改config.json中的RegistryMirror配置

    docker-machine-config-json

    这样在docker-machine重启以后配置才会真正生效。

    参考文档:

    https://github.com/docker/machine/blob/master/docs/reference/create.md…

  • Spring Boot在Docker中集成oneapm

    Oneapm是一个不错的监控平台,提供很多监控,从系统层面到具体的应用层面。

    Oneapm有Spring Boot application的支持,今天试着集成了一下。

    因为应用是在Docker中的,所以具体的集成需要修改Dockerfile。首先是配置自己的oneapm.properties文件。然后将文件放在项目中。

    修改Dockerfile,先下载oneapm.zip(下载地址登录oneapm后台可以看到)。然后将自己项目中准备的配置文件覆盖掉默认的,然后在启动参数中添加,具体配置如下

    RUN wget https://user.oneapm.com/account/{你自己的地址}/agent/java/OneAPM_java_Agent_latest.zip
    RUN apk add --no-cache unzip
    RUN unzip OneAPM_java_Agent_latest.zip -d /
    ADD ./.build/oneapm.properties /OneAPM/
    
    ENTRYPOINT ["java,"-javaagent:/OneAPM/oneapm.jar","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=8080","-jar","/app.jar"]

    重新部署以后更新应用,很快就可以看到数据

    oneapm

  • Spring Boot和Alpine Linux

    今天突然收到阿里云的短信,提示硬盘使用率超标,感觉特别奇怪。

    因为机器上只有两个数据库和一点应用,所有的资源啥的都放在七牛上的,不应该硬盘不够用才对。

    仔细看了一下发现是docker把空间吃了,速度把一些没用的image等等清理一番,硬盘使用率瞬间降到53%。

    机器上所有应用都是spring boot的,也就是java8环境的,之前使用的Docker Image基于ubuntu构建,大小500M+以上,突然想起之前听闻过Alpine Linux,小巧方便,说不定可以减少镜像大小。

    在网上找了一个找了一个基础镜像

    frolvlad/alpine-oraclejdk8:slim

    Dockerfile改造为

    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD spring-boot-application.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

    如果需要在镜像中构建,编译的话可能还需要bash支持

    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    RUN apk add bash
    RUN ./gradlew build -x test
    ADD spring-boot-application.jar app.jar
    RUN apk del bash
    
  • Docker container的监控

    迁移到Docker以后遇到的一个问题就是监控上的,比如当前资源消耗如何等等。

    之前的监控是用的OneAPM,但是都是应用级别的,需要不同的应用安装不同的探针。

    虽然也有很多可以监控Docker容器的,但是要在服务器安装服务我确实又不太想,找了一下发现OneAPM支持Docker化安装探针。

    对应镜像的构建脚本可以看这里,官方的老是启动不起来,我就自己构建了一个。

    在DaoCloud直接部署

    agent

    然后就直接去OneAPM控制台看结果了

    docker-info

    可以很容易看到每个container的内容消耗,也可以自己定义仪表盘。…

  • 迁移遗留项目到Docker

    结合DaoCloud体验了几天Docker,感觉非常的不错,所以也准备把已有的一个项目也迁移到Docker上。

    遗留项目

    这个项目是一个Java的Web项目,需要Java8环境,使用了Spring Boot,自带了运行容器,可以直接 java -jar 启动。项目使用了MySql数据库,没有用什么专有特性。数据库中数据也不多,可以mysqldump来迁移。

    迁移数据库

    先从数据库开始吧,原有数据库监听于3306端口,和应用一个主机。第一步打算就是先docker化数据库,但是仍然绑定端口在3306上,这样可以在只迁移数据库的情况下依然保证整个应用可用。

    先去Daocloud的应用编排里面创建一个新的应用

    db:
      image: mariadb
      restart: always
      ports:
      - 3306:3306
      volumes:
      - /alidata/data/acgmo-data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=你的密码

    然后直接连接到这个数据库

    mysql -u root -p 数据库名 < bak.sql

    完成后直接重启java web应用,看看应用是不是一切正常。

    迁移Java Web项目

    这个就稍微复杂一些了,因为mysql啥的中央库都有,不需要自己构建。但是这个就必须自己构建了。

    DaoCloud提供了代码构建功能,也支持bitbucket的私有库,唯一需要做的就是添加一个Dockerfile来构建,当然如果不想添加到代码库中也可以使用云Dockerfile功能。

    比如这个项目的Dockerfile如下

    FROM