linux 上Docker-compose配置、部署java服务

Docker配置部署java服务

    • 1、创建新用户
      • 1.1、使用 useradd 命令创建新用户
      • 1.2、使用 adduser 命令创建新用户
      • 1.3用户授权
      • 1.3用户组授权
    • 2、创建文件
      • 2.1、创建文件夹
      • 2.2、创建文件
    • 3、nginx
      • 3.1 docker运行 nginx
        • 3.1.1、拉取镜像
        • 3.1.2、容器运行
      • 3.2 docker-compose运行 nginx
      • 3.2.1 运行环境挂载文件配置
      • 3.2.2 docker-compose.yml文件编辑
        • **附加
    • 4、redis
      • 4.1 docker运行redis
        • 4.1.1、拉取镜像
        • 4.1.2、容器运行
      • 4.2 docker-compose运行 mysql
      • 4.2.1 运行环境挂载文件配置
      • 4.2.2 docker-compose.yml文件编辑
      • *注意
    • 5、redis
      • 5.1 docker运行redis
        • 5.1.1、拉取镜像
        • 5.1.2、容器运行
      • 5.2、docker-compose运行 redis
        • ==redis.conf==
    • 6、emqx
      • 6.1 docker运行emqx
        • 6.1.1、拉取镜像
        • 6.1.2、容器运行
      • 6.2、docker-compose运行 emqx
    • java部署
      • jave项目配置
      • 前端文件
      • nginx配置
    • websocket配置相关问题
      • 问题
      • 原因
      • 解决

1、创建新用户

1.1、使用 useradd 命令创建新用户

在 Linux 系统中,我们可以使用 useradd 命令来创建新用户。打开你的终端,键入下面的命令:

sudo useradd -m 新用户名

这里,-m 选项会为新用户在 /home 目录下创建一个新的家目录,而 新用户名 就是你想要创建的新用户的用户名。
接下来,你可能会希望给新用户设置一个密码,你可以使用 passwd 命令:

sudo passwd 新用户名

然后,根据提示输入新密码两次。

1.2、使用 adduser 命令创建新用户

在某些基于 Debian 的 Linux 发行版中,你可能会找到一个叫做 adduser 的命令。它实际上是 useradd 的一个友好版本,更方便你进行交互式操作。

sudo adduser 新用户名

执行这个命令后,系统会自动引导你完成创建新用户的过程,包括设置密码、填写用户全名、房间号码、工作电话、家庭电话和其他信息(这些额外信息是可选的,如果不需要,可以直接按回车跳过)。

1.3用户授权

为了操作顺利需要给用户授权管理员

sudo vim /etc/sudoers

编辑sudoers文件,找到一下内容,

root    ALL=(ALL)       ALL

在后面加上以下内容

用户名 ALL=(ALL)       NOPASSWD:ALL

1.3用户组授权

用户授权了管理员之后可能还有些权限功能不足的地方,一下以docker举例
例:在执行docker命令的时候依旧权限不足

所有查看用户组

cat /etc/group

找到docker所属的用户组
把已有的用户添加到docker用户组

usermod -G {groupname} {username}

添加成功之后就可以使用docker命令了

2、创建文件

创建部署所需相关文件夹和文件

2.1、创建文件夹

mkdir 文件夹名

2.2、创建文件

touch 文件名.文件类型

3、nginx

3.1 docker运行 nginx

3.1.1、拉取镜像
 docker pull nginx:latest

异常:error pulling image configuration: download failed ****** 点击处理

3.1.2、容器运行
docker run --name nginx-test -p 20240:80 -d nginx
  • –name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行。

3.2 docker-compose运行 nginx

3.2.1 运行环境挂载文件配置

将正在运行的nginx中的配置文件复制到本机上

# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/
# 将容器中的日志文件夹复制到宿主机
docker cp nginx:/var/log/nginx /home/nginx/logs/

3.2.2 docker-compose.yml文件编辑

注意: 挂载点文件路径,和上一步配置的要对应上

