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

官方用法参考:https://hub.docker.com/_/mysql

启动命令:

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

注:

  1. mysql挂载的数据目录(宿主机上)必须要为空,否则会导致mysql起不来;
  2. 待mysql启动后,再将自己的数据文件(数据目录,和ibdata1)拷贝到被挂载的目录,拷贝进去之后,要重新启动mysql容器才能生效!
  3. mysql挂载的配置文件目录,不能为空,上面的mysql.cnf这个文件是先运行一个mysql,然后进入容器,使用find / -name mysqld.cnf找到路径,退出容器使用docker cp 将其拷贝到宿主机上。
  4. 注意设置字符集

Redis

使用镜像:redis:latest

官方用法参考:https://hub.docker.com/_/redis

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

注:

  1. /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

官方用法参考:https://hub.docker.com/_/rabbitmq

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

官方用法参考:https://hub.docker.com/_/nginx

启动命令:

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)代码重构与优化

posted @ 2021-02-21 10:39  kribee  阅读(177)  评论(0)    收藏  举报