docker 打包运行参照
1. 目录结构

2. 打包流程
2.1. docker 本地打包规范
参照docker常用套路,需具备以下基本条件
1. docker基础环境
1. Dockerfile:用于打包特定镜像
2. run.sh:用于启动服务
3. build.gradle (java服务必须)
4. docker-clean-build.sh (快捷打包)
5. docker-xxx-dev.sh (快捷运行)
2.2. docker 基础环境
2.2.1 安装(可自行搜索)
    yum install docker (centos7)
    apt-get install docker (ubuntu)
    下载安装包(windows 、mac)
2.2.2.1 配置私服【linux】
    修改/etc/docker/daemon.json文件
    #vi /etc/docker/daemon.json
    { "insecure-registries": ["10.10.208.193:5000"] }
    重启docker
2.2.2.2 配置私服【mac】

2.3. Dockerfile
Dockerfile 示例 1
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | //官方基础镜像,打包之后目录未分开#基础镜像
 FROM java:8
 
 VOLUME ["/tmp"]
 ADD ./* /home/servicename/
 
 #指定时区
 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
 
 ENTRYPOINT ["/home/servicename/run.sh"]
 
 | 
Dockerfile 示例 2
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | //基于官方镜像二次封装,包含基础工具,打包之后目录分开#基础镜像
 FROM 10.10.208.193:5000/urcs/java:8
 
 #ARG是Docker1.9 版本才新加入的指令,如果不支持该命令则直接赋值
 ARG appName=urcs-service-group
 
 VOLUME ["/tmp"]
 #ADD ./* /home/$appName/
 
 #docker打包时配置文件分离/和helium目录结构保持一致
 ADD config /home/$appName/config/
 
 ADD *.jar /home/$appName/lib/
 
 ADD ./*.xml /home/$appName/
 
 ADD ./*.sh /home/$appName/
 
 #指定时区
 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
 ENTRYPOINT ["/home/$appName/run.sh"]
 
 | 
2.4 run.sh
启动脚本
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | #!/bin/bash
 ulimit -c unlimited
 ulimit -n 32768
 
 
 basePath=$(cd "$(dirname "$0")";pwd)
 SERVICE_HOME=$basePath
 
 SERVICE_LIBS="$SERVICE_HOME/"
 
 SERVICE_MAIN="mainClass"
 declare -a JAVA_ARGS
 JAVA_ARGS[0]="-Xmx256m"
 JAVA_ARGS[1]="-Xms256m"
 
 exec $JAVA_HOME/bin/java -Duser.dir=$SERVICE_HOME ${JAVA_ARGS[@]} -classpath $SERVICE_HOME:$SERVICE_LIBS/* $SERVICE_MAIN
 
 | 
2.5 build.gradle
启动脚本
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 
 | buildscript {repositories {
 mavenCentral()
 }
 dependencies {
 //添加依赖jar包
 classpath 'se.transmode.gradle:gradle-docker:1.2'
 }
 }
 
 
 apply plugin: 'docker'
 
 //build构造jar文件
 jar {
 manifest {
 attributes 'Manifest-Version': 1.0
 attributes 'Main-Class': 'mainClass'
 }
 enabled = true
 
 }
 //打包可运行jar包
 task buildRunJar(type:Copy, dependsOn: build) {
 from configurations.runtime
 from 'src/main/resources'
 into 'build/libs' // 目标位置
 
 }
 
 //打包docker
 task buildDocker(type: Docker, dependsOn: buildRunJar) {
 push = true
 //TODO 前面为服务器期名 + 后面为服务名【以后修改最好不把服务器名打进去】
 tag = "10.10.208.193:5000/" + "servicename"
 applicationName = jar.baseName
 dockerfile = file('src/main/docker/Dockerfile')
 doFirst {
 copy {
 from 'build/libs'
 into stageDir
 }
 }
 }
 
 
 dependencies {
 ....
 }
 
 | 
2.6. docker-clean-build.sh
| 12
 3
 4
 
 | docker rm `docker ps -a -q`docker rmi --force `docker images | grep servicename | awk '{print $3}'`
 gradle clean
 gradle buildDocker -x test
 
 | 
2.7. docker-run.sh
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | docker stop servicename
 docker rm `docker ps -a -q`
 
 docker run \
 --env PRIVATE_IP=0.0.0.0 \
 --env REG_IP=10.10.208.194 \
 --env ZK_HOSTS=10.10.208.194:7998 \
 --env HTTP_PORT=8011 \
 --env HTTP_DASH_PORT=8111 \
 --env RPC_PORT=6011 \
 --env RPC_STACK=rpc-stack \
 --env HTTP_STACK=http-stack \
 --env HTTP_DASH_STACK=http-dash-stack \
 --env KAFKA_HOST=10.10.208.194 \
 --privileged=true \
 -p 8011:8011 \
 -p 8111:8111 \
 -p 6011:6011 \
 -d --name servicename1.0 \
 10.10.208.193:5000/servicename1.0.0-1902151423
 
 | 
3 常见问题
1.docker容器时间与宿主机时间不一至,容器时间为UTC时间
1.1.解决:Dockerfile增加
#指定时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
2.docker基础镜像中安装常用功能,例如vim
4 常用命令
    docker run -p 8888:8888 $name tag
    docker stop $name
    docker rm $name
    docker inspect $name
    docker ps -a | -l
    docker logs [-f] [-t] [-tail] $name
    -f –follows=true | false,默认是false,显示更新
    -t –timestamps=true | false,默认是false,显示时间戳
    –tail=“all” | 行数,显示最新行数的日志