初识Docker
刚开始接触Docker,是在从传统工作转为互联网公司,项目的安置以及中间件的安置,底子都在Docker容器上;最早的时分全部的服务都是在若干台机器上,底子也都是集群安置,没有进行容器的一致办理,说实话那时分除了对虚拟机还有点概念,对容器化真没有概念,最早安置项目在linux环境下,通过shell脚本对项目进行打包、发动、服务关停、每次上线需求对生产环境的war包进行替换,从头编译,在进行发动,不同环境还要需求针对不同环境进行打包,比较费事;
渐渐的后来用上了Jenkins,一键式打包安置,就便利了很多,但是不同环境也需求来回切换;Docker容器化解决了,多个环境下,从开发到安置全部环境下的依靠包都在一同,在任何环境下都是可以工作的,使整个项目构建流程变的非常省时、省力;
虚拟化和容器化
- 虚拟化:典型VMware虚拟机,节省了硬件资源,一台服务器上可以工作多台虚拟机,最早做银行的项目就是用的这些技能;
- 容器化:docker与其说是运用层的容器化安置,其底子也是物理层的容器化,便利运维对多个服务进行一致容器化处理,每个容器也相当于一个很小的CentOS服务;
说的比较简单粗浅,依照自己的了解方法,言语上或许不是很官方;
Docker file
关于Docker file其实就是将docker指令封装到文件里边,在生成镜像的时分将分别执行Docker file的指令,将服务安置到容器上;
现在根据项目情况,堆内存分配1G;
FROM anapsix/alpine-java:8_server-jre_unlimited
ENV JAVA_OPTS="\
-server -Xmx1024m -Xms1024m -Xmn512m -Xloggc:./gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M \
"
EXPOSE 8402
ADD Lxlxxx.jar app.jar
ADD ./agent/ /opt/
ENTRYPOINT ["java", "-Xmx2048m", "-javaagent:/opt/skywalking-agent.jar", "-Djava.security.egd=file:/dev/./urandom", "-jar","-Duser.timezone=GMT+8", "app.jar"]
Jenkins构建(CI/CD)
这是Jenkins构建项目的shell脚本,主要也是构建web镜像,Docker集成Jenkins做继续集成、继续安置,包括可以在每次commit、push代码的时分自动触发 Jenkins,给运维安置项目提供了很大的便当;
if docker stop Lxlxxx; then
echo "Lxlxxx 容器已间断"
else
echo "Lxlxxx 容器未工作"
fi
cd /home/data/Lxlxxx/
chmod +x ./*
#间断已建的容器,防止容器名,端口抵触
if docker rm -f Lxlxxx; then
echo "容器已删去,即将生成新容器"
else
echo "容器不存在,直接生成容器"
fi
#删去镜像
if docker rmi /Lxlxxx; then
echo "镜像已删去,即将生成新镜像"
else
echo "镜像不存在,直接生成镜像"
fi
cd /home/data/Lxlxxx #到项目根目录
docker build -t /Lxlxxx . #根据dockerfile生成web镜像
docker run -d -p 8460:8460 -e "SPRING_PROFILES_ACTIVE=test" --name Lxlxxx --log-opt max-size=512m --log-opt max-file=3 --restart=always -v /etc/localtime:/etc/localtime -v /data/sourceDir/:/data/sourceDir/ -v /root/agent/:/root/agent/ -e JAVA_OPTS='-Xmx2048m' -it -m 1536M --memory-swap 0 --net=host/Lxlxxx #工作镜像生成容器
sleep 5
#/bin/bash
# 传入容器名称
RESULT_DATA="${jenkins_url}/job/${JOB_NAME}/${BUILD_NUMBER}/console"
containerName=Lxlxxx
# 检查进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`
if [ "${exist}" = "true" ]; then
curl 'https://省略号' \
-H 'Content-Type: application/json' \
-d "
{
\"msgtype\": \"markdown\",
\"markdown\": {
\"content\": \"【测验环境】\n>构建项目<font>:【${JOB_NAME}】</font>\n>分支:(${branch})成功。\n>详情:<font>[检查控制台](${RESULT_DATA})</font>\"
}
}"
else
curl '省略号' \
-H 'Content-Type: application/json' \
-d "
{
\"msgtype\": \"markdown\",
\"markdown\": {
\"content\": \"【测验环境】\n>项目<font>:【${JOB_NAME}】</font>\n>分支:(${branch})构建失利。\n>详情:<font>请联络运维处理,[检查控制台](${RESULT_DATA})</font>\"
}
}"
fi
docker ps
Docker compose
compose 是docker的容器编列功用,粗浅的来讲就是将服务编列到多容器Docker上,相当于docker的集群模式,通过配置docker-compose.yml来完结,通过编列来完结服务的一致安置,这样就可以将服务和中间件服务构成一个服务群;
version: '3.8' //版本号
services:
rabbitmq: //服务名
image: rabbitmq:3-management //镜像
restart: always //自动重启
ports:
- 15673:15672
registry:
image: spring-boot-cloud/registry
ports:
- "8761:8761"
config:
image: spring-boot-cloud/config
ports:
- "8888:8888"
monitor:
image: spring-boot-cloud/monitor
ports:
- "8040:8040"
zipkin:
image: spring-boot-cloud/zipkin
ports:
- "9411:9411"
gateway:
image: spring-boot-cloud/gateway
ports:
- "8060:8060"
auth-service:
image: spring-boot-cloud/auth-service
ports:
- "5000:5000"
serviceA:
image: spring-boot-cloud/serviceA
serviceB:
image: spring-boot-cloud/serviceB
总结
在现在k8s盛行的时代,可以完好的对分布式系统进行支撑,也可以用k8s对docker集群进行办理,k8s和docker的区别在于,docker是一个开源的容器引擎,而k8s是集运用安置、运维、集群、开发、测验、监控等一体的办理工具;