version: "3"
services:
   web:
     #定义主机名
     container_name: lrnginx
     #使用的镜像
     image: nginx:latest
     #容器的映射端口
     ports:
       - 20240:80
     #定义挂载点         
     volumes:
       - ./html:/usr/share/nginx/html
       - ./conf/nginx.conf:/etc/nginx/nginx.conf
       - ./conf.d:/etc/nginx/conf.d
       - ./logs:/var/log/nginx
     #docker 重启后,容器自启动
     restart: always

运行命令

docker-compose up -d
**附加

*进入容器内部查看nginx配置文件

docker exec -it nginx-test bash

*查看容器中nginx配置文件

 cat /etc/nginx/nginx.conf

4、redis

4.1 docker运行redis

4.1.1、拉取镜像
 docker pull mysql:8.0
4.1.2、容器运行
docker run --name mysql-test -p 20241:3306 -d mysql:8.0

4.2 docker-compose运行 mysql

4.2.1 运行环境挂载文件配置

将正在运行的mysql中的配置文件复制到本机上

# 将容器mysql 文件复制到宿主机
docker cp mysql-test:/etc/mysql /home/lirong/mysql/

容器中mysql文件这样的

├── conf.d
├── my.cnf  
└── my.cnf.fallback

将文件复制过来调整一下,调整以后文件夹是这样的

├── conf.d
├── conf
│   └── my.cnf 
│   └── my.cnf.fallback

根据个人习惯调整

4.2.2 docker-compose.yml文件编辑

version: '3'
services:
  mysql:
    restart: always
    privileged: true
    image: mysql:8.0
    container_name: lrmysql
    volumes:
      - ./data:/var/lib/mysql
      - ./conf.d:/etc/mysql/conf.d
      - ./conf/my.cnf:/etc/mysql/my.cnf
      - ./logs:/var/log/mysql
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
    environment:
      MYSQL_ROOT_PASSWORD: "***"
      MYSQL_USER: "**"
      MYSQL_PASSWORD: "**"
      MYSQL_INITDB_SKIP_TZINFO: "Asia/Shanghai"
    ports:
      - 20241:3306
    network_mode: "bridge"
 

运行命令

docker-compose up -d

*注意

在部署过程中遇到服务互顶的情况(服务A启动 服务B挂掉,服务B启动 服务A挂掉)
这种情况请检查容器名,服务名的唯一性.

5、redis

5.1 docker运行redis

5.1.1、拉取镜像
 docker pull redis:6.0
5.1.2、容器运行
docker run --name redis-test -p 20242:3306 -d redis:6.0

5.2、docker-compose运行 redis

version: '3'
services:
  lrredis:
    image: redis
    container_name: lrredis
    hostname: redis
    ports:
      - 20242:6379
    volumes:
      - ./redis.conf:/etc/redis/redis.conf
      - ./data:/data
      - ./logs:/logs
    command: redis-server /etc/redis/redis.conf
    restart: always
redis.conf
# Redis服务器配置 
 
# 绑定IP地址
#解除本地限制 注释bind 127.0.0.1  
#bind 127.0.0.1  
 
# 服务器端口号  
port 6379 
 
#配置密码,不要可以删掉
requirepass syf133618
  
 
 
#这个配置不要会和docker -d 命令 冲突
# 服务器运行模式,Redis以守护进程方式运行,默认为no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败,如果后面redis启动失败,就将这个注释掉
daemonize no
 
#当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定(自定义)
#pidfile /data/dockerData/redis/run/redis6379.pid  
 
#默认为no,redis持久化,可以改为yes
appendonly yes
 
 
#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 60
# 服务器系统默认配置参数影响 Redis 的应用
maxclients 10000
tcp-keepalive 300
 
#指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合(分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改)
save 900 1
save 300 10
save 60 10000
 
# 按需求调整 Redis 线程数
tcp-backlog 511
 
 
 
  
 
 
# 设置数据库数量,这里设置为16个数据库  
databases 16
 
 
 
# 启用 AOF, AOF常规配置
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
 
 
# 慢查询阈值
slowlog-log-slower-than 10000
slowlog-max-len 128
 
 
# 是否记录系统日志,默认为yes  
syslog-enabled yes  
 
#指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel notice
  
