后台管理微服务(二)——docker的使用
1. docker概述
1.1 Docker是什么
Docker 是软件工业的集装箱技术
Docker 是一个容器引擎,docker提供了一套完整的容器解决方案。
Docker 是一个能将开发的程序自动部署到容器的开源引擎。
1.2 什么是容器
容器是一种历史悠久的虚拟化技术。
容器是一种虚拟化技术。
容器本质上就是运行在宿主机上的一个进程,只不过在启动这个进程之前做了一些特殊的处理,让这个进程进入了一种全新的虚拟环境,与宿主机分开,这个进程或子进程认为自己运行在一个独立的世界里。
如:linux 系统的lxc,openvz
1.3 容器和虚拟机的区别
虚拟机除了应用和依赖库之外,还需要包含完整的操作系统,资源占用比容器多。
虚拟机需要模拟硬件的行为对内存、CPU的损耗更大。
1.4 Docker 技术的作用
1 简化配置,快速部署,提升开发效率
docker能将jdk、tomcat 等软件和项目一起打包成为一个docker镜像,如果我们需要在另外一台机子上面部署项目,直接从镜像仓库中下载镜像,使用docker run命令 运行镜像就可以了,简化了jdk等软件的配置,如果,没有docker在一个新环境部署java项目 需要安装 jdk等软件,还需要配置环境变量等。
2 隔离应用
docker可以减少了不同项目之间的互相影响,我可以在一台服务器上部署运行2个不同项目的docker镜像,这些docker镜像中的jdk、tomcat版本完全可以不同
3 符合微服务的理念
Docker 可以很好地和微服务结合起来,从概念上来说,一个微服务便是一个提供一整套应用程序的部分功能,Docker 便可以在开发、测试和部署过程中一直充当微服务的容器,docker 是非常适合微服务的技术。
2. 实战:推送docker镜像到阿里云镜像仓库
2.1 编写dockerfile文件
此文件用于生成docker镜像
1 FROM ubuntu:14.04 2 #刷新包缓存 并且 安装wget工具 3 RUN apt-get update && apt-get install -y wget 4 #设置工作目录 5 WORKDIR /home 6 # 安装jdk 7 RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz" 8 RUN tar xzf jdk-8u141-linux-x64.tar.gz 9 # 配置环境变量 10 ENV JAVA_HOME /home/jdk1.8.0_141 11 ENV JRE_HOME $JAVA_HOME/jre 12 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib 13 ENV PATH $PATH:$JAVA_HOME/bin 14 # Set the timezone. 15 RUN echo "Asia/Shanghai" > /etc/timezone 16 RUN dpkg-reconfigure -f noninteractive tzdata 17 RUN locale-gen zh_CN.UTF-8 &&\ 18 DEBIAN_FRONTEND=noninteractive dpkg-reconfigure locales 19 RUN locale-gen zh_CN.UTF-8 20 ENV LANG zh_CN.UTF-8 21 ENV LANGUAGE zh_CN:zh 22 ENV LC_ALL zh_CN.UTF-8 23 # Make logs dir 24 RUN mkdir -p /opt/xw-blogs/logs 25 #expose 26 EXPOSE 22 27 EXPOSE 8081 28 # Add the jar and run 29 ADD xw-blogs.jar /opt/xw-blogs/xw-blogs.jar 30 WORKDIR /opt/xw-blogs 31 ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Xbootclasspath/a: -jar xw-blogs.jar
2.2 在maven的pom.xml文件中引入docker相关配置
下面是pom文件中build节点代码
<build> <resources> <resource> <directory>src/main/resourcesdirectory> <excludes> <exclude>profiles/test/*exclude> <exclude>profiles/prod/*exclude> <exclude>profiles/uat/*exclude> <exclude>profiles/dev/*exclude> excludes> resource> <resource> <directory>src/main/resources/profiles/${profiles.active}directory> resource> resources> <finalName>xw-blogsfinalName> <plugins> <plugin> <artifactId>maven-resources-pluginartifactId> <executions> <execution> <id>copy-resourcesid> <phase>validatephase> <goals> <goal>copy-resourcesgoal> goals> <configuration> <outputDirectory>${project.build.directory}outputDirectory> <resources> <resource> <directory>src/main/resources/profiles/${profiles.active}directory> <filtering>truefiltering> resource> resources> configuration> execution> executions> plugin> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> <dependencies> <dependency> <groupId>org.springframeworkgroupId> <artifactId>springloadedartifactId> <version>1.2.0.RELEASEversion> dependency> dependencies> plugin> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> <plugin> <groupId>com.spotifygroupId> <artifactId>docker-maven-pluginartifactId> <version>0.4.11version> <configuration> <serverId>docker-aliyunserverId> <registryUrl>${docker.repostory}registryUrl> <imageName>${project.repository}/${project.codeName}/${project.moduleName}imageName> <forceTags>trueforceTags> <imageTags> <imageTag>${project.version}imageTag> <imageTag>latestimageTag> imageTags> <dockerDirectory>src/main/dockerdockerDirectory>!-- Dockerfile文件地址 --> <resources> <resource> <directory>${project.build.directory}directory> <include>${project.build.finalName}.jarinclude> resource> resources> configuration> plugin> plugins> build>
2.3 生成docker镜像的shell脚本
-
1. [root@izwz918nqae9soh0p70seuz ~]# cd /root/bin 2. [root@izwz918nqae9soh0p70seuz bin]# ls 3. blogs_build.sh blogs_run.sh deploy.sh mall_backend.sh mall_frontend.sh restart_nginx.sh 4. [root@izwz918nqae9soh0p70seuz bin]# cat blogs_build.sh 5. 6. 7. #!/bin/bash 8. # author xw 9. 10. # create_date 2018年11月6日 11. "===========进入git项目mmall目录=============" 12. cd /app/gitRepository/blogs 13. 14. echo "==================删除之前的tag=====================" 15. 16. rm -rf * 17. 18. echo "==========git切换分之到mmall-v1.0===============" 19. #git clone --branch master git@gitee.com:weiqinshian/blogs.git 20. git clone --branch v$1 git@gitee.com:weiqinshian/blogs.git 21. 22. echo "===========编译并跳过单元测试====================" 23. cd blogs/blogs 24. mvn clean package docker:build -Ptest -DskipTests=true 25. [root@izwz918nqae9soh0p70seuz bin]#
2.4 运行镜像生成容器的shell脚本
1. [root@izwz918nqae9soh0p70seuz bin]# cat blogs_run.sh 2. if [[ $# -lt 1 ]];then 3. echo "para required : version_name" 4. exit 5. fi 6. docker run --name blogs$1 -p 9009:7077 -d -v /app/conf/application.properties:/app/config/blogs/application.properties -v /app/config/blogs/log4j.properties:/opt/xw-blogs/log4j.properties -v /app/logs:/opt/xw-blogs/logs docker.xw.com.cn/gravityforce/blogs /bin/bash 7. [root@izwz918nqae9soh0p70seuz bin]#