内网服务器离线docker打包部署上线(含前后端)

本次上线内容包含前端vue 和 后端 springboot 项目,通过docker打包环境,并且因为服务器内部无法联网,所以所有docker操作如打包,下载等,都使用下载离线包来完成,包括mysql 和 redis 配置 其中包含了对于docker 网络访问内容的补充,作为一次记录

一、部署环境

mysql 和 redis

准备docker-compose 环境

因为本次部署环境中没有docker-compose文件,需要去阿里镜像下载可执行文件:
阿里镜像: 阿里镜像https://mirrors.aliyun.com
把docker-compose 放到 /usr/local/bin 下,
并修改名称为docker-compose, 给予可执行权限,

chmod  775 /usr/local/bin/docker-compose

成功后通过查看安装环境信息

docker-compose --version

编写docker-compose.yml 文件

version: '3.3'
services:
  mysql:
    container_name: mysql
    restart: always
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      # 挂挂载配置文件
      - ./mysql/conf:/etc/mysql/conf.d
      # 挂载日志
      - ./mysql/logs:/logs
      # 挂载数据
      - ./mysql/data:/var/lib/mysql
    command:
      --innodb-buffer-pool-size=80M
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      '--default-time-zone=+8:00'
      --lower-case-table-names=1
      --explicit_defaults_for_timestamp=true
      --max_allowed_packet=128M
    environment:
      # root 密码
      MYSQL_ROOT_PASSWORD: admin123
  redis:
    image: redis:5.0.10
    container_name: redis
    restart: always
    ports:
      - 6379:6379
    volumes:
      #指定挂载目录
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
      - ./redis/data:/data:rw
    command: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf "

配置redis.conf

protected-mode no
port 6379
timeout 0
save 900 1 
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec
requirepass admin123

执行 docker-compose up -d

将文件中配置的信息生成镜像,并生成环境容器;

进入mysql 内部并初始化数据库信息

1、复制文件到mysql容器内部,在容器里面最外层地址

docker cp ./init.sql mysql:/

2、进入mysql 容器内部

docker exec -it mysql /bin/bash

3、进入mysql数据库

mysql -u root -p admin123

4、创建mysql 数据库

create database test;

5、执行初始化sql文件

use test;
source /var/lib/mysql/init.sql

二、部署后端项目

编写dockerflie

back为后端项目名称,下同

# 设置本镜像需要使用的基础镜像
FROM kdvolder/jdk8  
# 把jar包添加到镜像中
ADD back.jar /back.jar
# 镜像暴露的端口
EXPOSE 8050
RUN bash -c 'touch /back.jar'
# 容器启动命令
ENTRYPOINT ["java","-jar","/back.jar"]

导出镜像

docker build -t back-pro:1.0.0 .
docker save back-pro:1.0.0 > back-pro.tar

把tar文件放到服务器指定文件夹后,执行指令生成 back-pro:1.0.1的镜像

docker load -i back-pro.tar;

指定镜像名称,启动容器

docker run -d --restart=always --name back -p 8050:8080 back-pro:1.0.1

查看容器启动日志

docker logs -f --tail=1000 back

linux中模拟访问测试接口,get方法,无参数

curl http://127.0.0.1:8050/back/test

三、部署前端项目

编写dockerflie

front-web为前端项目名称,下同

FROM nginx
VOLUME /OSdata/docker/nginx
ENV LANG en_US.UTF-8
RUN echo "server {  \
                      listen       8051; \
                      location ^~ /back { \
                      proxy_pass              http://127.0.0.1:8050/back/; \
                      proxy_set_header        Host jeecg-boot-system; \
                      proxy_set_header        X-Real-IP \$remote_addr; \
                      proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for; \
                  } \
                  #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
                  location / { \
                     root   /var/www/html/; \
                      index  index.html index.htm; \
                      if (!-e \$request_filename) { \
                          rewrite ^(.*)\$ /index.html?s=\$1 last; \
                          break; \
                      } \
                  } \
                  access_log  /var/log/nginx/access.log ; \
              }  " > /etc/nginx/conf.d/default.conf \
    &&  mkdir  -p  /var/www \
    &&  mkdir -p /var/www/html
ADD dist/ /var/www/html/
EXPOSE 8051

导出镜像

docker build -t front-web-pro:1.0.0 .
docker save front-web-pro:1.0.0 > front-web-pro.tar

把tar文件放到服务器指定文件夹后,执行指令生成 front-web-pro:1.0.1的镜像

docker load -i front-web-pro.tar;

指定镜像名称,启动容器

docker run -d --restart=always --name front-web -p 8051:8051 front-web-pro

linux中模拟访问测试接口,get方法,无参数

curl http://127.0.0.1:8051

四、遇到问题

1、镜像包tar保存后,docker load 出来的镜像没有仓库名称和标签,使用docker tag打日志

docker tag 镜像id front-web:1.0.0

2、服务器中某些端口可能被防火墙屏蔽,使用命令查看可用端口

netstat -tuln

3、docker中的数据库访问方式,需要通过docker分配的ip来设置

ip addr

一开始通过127.0.0.1访问数据库失败,通过上面指令知道docker的ip为:172.17.0.2,修改项目中访问数据库的ip为:172.17.0.2:3306/test,此处问题参考以下文章: 宿主机项目连接docker容器内的mysql

五、后续优化点

1、通过修改后端 dockerfile 的jar 文件配置方式,挂载一个地址可以实现更新jar项目,无需每次频繁打包镜像

2、把docker 的ip加入nginx 管理,实现统一的访问路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值