Cyan Blog Cyan Blog
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
  • 简历项目
  • Java面试题

  • 后端开发
  • 数据库面试题
  • Maven
  • MyBatis面试题
  • Spring面试题
  • SpringBoot面试题
  • SpringCloud面试题

  • Redis面试题

  • 设计模式
  • 中间件

  • 场景题
  • Other

  • Random

  • 项目面试题

    • 黑马点评面试题
    • 苍穹外卖
    • +
    • 项目linux部署
      • 准备环境:linux、docker
      • 一、Dockerfile
      • 使用DockerCompose
      • 二、使用DockerCompose
  • 面试
  • 项目面试题
2025-05-03
0
0
目录

项目linux部署

# 准备环境:linux、docker

# docker安装


# 一、Dockerfile

这里以黑马点评项目为例

在操作过程可以通过docker logs <容器id>查看日志

# 创建网络

[root@localhost ~]# docker network create hmdpNW
c7453ef75706426c68c226362aec408ead885099ba456dbc0418f2e3d13b5e90

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
619a865af092   bridge    bridge    local
c7453ef75706   hmdpNW    bridge    local
4c581145b41c   host      host      local
0293dfa69762   none      null      local
# 其中,除了hmdpNW以外,其它都是默认的网络

# mysql安装

删除MySQL

docker rm -f mysql
docker images # 查看旧mysql 的版本Tag
docker rmi mysql:{版本}

# 准备文件

数据库初始化、数据的sql文件(用于在安装mysql时自动执行,可以用mysqldump工具在cmd将本地数据库hmdp数据导出为sql)

mysqldump -uroot -p123456 --databases hmdp > hmdp.sql

hm.conf文件

