编程随笔 编程随笔
  • 前端
  • 后端
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)

liyao52033

走运时,要想到倒霉,不要得意得过了头;倒霉时,要想到走运,不必垂头丧气。心态始终保持平衡,情绪始终保持稳定,此亦长寿之道
  • 前端
  • 后端
  • 星球项目
  • 开源项目
  • 海康AGV
  • 四向车
  • 工具类
  • 项目仓库

    • 部署仓库 (opens new window)
    • 代码仓库 (opens new window)
  • vuepress插件

    • 自动生成导航栏与侧边栏 (opens new window)
    • 评论系统 (opens new window)
    • 全文搜索 (opens new window)
    • 选项卡 (opens new window)
    • 自动生成sitemap (opens new window)
  • 自主开发插件

    • 批量操作frontmatter (opens new window)
    • 链接美化 (opens new window)
    • 折叠代码块 (opens new window)
    • 复制代码块 (opens new window)
  • springboot

  • 服务器相关

    • Docker使用
    • Docker部署前后端分离项目
      • 1.服务器要求
      • 2.docker的安装
      • 3.安装mysql
      • 4.安装redis
      • 5.安装rabbitmq
      • 6.安装elasticsearch
      • 7.安装MaxWell
      • 8.打包运行后端项目
      • 9.打包运行前端项目
      • 10.安装并启动nginx
    • docker-compose使用
    • 代码上线事故原因
    • rar for linux使用报错
  • 腾讯云cos对象操作

  • 后端
  • 服务器相关
华总
2023-09-16
0
0
目录

Docker部署前后端分离项目原创

# 1.服务器要求

下面的建议不包含minio的内存占用,如需使用minio,请另外考虑

  1. 核心数和内存大小有两种方案:

    • 2核4G(使用ES搜索策略)
    • 2核2G(使用MySQL搜素策略)
  2. 带宽大小有两种方案:

    • 使用oss对带宽没有要求(本人亲测:1M带宽+oss 访问速度很快)
    • 使用minio需要大一点的带宽(小带宽也可以,但需要使用cdn加速)

# 2.docker的安装

以下命令基于CentOS环境。

  1. 下载工具

    yum install -y yum-utils
    
    1
  2. 设置镜像的仓库

    yum-config-manager \
        --add-repo \
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #配置阿里云的镜像
    
    1
    2
    3
  3. 更新yum软件包索引

    yum makecache fast
    
    1
  4. 安装docker相关配置

    yum install -y docker-ce docker-ce-cli containerd.io
    
    1
  5. 启动docker

    systemctl start docker
    # 查看当前版本号,是否启动成功
    docker version
    # 设置开机自启动
    systemctl enable docker
    
    1
    2
    3
    4
    5

# 3.安装mysql

# 方式1: 无挂载模式

这种方式直接运行mysql之后,所有关于mysql的内容都在容器中,后续如果需要修改mysql的内容,需要手动进入容器内进行操作。且在宿主机上无备份,一旦容器被删除,数据也会被删除。

docker pull mysql //下载MySQL镜像
docker run --name mysql --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 -d mysql //启动MySQL
1
2

# 方式2: 数据卷挂载模式

和无挂载模式相对,通过数据卷挂载的方式运行容器,将容器内的部分重要文件映射到宿主机上。直接操作宿主机对应的映射文件就能和容器内作同步,方便操作的同时还能保证容器内的数据在宿主机上有一个备份。

下面的命令分别对mysql的日志文件、配置文件、数据文件进行了映射,你也可以自己修改。

  1. # docker方式

    docker run -d -p 3306:3306 --restart=always -v /auroras/mysql/log:/var/log/mysql -v /auroras/mysql/data:/var/lib/mysql -v /auroras/mysql/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=密码  --name mysql mysql
    
    1
  2. # Dockerfile方式

    提示

    和docker方式相对,通过Dockerfile的方式运行容器,不会出现时区问题,使数据库的时间与宿主机的时间相差8小时

    创建Dockerfile文件

