Docker 使用总结

1.应用根目录创建ansible文件夹,添加两个文件builder.sh 、Dockerfile
Dockerfile

FROM 127.0.0.1:5000/self_jetty:2.0

COPY  webmerser /home/pbmp/jetty-web-merser/webapps/webmerser

#FROM 127.0.0.1:5000/self_jetty:2.0 引用的基础镜像
#COPY webmerser /home/pbmp/jetty-web-merser/webapps/webmerser 把应用copy到镜像里

builder.sh

#!/bin/bash

VERSION=$1

if [ ! ${VERSION} ]; then 
	echo "Please input release version number"
	exit 1
fi

image_name="127.0.0.1:5000/prov-remote/webmerser:${VERSION}"

echo "build image ${image_name}"

docker build --pull --no-cache=true -t ${image_name} .

if [ $? != 0 ]; then
	echo "build image failed"
	exit 1
fi

echo "Push Image to register"
docker push ${image_name}

if [ $? == 0 ]; then
	echo "Push successfully"
	echo "image: ${image_name}"
fi

2.整理应用中所有配置文件,把开发、测试、生产不一致的文件梳理3份
3.将整理的配置文件放到开发、测试、生产宿主机的对应应用目录下

cd /home/pbmp/webmerser
[wangrc@pbmp-docker1 webmerser]$ ll
total 0
drwxr-xr-x 3 pbmp mpsp 22 Oct 27 15:07 configs
drwxr-xr-x 3 pbmp mpsp 22 Oct 27 15:28 logs
drwxr-xr-x 2 pbmp mpsp 80 Oct 27 15:28 run
drwxr-xr-x 2 pbmp mpsp 77 Oct 27 15:07 serial

#configs 路径下为所有配置文件

[wangrc@pbmp-docker1 webmerser]$ tree  configs/
configs/
└── webmerser
    └── WEB-INF
        └── classes
            ├── config
            │   ├── platConfig.properties
            │   └── seq.properties
            ├── config.properties
            ├── jdbc-off.properties
            └── jdbc-on.properties

4 directories, 5 files

#logs下为所有日志
#serial下为映射文件
#run 下为启动脚本

#!/bin/bash

CONST_HOST="/home/pbmp/webmerser/configs"
CONST_JETTY_BASE="/home/pbmp/jetty-web-merser/webapps"
CONST_CONFIG="webmerser/WEB-INF/classes/config.properties"
CONST_PLATCONFIG="webmerser/WEB-INF/classes/config/platConfig.properties"
CONST_SEQ="webmerser/WEB-INF/classes/config/seq.properties"
CONST_JDBC_OFF="webmerser/WEB-INF/classes/jdbc-off.properties"
CONST_JDBC_ON="webmerser/WEB-INF/classes/jdbc-on.properties"

IMAGE_NAME=$1
if [ !  ${IMAGE_NAME} ]; then
        echo >&2 "请输入镜像名"
        exit 1
fi

echo >&2 "拉取镜像: ${IMAGE_NAME}"

docker pull ${IMAGE_NAME}
if [ $? != 0 ]; then
        echo >&2 "拉取镜像失败!!!"
        exit 1
fi


APPNAME=`echo ${IMAGE_NAME} | awk -F ':' '{print $2}' | awk -F '/' '{print $3}'`
if [ !  ${APPNAME} ]; then
        echo >&2 "无法获取部署应用名"
        exit 1
fi

#
app_status=`docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'|grep ${APPNAME}`
if [ ${app_status} ]; then
   echo >&2 "停止应用: ${APPNAME}"
   docker stop ${APPNAME}
   echo >&2 "删除旧版应用 ${APPNAME}"
   docker rm ${APPNAME}
fi


#create new container
echo >&2 "创建新应用:${APPNAME}"
docker run -d --net=host \
--name ${APPNAME} \
-v ${CONST_HOST}/${CONST_CONFIG}:${CONST_JETTY_BASE}/${CONST_CONFIG} \
-v ${CONST_HOST}/${CONST_PLATCONFIG}:${CONST_JETTY_BASE}/${CONST_PLATCONFIG} \
-v ${CONST_HOST}/${CONST_SEQ}:${CONST_JETTY_BASE}/${CONST_SEQ} \
-v ${CONST_HOST}/${CONST_JDBC_OFF}:${CONST_JETTY_BASE}/${CONST_JDBC_OFF} \
-v ${CONST_HOST}/${CONST_JDBC_ON}:${CONST_JETTY_BASE}/${CONST_JDBC_ON} \
-v /home/pbmp/webmerser/logs/webmerser:/home/pbmp/jetty-web-merser/logs \
-v /etc/localtime:/etc/localtime \
-v /home/pbmp/webmerser/serial:/home/pbmp/jetty-web-merser/webapps/webmerser/WEB-INF/classes/serial \
-v /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai \
${IMAGE_NAME}

sleep 5
docker top ${APPNAME}

echo "任务执行成功"

#run.sh 主要作用 拉取镜像、创建新应用 ,并制定映射关系

4. 开发jenkins脚本配置–编译应用、创建镜像、启动应用

cd ${WORKSPACE}/webmerser_v2/ansible
if [ -d "webmerser" ]; then
 echo "Delete dir webmerser"
 rm -rf "webmerser"
fi
cp -r ${WORKSPACE}/webmerser_v2/target/webmerser . 
chmod +x builder.sh
./builder.sh ${version}


# deploy image
image_name="127.0.0.1:5000/prov-remote/webmerser:${version}"
cd /usr/mpsp/webmerser
ansible -i hosts webmerser_dev -m shell -a "~/webmerser/run/webmerser.sh ${image_name}"

5. 测试jenkins脚本配置–启动应用

cd /usr/mpsp/webmerser
ansible -i hosts webmerser_test -m shell -a "~/run/webmerser.sh ${image}"

6. 生产jenkins脚本配置–从开发仓库push镜像到生产docker仓库

if [ -e ${image} ]; then
   echo “请输入镜像名”
   exit 1
fi

PROD_IP="10.16.59.66:80"
image_name_short=${image#"127.0.0.1:5000"}
echo ${image_name_short}
prod_image=${PROD_IP}${image_name_short}
#execute ansible
cd /usr/mpsp/webmerser
ansible -i hosts webmerser_test -m shell -a "docker tag ${image} ${prod_image}"
ansible -i hosts webmerser_test -m shell -a "docker login -u admin -p 12345 172.16.59.66:80"
ansible -i hosts webmerser_test -m shell -a "docker push ${prod_image}"

if [ $? == 0 ]; then
   echo "Push Successfully"
   echo "Release product image name: ${prod_image}"
fi