[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

文件目录

mysql
|——init
|	|——hmdp.sql
|——conf
    |——hm.conf

将文件夹mysql放入部署环境根目录/root中

# docker安装mysql(不建议使用MySQL8)

在根目录/root执行

(设置自己MySQL的密码,要记住)

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --network hmdpNW \
  mysql:5.7
# 5.查看MySQL容器内数据
# 5.1.进入MySQL
docker exec -it mysql mysql -uroot -p123
# 5.2.查看编码表
show variables like "%char%";
# 5.3.结果,发现编码是utf8mb4没有问题
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+

# 6.查看数据
# 6.1.查看数据库
show databases;
# 结果,hmdp是黑马商城数据库
+--------------------+
| Database           |
+--------------------+
| hmdp              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

注意:如果没有生成hmdp数据库,(比如版本不一样导致数据库初始化失败),也可以在本地win环境的cmd中手动执行

  • 先在Linux中查询IP地址
ifconfig
# 如果提示没有ifconfig命令,需要先安装net-tools
yum install net-tools
  • IP地址是ens33里inet后面的,比如我的192.168.10.131
mysql -h192.168.10.131 -uroot -p123
# 执行sql文件
source C:\Users\86157\hmdp.sql

# Redis安装

# 准备文件(不需要)

准备一个redis.conf文件

然后修改redis.conf文件中的一些配置:

# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes 
# 密码,设置后访问Redis必须输入密码
requirepass 123456

上传到部署环境

# docker安装redis

设置自己的密码

docker run -d \
  --restart=always \
  --name redis \
  -p 6379:6379 \
  -v ./redis/data:/data \
  -v ./redis/redis.conf:/etc/redis/redis.conf \
  --network hmdpNW \
  redis:6.2.18-alpine \
  redis-server /etc/redis/redis.conf \
  --appendonly yes \
  --requirepass 123456

# 后端部署

# 准备文件

将项目打包为jar包,(只需要jar包,jar包可以改名)

  • 其中java项目的配置文件采用了多环境的方式:application-dev.yaml是部署到开发环境的配置,application-local.yaml是本地运行时的配置。

    application.yml

    spring:
      application:
        name: hmdp
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://${db.host}:3306/hmdp?useSSL=false&serverTimezone=UTC
        username: root
        password: ${db.pw}
      redis:
        host: ${rs.host}
        port: 6379
        password: ${rs.pw}
    

    application-prod.yml

    db:
      host: mysql
      pw: 123
    rs:
      host: redis
      pw: 123456
    

    application-dev.yml

    db:
      host: localhost
      pw: 123456
    rs:
      host: 127.0.0.1
      pw:
    
  • 在prod生产环境(也就是Docker部署时)采用了mysql作为地址,密码就是等下要部署在docker的MySQL密码,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。

  • 注意:代码中不要有redis的硬编码,如:

        @Bean
        public RedissonClient redissonClient(){
            // 配置
            Config config = new Config();
            config.useSingleServer().setAddress("redis://127.0.0.1:6379");
            // 创建RedissonClient对象
            return Redisson.create(config);
        }
    

准备Dockerfile文件,

一起上传到要部署的Linux环境的路径下(我放在/root/)

# 基础镜像选择合适的版本
# FROM openjdk:11.0-jre-buster
FROM openjdk:8-jre
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hmdp.jar /app.jar
# 入口 
ENTRYPOINT ["java", "-jar", "/app.jar"]

# 部署项目

在根目录/root(需要有jar包、和Dockerfile文件)

# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t hmdp .
# 2.查看镜像
docker images
# 结果
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
hmdp         latest    03fd24581034   8 hours ago   319MB
mysql        8.0       00a697b8380c   2 weeks ago   772MB
# 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmdp --network hmdpNW -e "SPRING_PROFILES_ACTIVE=prod" -p 8081:8081 hmdp

# 前端部署

# 准备文件

准备好自己项目的html和nginx.conf文件

其中nginx.conf文件需要根据实际修改location、proxy_pass的路径 location中的root修改为绝对路径 proxy_pass修改为别名,可以通过网络访问

server {
        listen       8090;
        server_name  localhost;
        # 指定前端项目所在的位置
        location / {
            root   /usr/share/nginx/html/hmdp;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


        location /api {  
            default_type  application/json;
            #internal;  
            keepalive_timeout   30s;  
            keepalive_requests  1000;  
            #支持keep-alive  
            proxy_http_version 1.1;  
            rewrite /api(/.*) $1 break;  
            proxy_pass_request_headers on;
            #more_clear_input_headers Accept-Encoding;  
            proxy_next_upstream error timeout;  
            #proxy_pass http://127.0.0.1:8081;
            proxy_pass http://backend;
        }
    }

    upstream backend {
        server hmdp:8081 max_fails=5 fail_timeout=10s weight=1;
        #server hmdp:8082 max_fails=5 fail_timeout=10s weight=1;
    }  

文件目录

nginx
|——nginx.conf
|
|——html

将文件夹nginx放入部署环境根目录/root中

# 部署项目

创建nginx容器并完成两个挂载

docker run -d \
  --name nginx \
  -p 8090:8090 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmdpNW \
  nginx

# 网络添加补充

如果前面网络没有添加成功也可以手动添加

# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmdpNW mysql --alias db

docker network connect hmdpNW redis
# 3.2.hmdp容器,也就是我们的java项目
docker network connect hmdpNW hmdp
# 3.3.nginx容器,也就是我们的前端项目
docker network connect hmdpNW nginx

docker network inspect hmdpNW

# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

# 启动项目

docker start mysql
docker start redis
docker start hmdp
docker start nginx
# 如果启动失败,可以查看docker日志
dockers logs <容器名>
# 启动后端项目后,可以通过以下命令实时查看控制台日志
docker logs --tail 40 -f hmdp

# 停止项目

一次性停止所有 Docker 容器

docker stop $(docker ps -q)

# RabbitMQ

基于Docker来安装RabbitMQ,使用下面的命令即可:

docker run \
 -e RABBITMQ_DEFAULT_USER=cyan \
 -e RABBITMQ_DEFAULT_PASS=123456 \
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 --network hmdpNW\
 -d \
 rabbitmq:3.8-management

# 使用DockerCompose

# 准备好文件后执行DockerCompose

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  redis:
    image: redis:6.2.18-alpine
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - "./redis/data:/data"
      - "./redis/redis.conf:/etc/redis/redis.conf"
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    networks:
      - hm-net
  hmdp:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmdp
    ports:
      - "8081:8081"
    networks:
      - hm-net
    depends_on:
      - mysql
      - redis
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "8090:8090"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmdp
    networks:
      - hm-net
networks:
  hm-net:
    name: hmdpNW

hm-net:这是在 Docker Compose 文件中引用这个网络时使用的名称(比如在 services 部分的 networks 配置中使用的名称)

name: hmdpNW:这是可选配置,指定了 Docker 实际创建的网络名称。如果不指定,Docker 会默认使用 [项目名称]_hm-net 这样的格式自动生成名称(项目名称通常取自所在目录名)


# 二、使用DockerCompose

下面使用苍穹外卖演示

# 准备好所有文件(.conf、数据等)

# mysql

文件目录

mysql
|——init
|	|——sky.sql
|——conf
    |——hm.conf

如果已经在docker安装了mysql,可以在cmd中手动导入数据库

mysql -h192.168.10.131 -uroot -p123
# 执行sql文件
source C:\Users\86157\sky.sql

# 后端

项目jar包sky

Dockerfile

# 前端

准备好自己项目的html和nginx.conf文件

文件目录

nginx
|——nginx.conf
|
|——html

# 执行DockerCompose

在一个目录中准备好所有的文件后,编写docker-compose.yml,就可以执行compose

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  redis:
    image: redis:6.2.18-alpine
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - "./redis/data:/data"
      - "./redis/redis.conf:/etc/redis/redis.conf"
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    networks:
      - hm-net
  hmdp:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmdp
    ports:
      - "8081:8081"
    networks:
      - hm-net
    depends_on:
      - mysql
      - redis
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "8090:8090"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmdp
    networks:
      - hm-net
networks:
  hm-net:
    name: hmdpNW
上次更新: 2025/5/8 18:28:34
+

← +

最近更新
01
项目优化
05-06
02
项目优化
05-06
03
延迟消息
05-05
更多文章>
Theme by Vdoing | Copyright © 2025-2025 Cyan Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式