# 使用官方MySQL8.0.34镜像作为基础映像
FROM mysql:8.0.34

RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone

# 设置MySQL的root用户密码(根据需要进行更改)
ENV MYSQL_ROOT_PASSWORD=xxxxxx

# 暴露MySQL默认端口(3306)和33060端口
EXPOSE 3306 33060

# 创建数据卷用于持久化存储MySQL数据、日志和配置
VOLUME /var/log/mysql
VOLUME /var/lib/mysql
VOLUME /etc/mysql/conf.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

​ 创建启动文件mysql-start.sh

SOURCE_PATH=/usr/local/mysql
SERVER_NAME=mysqlimage
TAG=latest
SERVER_PORT=3306
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
if [ -n "$CID" ]; then
  echo "存在容器$SERVER_NAME,CID-$CID"
  docker stop $CID
  echo "成功停止容器$SERVER_NAME,CID-$CID"
  docker rm $CID
  echo "成功删除容器$SERVER_NAME,CID-$CID"
fi
if [ -n "$IID" ]; then
  echo "存在镜像$SERVER_NAME:$TAG,IID=$IID"
  docker rmi $IID
  echo "成功删除镜像$SERVER_NAME:$TAG,IID=$IID"
fi
echo "开始构建镜像$SERVER_NAME:$TAG"
cd $SOURCE_PATH
docker build -t $SERVER_NAME:$TAG .
echo "成功构建镜像$SERVER_NAME:$TAG"
docker run -d -p 3306:3306 -p 33060:33060 --restart=always -v /codegen/mysql/log:/var/log/mysql -v /codegen/mysql/data:/var/lib/mysql -v /codegen/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=xxxxxx --name mysql mysqlimage
echo "成功创建并运行容器$SERVER_NAME"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 4.安装redis

docker pull redis //下载Redis镜像
docker run --name redis  --restart=always -p 6379:6379 -d redis --requirepass "密码" //启动Redis
1
2

# 5.安装rabbitmq

docker pull rabbitmq:management //下载RabbitMQ镜像
docker run --name rabbit --restart=always -p 15672:15672 -p 5672:5672  -d  rabbitmq:management   //启动RabbitMQ,默认guest用户,密码也是guest。
1
2

# 6.安装elasticsearch

docker pull elasticsearch:7.9.2
1
mkdir -p  /home/elasticsearch/data/ 
mkdir -p  /home/elasticsearch/config/
1
2
  1. 编写配置文件

    echo 'http.host: 0.0.0.0
    http.cors.enabled: true
    http.cors.allow-origin: "*" '>>/home/elasticsearch/config/elasticsearch.yml
    
    1
    2
    3
  2. 修改文件夹权限

    chmod -R 777 /home/elasticsearch/
    ls -l # 查看文件权限
    
    1
    2
  3. 启动elasticseach镜像

    docker run --name elasticsearch -p 9200:9200 \
     -p 9300:9300 \
     -e "discovery.type=single-node" \
     -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
      -v /home/elasticsearch/config/elasticsearch.yml:/usr/shellare/elasticsearch/config/elasticsearch.yml \
     -v /home/elasticsearch/data:/usr/shellare/elasticsearch/data \
     -v /home/elasticsearch/plugins:/usr/shellare/elasticsearch/plugins \
     -d elasticsearch:7.9.2
    
    1
    2
    3
    4
    5
    6
    7
    8

接下来我们就是拿浏览器访问啦。

在浏览器上输入:服务器IP地址:9200

可能出现的问题:

  1. 启动成功,但是访问失败的话,查看一下安全组中映射端口是否已经打开。如果是本地虚拟机,可能与防火墙相关(我用的云服务器,没有测试,如果有问题,还是需要大家自行去百度||谷歌一下)。

  2. -e ES_JAVA_OPTS="-Xms64m -Xmx128m":配置内存大小出现了问题。

  3. 最后就还有可能是配置文件中出现了问题。

    echo 'http.host: 0.0.0.0
    http.cors.enabled: true
    http.cors.allow-origin: "*" '>>/home/elasticsearch/config/elasticsearch.yml
    
    1
    2
    3

    http.host: 0.0.0.0 在冒号后面有一个空格的,这里的配置文件是yml格式,所以一定要严格按照yml格式来书写。

