文章目录
SecureRandom产生随机数性能优化 -Djava.security.egd=file:/dev/./urandom
Docker基础知识
[root@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 2 weeks ago 202MB
centos v1 1e1148e4cc2c 2 weeks ago 202MB
centos v2 1e1148e4cc2c 2 weeks ago 202MB
普通部署
jar包部署
- 打包:在项目根目录打包 mvn package
- 运行:将jar包上传到linux工作目录,然后运行java -jar xx.jar
- 注册服务:代码配置,创建软连接,ln -s /home/work/order.jar /etc/init.d/order
- 启动服务:service order start
- 开机启动:chkconfig order on
war包部署
基于Docker部署
编写启动脚本
在src/main/docker
runboot.sh
## 根据启动顺序调整sleep的时间
sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
编写Dockerfile
在src/main/docker
FROM java:8 //设置依赖容器
VOLUME /tmp //保存和共享容器间的数据
RUN mkdir /app //创建目录
ADD config-1.0.0-SNAPSHOT.JAR /app/app.jar
ADD runboot.sh /app //拷贝启动脚本到指定目录,并自动解压
RUN bash -c 'touch /app/app.jar' //修改文件创建时间和修改时间
WORKDIR /app //指定工作目录,如果目录存在cd到指定目录,不存在则创建并cd到指定目录
RUN chmod a+x runboot.sh //修改启动脚本权限
EXPOSE 8080 //设置暴露端口
cmd /app/runboot.sh //指定默认的容器主进程的启动命令的,若不指定就是/bin/bash
## 注释
bash xx.sh使用shell运行脚本(在当前目录找脚本,然后在path路径找-参数0为脚本,参数1为参数)
bash -c 读取参数0的shell命令,以及后面的参数
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上
Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
在开发机器编译docker镜像到服务器
在我们持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便
过简单的配置自动生成镜像并推送到仓库中,默认将镜像编译到localhost,使用DOCKER_HOST修改到指定远程Linux服务器
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>mavendemo</imageName>
<dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 指定 Dockerfile 路径-->
<!-- 这里是复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中 -->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build
mvn clean package docker:build 只执行 build 操作
mvn clean package docker:build -DpushImage 执行 build 完成后 push 镜像
mvn clean package docker:build -DpushImageTag 执行 build 并 push 指定 tag 的镜像
编译运行docker容器
- 编译镜像:docker build -t bin/work/order
- 运行镜像:docker run -d name order -p 8080:8080 bin/work/order
DockerCompose定义运行多容器
Docker-Compose项目负责对Docker容器集群的快速编排,将所管理的容器分为三层,分别是工程,服务以及容器。
一个工程中可包含多个服务,一个服务可包括多个容器实例
Docker-Compose通过docker-compose.yml定义一组相关联的应用容器为一个项目(project)。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分
discovery:
image:"discory:latest"
hostname:discovery
name:discovery
ports:"8080:8080"
————————————————————————————————————————————————————————————————————————————————
config:
image:"config:latest"
hostname:config
name:config
links:
- discovery
enveronment:
EUREKA_HOST:discovery
EUREKA_PORT:8080
port:"8081:8081"
————————————————————————————————————————————————————————————————————————————————————
order:
image:order:latest
hostname:order
links:
- discovery
- config
environment:
EUREKA_HOST:discovery
EUREKA_PORT:8080
ports:
- "8082:8082"
————————————————————————————————————————————————————————————————————————————
gateway:
image:gateway:latest
hostname:gateway
links:
- discovery
- config
- order
environment:
EUREKA_HOST:discovery
EUREKA_PORT:8080
ports:
-"80:80"
启动项目
docker-compose up -d
日志分析处理
Jenkins自动化运维
java -jar jenkins.war --httpPort=8081 指定端口启动jenkins
netstat -aon| findstr “4444” 查看占用端口