blog项目部署总结
目录规划
总根目录:/opt/blog-dep
blog-dep
|-- blog-data
|-- blog-log
|-- java
| |-- blog-springboot-1.0.jar
| `-- Dockerfile
|-- mysql
| |-- conf
| | `-- mysqld.cnf
| |-- data
| | |-- blog
| | |-- mysql
| | |-- performance_schema
| | `-- sys
| `-- Dockerfile
|-- nginx
| |-- conf
| | |-- default.conf
| | `-- nginx.conf
| `-- content
| |-- index.html
| `-- static
| |-- css
| `-- js
`-- redis
`-- redis.conf
创建网络
容器之间的互通方式多种多样,可以用link机制,但link机制目前官方不推荐再使用,因此我们使用自定义网络的方式(官方推荐)
$ docker network create dong-blog-network
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
406a6bbab816 bridge bridge local
216c2806b09e dong-blog-network bridge local
3e62fae73af4 host host local
e6f2ad453910 none null local
参考博文:https://www.cnblogs.com/shenh/p/9714547.html
(Note: 下面的各个服务启动顺序为 redis/rbmq/mysql >> apiServer >> nginx)
mysql
使用镜像:mysql:5.7
启动命令:
docker run --name dong-mysql --network dong-blog-network --network-alias dong-mysql -v /opt/blog-dep/mysql/data:/var/lib/mysql -v /opt/blog-dep/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:rw -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
注:
- mysql挂载的数据目录(宿主机上)必须要为空,否则会导致mysql起不来;
- 待mysql启动后,再将自己的数据文件(数据目录,和ibdata1)拷贝到被挂载的目录,拷贝进去之后,要重新启动mysql容器才能生效!
- mysql挂载的配置文件目录,不能为空,上面的mysql.cnf这个文件是先运行一个mysql,然后进入容器,使用
find / -name mysqld.cnf找到路径,退出容器使用docker cp 将其拷贝到宿主机上。 - 注意设置字符集
Redis
使用镜像:redis:latest
docker run -d -v /opt/blog-dep/redis/redis.conf:/usr/local/etc/redis/redis.conf -v /etc/localtime:/etc/localtime:ro --network dong-blog-network --network-alias dong-redis --name dong-redis redis redis-server /usr/local/etc/redis/redis.conf
注:
- /usr/local/etc/redis/redis.conf这个是使用外部的配置文件启动,这里我在外部配置文件中配置了连接redis的密码;
2)-v /etc/localtime:/etc/localtime:ro是将宿主机的时间同步到容器,因为容器的时间是UTC(Coordinated Universal Time,标准时间),而我们需要CST(China Shanghai Time,东八区时间)两者相差8小时!!
RabbitMq
使用镜像:rabbitmq:management
docker run -d -v /etc/localtime:/etc/localtime:ro --hostname my-rabbit --network dong-blog-network --network-alias dong-mq --name dong-rabbit rabbitmq:management
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a088e3964aa rabbitmq:management "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp dong-rabbit
APIServer
使用基础镜像:openjdk:8-alpine
官方用法参考:https://hub.docker.com/_/openjdk?tab=description
实际使用镜像:dong-springboot-server:v1.0
启动命令:
docker run -d --name dong-APIserver --network dong-blog-network --network-alias dong-apiserver dong-springboot-server:v1.0
Dockerfile:
FROM openjdk:8-alpine
MAINTAINER dongjia
COPY Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
COPY blog-springboot-1.0.jar /root/
EXPOSE 8001
WORKDIR /root
STOPSIGNAL SIGTERM
ENTRYPOINT ["java", "-jar", "blog-springboot-1.0.jar"]
Springboot配置文件:
spring:
datasource:
url: jdbc:mysql://dong-mysql:3306/blog?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
driverClassName: com.mysql.jdbc.Driver
druid:
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 60000
validation-query: SELECT 1
validation-query-timeout: 2000
####找不到处理器直接抛出异常
mvc:
throw-exception-if-no-handler-found: true
####是否为工程中的资源文件建立映射
resources:
add-mappings: false
###邮箱配置
mail:
host: smtp.qq.com
port: 25
username: 314745284@qq.com
password: uznqjlzutmvxbifg
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
###Redis
redis:
host: dong-redis
port: 6379
password: password
timeout: 1000
jedis:
pool:
max-active: 10
max-idle: 8
min-idle: 2
max-wait: 100
###RabbitMQ
rabbitmq:
host: dong-mq
port: 5672
username: guest
password: guest
mybatis:
###数据库模型对象
type-aliases-package: com.zzx.model.pojo
mapper-locations: mapper/*.xml
###打印sql
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
###是否启用swagger
swagger:
enable: true
logging:
level:
org.springframework.security: info
root: info
#path: e:/springboot-blog
path: /opt/blog-dep/blog-log
### jwt
jwt:
###过期时间 s数432000 5天
time: 432000
###安全密钥
secret: "BlogSecret"
###token前缀
prefix: "Bearer "
###http头key
header: "Authorization"
###图片上传配置
upload:
#静态资源对外暴露的访问路径 一个* 代表只匹配该路径下的一级子路径
staticAccessPath: /img/*
#文件上传目录
# uploadFolder: E:/blog
uploadFolder: /opt/blog-dep/blog-data
#文件夹层数
layerCount: 2
#文件夹内单位数
folderSize: 16
###站点介绍
site:
introduction: "分享知识"
server:
port: 8001
上面的配置文件中,JAVA连Mysql, mq, redies 包括nginx访问APIServer都是使用 --network-alias 定义的名字,其实可以直接用容器名称(-name定义的那个)!!!
详细见: https://blog.csdn.net/wucong60/article/details/83757813
nginx
使用基础镜像:nginx:latest
启动命令:
docker run --network dong-blog-network --network-alias dong-nginx --name dong-nginx -v /opt/blog-dep/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:rw -v /opt/blog-dep/nginx/content:/usr/share/nginx/html:rw -v /opt/blog-dep/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf -v /etc/localtime:/etc/localtime:ro -d -p 80:80 nginx
注:
1)nginx的两个配置文件,即nginx.conf和default.default(主要使用这个) 在run之前,要保证它们存在,和上面mysql一样,事先用docker cp从容器中拷贝一份出来;
2)配置文件的修改:
## default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api {
proxy_pass http://dong-apiserver:8001;#前端能够访问到后端
rewrite ^/api/(.*) /$1 break;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /img {
proxy_pass http://dong-apiserver:8001;#前端能够访问到后端
rewrite ^/img(.*) /img$1 break;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
注:特别注意上面的图片路径问题,之前由于图片路径没写正确,导致图片无法显示!后面需要将图片的目录挂载到宿主机上,防止丢失!后面还要好好研究图片上传以及显示的原理!!!!
对于nginx.conf不做任何修改,下面也贴出其内容方便查看
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
修改了nginx的配置文件重启nginx命令:/usr/nginx/sbin/nginx -s reload
关于ngnix配置,参考了如下博文:
https://blog.51cto.com/59465168/2177084
https://blog.csdn.net/yk614294861/article/details/102688926
https://blog.csdn.net/xinluke/article/details/52050371
坑:关于开启防火墙后,nginx无法访问api服务器
开启防火墙后,只放通22(ssh) 和 80(nginx) 通过浏览器访问网站,发现可以访问到前端页面,数据请求是404,刚开始以为要放通所有应用的端口才可以,但后面一思考,发现我在nginx容器中只是使用了api server的容器端口,并没有用宿主机的端口,开启防火墙应该不会影响使用容器端口,最后才发现出现这种情况是因为开启防火墙会影响docker,重启docker守护进程就Ok!
后期需要处理的一些问题
1)分章分类
2)日期归档不能点击查看的问题
3)markdown导入,修改为好用一点的markdown插件
4)api server集群,mysql主从设置
5)日志收集,告警提醒
6)将所有的东西制作成镜像,解决启动命令过长问题
7)后台管理系统
8)页面优化
9)代码重构与优化

浙公网安备 33010602011771号