# 日志输出文件,默认为stdout,也可以指定文件路径  
logfile stdout
 
# 日志文件
#logfile /var/log/redis/redis-server.log
 
 
# 系统内存调优参数   
# 按需求设置
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

6、emqx

6.1 docker运行emqx

6.1.1、拉取镜像
 docker pull emqx:latest
6.1.2、容器运行
docker run -dit --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx:latest

6.2、docker-compose运行 emqx

拷贝配置文件到宿主机,这样修改宿主机的配置文件之后只需要重启容器,配置文件就会生效。左边是容器的路径,右边是要映射宿主机路径。

docker cp emqx:/opt/emqx/etc /home/lirong/emqx/etc

version: '3'
services:
  lrredis:
    image: redis
    container_name: lrredis
    hostname: redis
    ports:
      - 20242:6379
    volumes:
      - ./redis.conf:/etc/redis/redis.conf
      - ./data:/data
      - ./logs:/logs
    command: redis-server /etc/redis/redis.conf
    restart: always

java部署

jave项目配置

配置/修改 mysql数据库地址、账号、密码
mysql数据库库表配置
redis 缓存地址、密码
检查项目中所涉及服务的端口占用情况
项目日志输出路径

文件上传到服务器指定位置,启动jar包

nohup java -jar jar包名.jar &

前端文件

前端调整好配置,打包上传到指定位置。
因为我们nginx是用docker镜像部署的,所以前端资源也要挂载到容器里面去
修改nginx中的dockr-compose.yml将前端资源挂载进容器

nginx配置

server {
	# 端口监听
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    
    # websocket协议升级配置
    location /api/campus/websocket {
        proxy_pass http://localhost:9016/api/campus/websocket;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    # 默认后端请求转发
    location /api/campus {
        proxy_pass http://localhost:9016/api/campus;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
    }
   	# 默认前端端请求定向
    location / {
         root /home/admin/vue/campus/platform;
         index index.html;
    }
      # 403
    error_page 403 /respon_403.json;
    location = /respon_403.json {
        default_type application/json;
        return 403 '{"code":"403","status":"error","message":"Forbidden"}';
    }
    # 404
    error_page 404 /respon_404.json;
    location = /respon_404.json {
        default_type application/json;
        return 403 '{"code":"404","status":"error","message":"Not Found"}';
    }
    # 500-504
    error_page 500 502 503 504 /respon_500.json;
    location = /respon_500.json {
        default_type application/json;
        return 403 '{"code":"500","status":"error","message":"Server Error"}';
    }
}
                                 

配置完成后重启nginx,浏览器访问服务器 ip+ 20240(nginx映射出去的端口)

websocket配置相关问题

问题

upstream server temporarily disabled while connecting to upstream

连接到上游时,上游服务器暂时被禁用

正常情况下websocket配置nginx.conf代理,协议升级就好。如下:

   # websocket协议升级配置
    location /api/campus/websocket {
        proxy_pass http://localhost:9016/api/campus/websocket;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

2024/09/02 11:20:17 [warn] 24#24: *9 upstream server temporarily disabled while connecting to upstream, client: 114.219.61.179, server: , request: “GET /api/campus/websocket/R81SA42120002 HTTP/1.1”, upstream: “http://127.0.0.1:20243/api/campus/websocket/R81SA42120002”, host: “180.153.118.123”

原因

在nginx访问接口的时候,去做一些权限的校验。只有校验通过才能访问接口,否则就直接返回失败。但是在调用上游接口的时候,一直提示上游服务暂时禁用。但是上游服务可以保证一定运行着,并且可以访问通。所以通过查阅前人总结发现。原来每个容器内的本地主机(如Nginx容器)与容器外部的本地主机不同

解决

将proxy_pass localhost:port”中的本地主机更改为“ip:port”(这是我计算机中的IPv4)即可解决这个问题。
即:将上面配置中的

  proxy_pass http://localhost:9016/api/campus/websocket;

改成(拿我服务器ip为192.168.0.3 举例)

  proxy_pass http://192.168.0.3:9016/api/campus/websocket;

你可能感兴趣的:(linux,docker,java)