java简易项目部署

时间:2024-03-02 07:02:25

1、本文主要内容

本项目为一个简单的java项目,使用nginx做反向代理,mysql作为数据库存储。
本文讲述的是简单的项目的部署情况,方便大家开发和学习使用。

2、java项目的开发

java项目为spring-boot项目,由于没有完全的前后端分开部署,使用将相关的页面文件直接放到java项目中,未来会单独部署一个站点。这边合并考虑的是使用动态的路由。

	@Controller
	public class PageController {

	@RequestMapping("/")
	public String home() {
	    return "home";
	}

	@RequestMapping("/category/{category}")
	public String category() {
	    return "home";
	}

做一个分类查询的路由,这样就可以支持动态路由了。

java项目编译:

	mvn clean package -Dmaven.skip.test=true

生成包上传centos服务器,下面就开始生成镜像

创建Dockerfile文件

	#penjdk:11-jre 为基础镜像,来构建此镜像
	FROM openjdk:11-jre
	#WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行。
	WORKDIR /opt/docker/images/metabase/
	#将当前spring.jar 复制到容器根目录
	ADD app.jar app.jar
	#暴露容器端口为8081 Docker镜像告知Docker宿主机应用监听了8081端口
	EXPOSE 8081
	#容器启动时执行的命令
	CMD java -jar app.jar

执行打包成镜像命令:

	[root@izfxvwqh6jels6z blogs]# docker build -t app:1.0.3 .
	Sending build context to Docker daemon  139.9MB
	Step 1/5 : FROM openjdk:11-jre
	---> f6ecbfc99521
	Step 2/5 : WORKDIR /opt/docker/images/metabase/
	---> Using cache
	---> 1ae255207bad
	Step 3/5 : ADD app.jar app.jar
	 ---> c95af61e96e9
	Step 4/5 : EXPOSE 8081
	 ---> Running in 8c14895be409
	Removing intermediate container 8c14895be409
	 ---> 0f49b5ca09ef
	Step 5/5 : CMD java -jar app.jar
	---> Running in 41c36b037b75
	Removing intermediate container 41c36b037b75
	 ---> e8f759fe8fb8
	Successfully built e8f759fe8fb8
	Successfully tagged app:1.0.3

至此docker镜像已经创建好了

	[root@izfxvwqh6jels6z app]# docker images
	REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
	app               1.0.3               e8f759fe8fb8        24 minutes ago      336MB

创建docker-compose

	version: "3"
	services:
	  app-server:
	  # 指定容器名称
	  container_name: app
	  # 重启机制
	  restart: always
	  image: app:1.0.3
	  # 访问端口
	  ports:
	    - "8081:8081"
	  environment:
	  # 指定时区
	    - TZ="Asia/Shanghai"

执行:

	docker-compose up -d

可以看到镜像已经在跑了

	[root@izfxvwqh6jels6z app]# docker ps
	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
	1ec8968c3432        app:1.0.3         "/bin/sh -c \'java -j…"   26 minutes ago      Up 24 minutes       0.0.0.0:8081->8081/tcp               app

当然也可以创建更简单的实例(可选,直接使用jar包打包,不走镜像)

	version: "3"
	services:
	app-service:
		# 指定容器名称
		container_name: app
		# 重启机制
		restart: always
		image: java:11
		volumes:
  		# 本地jar包路径
  		- /usr/local/download/app.jar:/app.jar
  		# 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
  		- ./logs:/logs
  		# 指定容器时间为宿主机时间
  		- /etc/localtime:/etc/localtime
		# 访问端口
		ports:
  			- "8081:8081"
		environment:
  			# 指定时区
  			- TZ="Asia/Shanghai"
		#启动容器后执行的命令
		entrypoint: java -server -Xms256m -Xmx256m -jar -Dserver.port=8088 -Dspring.profiles.active=local app.jar

2、mysql 创建

这边提供一个docker-compose

	version: \'3\'
	services:
	mysql:
		restart: always
		image: mysql:latest
		container_name: mysql
		volumes:
  		- ./mydir:/mydir
  		- ./datadir:/var/lib/mysql
  		- ./conf/my.cnf:/etc/my.cnf
  		#      数据库还原目录 可将需要还原的sql文件放在这里
  		- /docker/mysql/source:/docker-entrypoint-initdb.d
		environment:
  		- "MYSQL_ROOT_PASSWORD=password"
  		- "MYSQL_DATABASE=db"
  		- "TZ=Asia/Shanghai"
		ports:
  		- 3306:3306

3、nginx 创建

这边提供一个nginx的docker-compose 和nginx.conf

	#nginx docker-compose
	version: \'3\'
	services:
		nginx:
		container_name: nginx
		image: nginx
		restart: always
		ports:
  		- 80:80
		privileged: true
		volumes:
  			- ./conf/proxy.conf:/etc/nginx/proxy.conf
  			- ./conf/nginx.conf:/etc/nginx/nginx.conf
  			- ./conf/conf.d/:/etc/nginx/conf.d/
  			- ./html/:/usr/share/nginx/html/
  			- ./logs/:/var/log/nginx/
		networks:
  			- myweb
	networks:
		myweb:
		driver: bridge



	#nginx.conf

	events {
		worker_connections  1024;
	}


	http {
		include       mime.types;
		default_type  application/octet-stream;

		#log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
		#                  \'$status $body_bytes_sent "$http_referer" \'
		#                  \'"$http_user_agent" "$http_x_forwarded_for"\';

		#access_log  logs/access.log  main;

		sendfile        on;
		#tcp_nopush     on;

		#keepalive_timeout  0;
		keepalive_timeout  65;

		#gzip  on;

		server {
			listen       80;
			server_name  www.mywebsite.cn;

			location / {
  				proxy_pass http://外部宿主机的:8081;
    		}  
		}
	}	

4、结束

所有的都启动只有就可以进行打开外面的网站了
这边遇到几个坑

一直提示请求不到内容,但是java站点一直可以连上(connect() failed (111: Connection refused) while connecting to upstream)

nginx里面的proxy_pass,一直填入的是127.0.0.1,结果发现一直不通,想了试了很久才发现是127.0.0.1指向的是docker内部的linux,没有指到外面的tomcat站点

打包的时候提示:Spring Boot:jar中没有主清单属性

添加build配置就可以了

	<build>
 		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

nginx-compose启动失败

原因是因为有些是文件夹,有些是文件,删除掉,手动创建一下就可以启动了