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启动失败
原因是因为有些是文件夹,有些是文件,删除掉,手动创建一下就可以启动了