安装ik分词器

进入已经启动成功的elasticsearch容器。

docker exec -it elasticsearch /bin/bash
1
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.2/elasticsearch-analysis-ik-7.9.2.zip
1

ps: 安装的ik分词器的版本一定要与elasticsearch的版本保持一致

下载过程中如果遇到选择,直接输入 y回车就可以了。

下载完成之后,退出去,重新启动elasticsearch容器。

docker restart elasticsearch
1

测试ik分词器是否安装成功

安装完成后,我们再来进行测试遍,看看有什么样的变化。

postman post请求分词测试:http://服务器IP地址:9200/_analyze

{
	"tokenizer":"ik_smart",
	"text":"我爱技术"
}
1
2
3
4

结果

{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "爱",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "技术",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 2
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 7.安装MaxWell

docker pull zendesk/maxwell //下载MaxWell镜像
docker run --name maxwell --restart=always  -d  zendesk/maxwell bin/maxwell  --user='数据库用户名' --password='数据库密码'  --host='IP地址'  --producer=rabbitmq --rabbitmq_user='MQ用户名' --rabbitmq_pass='MQ密码' --rabbitmq_host='IP地址' --rabbitmq_port='5672' --rabbitmq_exchange='maxwell_exchange'  --rabbitmq_exchange_type='fanout' --rabbitmq_exchange_durable='true' --filter='exclude: *.*, include: aurora.t_article.article_title = *, include: aurora.t_article.article_content = *, include: aurora.t_article.is_delete = *, include: aurora.t_article.status = *' //运行MaxWell
1
2

注意:上述命令中aurora为数据库名称。


# 8.打包运行后端项目

  1. 使用idea右侧Maven的package命令

  2. 在服务器的/usr/local/下面创建名为docker的文件夹

  3. 将打包好的jar包传到服务器上面的/usr/local/docker下面

  4. 编写Dockerfile,同时将编写好的Dockerfile传输到服务器的/usr/local/docker下面

FROM openjdk:8
VOLUME /tmp
ADD aurora-springboot-0.0.1.jar blog.jar

RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/blog.jar"]
1
2
3
4
5
6
7
8
9

注意:Dockerfile文件只需要上传到指定目录下即可,不需要手动执行其他操作。

  1. 编写aurora-start.sh,同时将编写好的aurora-start.sh上传到服务器的/usr/local/docker下面
SOURCE_PATH=/usr/local/docker
SERVER_NAME=aurora-springboot-0.0.1.jar
TAG=latest
SERVER_PORT=8080

CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
if [ -n "$CID" ]; then
  echo "存在容器$SERVER_NAME,CID-$CID"
  docker stop $CID
  echo "成功停止容器$SERVER_NAME,CID-$CID"
  docker rm $CID
  echo "成功删除容器$SERVER_NAME,CID-$CID"
fi
if [ -n "$IID" ]; then
  echo "存在镜像$SERVER_NAME:$TAG,IID=$IID"
  docker rmi $IID
  echo "成功删除镜像$SERVER_NAME:$TAG,IID=$IID"
fi
echo "开始构建镜像$SERVER_NAME:$TAG"
cd $SOURCE_PATH
docker build -t $SERVER_NAME:$TAG .
echo "成功构建镜像$SERVER_NAME:$TAG"

docker run --restart=always --name aurora-springboot-0.0.1.jar -d -p 8080:8080 aurora-springboot-0.0.1.jar:latest

echo "成功创建并运行容器$SERVER_NAME"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

注意事项

sh文件在非linux系统编写需要用notepad++转为Unix格式

具体操作:点开notepad++中的编辑 ---> 文档格式转换 --->转为Unix

  1. cd到/usr/local/docker下面 ,执行如下命令打包docker镜像文件启动容器
chmod +x aurora-start.sh && sh aurora-start.sh
1
  1. 这样后端项目就可以在服务器上跑起来了,访问测试(浏览器上访问)
ip:8080(/api)
1

# 9.打包运行前端项目

  1. 在服务器的/usr/local/下面创建名为vue的文件夹,

  2. 将打包好的前台代码重命名为blog, 并传输到服务器的/usr/local/vue下面

  3. 将打包好的后台代码重命名为admin, 并传输到服务器的/usr/local/vue下面

# 10.安装并启动nginx

# 方式1: http

  1. 拉取nginx镜像

    docker pull nginx
    
    1
  2. 在/usr/local/nginx下创建nginx.conf文件,格式如下

    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        client_max_body_size     50m;
        client_body_buffer_size  10m; 
        client_header_timeout    1m;
        client_body_timeout      1m;
    
        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_comp_level  4;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
    
    server {
            listen       80;
            server_name  前台域名;
         
            location / {		
                root   /usr/local/vue/blog;
                index  index.html index.htm; 
                try_files $uri $uri/ /index.html;	
            }
    			
    	location ^~ /api/ {		
                proxy_pass http://服务器ip:8080/;
    	       proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;						
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    		
        }
    	
    server {
            listen       80;
            server_name  后台子域名;
         
            location / {		
                root   /usr/local/vue/admin;
                index  index.html index.htm; 
                try_files $uri $uri/ /index.html;	
            }
    			
    	location ^~ /api/ {		
                proxy_pass http://服务器ip:8080/;
    	    proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;						
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    		
        }
     }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
  3. 启动nginx

    docker run --name nginx --restart=always -p 80:80 -d -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/vue:/usr/local/vue nginx 
    
    1

# 方式2: https

  1. 拉取nginx镜像

    docker pull nginx
    
    1
  2. 将ssl证书的crt和key文件上传到/etc/ssl/certs

  3. 修改配置文件

    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        client_max_body_size     50m;
        client_body_buffer_size  10m; 	  
        client_header_timeout    1m;
        client_body_timeout      1m;
    
        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_comp_level  4;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
    	
    server {
            listen 443 ssl;
            server_name  前台域名;
    
            ssl_certificate /etc/ssl/certs/域名_bundle.crt; 
    	      ssl_certificate_key /etc/ssl/certs/域名.key; 
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
    
           location / {
                root   /usr/local/vue/blog;
                index  index.html index.htm;
                try_files $uri $uri/ /index.html;
            }
    		
            location ^~ /api/ {
                proxy_pass http://服务器ip:8080/;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    
        }
    
    server {
            listen  443 ssl;
            server_name 后台域名;
    
            ssl_certificate /etc/ssl/certs/域名_bundle.crt; 
            ssl_certificate_key /etc/ssl/certs/域名.key; 
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
    
           location / {
                root   /usr/local/vue/admin;
                index  index.html index.htm;
                try_files $uri $uri/ /index.html;
            }
    		
            location ^~ /api/ {
                proxy_pass http://服务器ip:8080/;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    	
        }
    
    server {
            listen       80;
            server_name  前台域名;
            rewrite ^(.*)$	https://$host$1	permanent;
    		
        }
    	
    server {
            listen       80;
            server_name  后台域名;
            rewrite ^(.*)$	https://$host$1	permanent;
    		
        }	
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
  4. 启动nginx

    docker run --name nginx --restart=always -p 443:443 -p 80:80 -d -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /etc/ssl/certs:/etc/ssl/certs -v /usr/local/vue:/usr/local/vue --privileged=true nginx
    
    1
#后端#Docker
上次更新: 2024/03/20 11:25:05
Docker使用
docker-compose使用

← Docker使用 docker-compose使用→

最近更新
01
element-plus多文件手动上传 原创
11-03
02
TrueLicense 创建及安装证书 原创
10-25
03
手动修改迅捷配置 原创
09-03
04
安装 acme.sh 原创
08-29
05
zabbix部署 原创
08-20
更多文章>
Copyright © 2023-2024 liyao52033
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式