项目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