离线环境下docker启动springboot项目

Docker linux 离线部署springboot

搭建dcoker环境

1. 首先在有网络的机器上下载Docker的离线安装包:

   - 访问 https://download.docker.com/linux/static/stable/x86_64/

   - 下载对应版本的 docker-<version>.tgz 文件

2. 将下载的安装包传输到目标Linux机器上(可以使用U盘或其他存储设备)

3. 在目标机器上执行以下命令:

   ```bash

   # 解压安装包

   tar xzvf docker-<version>.tgz

   

   # 将docker二进制文件复制到系统目录

   sudo cp docker/* /usr/bin/

   

   # 创建docker服务

   sudo groupadd docker

   sudo useradd -g docker docker

   

   # 创建docker配置文件

   sudo mkdir -p /etc/docker

   sudo touch /etc/docker/daemon.json (没外网 删除 不然可能会启动不了)

   

   # 创建systemd服务文件

   sudo mkdir -p /etc/systemd/system

   sudo touch /etc/systemd/system/docker.service

4. 编辑docker.service文件,添加以下内容:

   

   [Unit]

   Description=Docker Application Container Engine

   Documentation=https://docs.docker.com

   After=network-online.target docker.socket firewalld.service

   Wants=network-online.target

   Requires=docker.socket

   [Service]

   Type=notify

   ExecStart=/usr/bin/dockerd

   ExecReload=/bin/kill -s HUP $MAINPID

   TimeoutSec=0

   RestartSec=2

   Restart=always

   StartLimitBurst=3

   StartLimitInterval=60s

   LimitNOFILE=infinity

   LimitNPROC=infinity

   LimitCORE=infinity

   TasksMax=infinity

   [Install]

   WantedBy=multi-user.target

5. 启动Docker服务:

   ```bash

   # 重新加载systemd配置

   sudo systemctl daemon-reload

   

   # 确保docker.socket服务存在

   sudo touch /etc/systemd/system/docker.socket

   

   # 编辑docker.socket文件,添加以下内容:

   

   [Unit]

   Description=Docker Socket for the API

   PartOf=docker.service

   [Socket]

   ListenStream=/var/run/docker.sock

   SocketMode=0660

   SocketUser=root

   SocketGroup=docker

   [Install]

   WantedBy=sockets.target

      # 启用并启动服务

   sudo systemctl enable docker.socket

   sudo systemctl enable docker.service

   sudo systemctl start docker.socket

   sudo systemctl start docker.service

(这里报错执行6启动成功执行7)或者直接删掉daemon.json 文件重新start

   ```

6.修改daemon.json 

# 创建目录

mkdir -p /etc/docker

# 复制内容 (不通外网没啥用)

tee /etc/docker/daemon.json <<-'EOF'

{

    "registry-mirrors": [

        "http://hub-mirror.c.163.com",

        "https://mirrors.tuna.tsinghua.edu.cn",

        "http://mirrors.sohu.com",

        "https://ustc-edu-cn.mirror.aliyuncs.com",

        "https://ccr.ccs.tencentyun.com",

        "https://docker.m.daocloud.io",

        "https://docker.awsl9527.cn"

    ]

}

EOF

# 重新加载配置

systemctl daemon-reload

# 重启Docker

systemctl restart docker

7. 验证安装:

   ```bash

   docker --version

   docker info

   ```

   - 使用 `systemctl status docker.service` 查看详细错误信息

安装mysql

1.在有网络的服务器上拉取镜像包

docker pull mysql:8.0.31

2.打包为tar上传到目标服务器

docker save -o /home/mysql-8.0.27.tar mysql:8.0.27

3.传输装载

docker load -i /home/mysql/mysql-8.0.27.tar

  1. 挂载启动

docker network create my-network (创建个docker网络)

创建挂载目录

Mkdir /home/mysql/log

Mkdir /home/mysql/data

Mkdir /home/mysql/conf

docker run --name mysql -p 3306:3306 \  #宿主机端口和容器端口

--network my-network \

-v /home/mysql/log:/var/log/mysql \ #宿主机路径:容器路径

-v /home/mysql/data:/var/lib/mysql \

-v /home/mysql/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27 

#设置root账号密码和版本号 成功会返回一串编码

56ecdc8667fa807506988884deaaa6abd824a9d0995da77bbfc4782bfcac54e9

  1. 连接验证

Docker ps / docker images

登录

docker exec -it mysql  mysql -uroot -p123456

安装jdk

1.jdk在线下载打包离线包

docker pull openjdk:8-jdk

docker save -o openjdk8.tar openjdk:8-jdk

2.上传目标服务器并加载

docker load -i openjdk8.tar

  1. 验证

Docker images;

编写Dockerfile文件

1.文件路径/home/sunplus/

2.创建文件touch Dockerfile

3.编辑文件内容

FROM openjdk:8-jdk

#时区 

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \

        echo $TZ > /etc/timezone

#容器目录

WORKDIR /app

复制java jar包从宿主机路径位置(/home/sunplus/sunplus-cloudclinic.jar)

到容器位置(xxxxx/app/sunplus-cloudclinic.jar)

COPY  ./sunplus-cloudclinic.jar  ./sunplus-cloudclinic.jar

RUN mkdir -p /app/logs && \ #创建容器日志目录并授权

        chmod -R 777 /app/logs

#变量 下面启动用 

ENV JAVA_OPTS="-Xms512m -Xmx512m -XX:-HeapDumpOnOutOfMemoryError" \

    SPRING_PROFILES_ACTIVE=local

#指定服务端口 

EXPOSE 8089

# 指定docker容器启动时运行jar包 (java -jar xx.jar) ./sunplus-cloudclinic.jar容器jar位置

CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar ./sunplus-cloudclinic.jar

  1. 构建镜像

docker build -t sunplus:1.0 . #最后的. 表示当前所在目录执行不可缺少

.:这个点表示构建上下文(context)的路径

  • 这里指的是当前目录

  • Docker 会查找当前目录下的 Dockerfile 文件来构建镜像

查看是否成功

Docker images;

  1. 启动java jar包

docker run -d \

 -v /home/sunplus:/app \  #挂载宿主机位置 实际启动的是/home/sunplus/下的jar包

 -v /home/sunplus/logs:/app/logs \  #挂载宿主机日志位置

 --name sunplus \

 --network my-network \ #设置与mysql同一网络

 -p 8089:8089 \ #端口

 sunplus:1.0 #容器名称版本号

说明:

--network my-network \ #设置与docker容器里的mysql同一网络

application-pr.yml 数据库连接用myql docker容器名称代替ip

url: jdbc:mysql://mysql:3306/database?

logback配置路径配置为容器路径

<property name="log.path" value="/app/logs" />

  1. 查看启动日志

docker logs -f <容器名称># 实时跟踪日志(类似 tail -f)

并查看宿主机目录文件是否挂载成功 /home/sunplus/logs

安装nginx

  1. 创建文件目录

Mkdir -p /home/nginx/html/

Mkdir -p /home/nginx/conf/

2.创建编辑配置文件

Touch nginx.conf

Vim nginx.conf;

以下为配置内容根据需求修改:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

types {

text/html                             html htm shtml;

text/css                              css;

text/xml                              xml;

image/gif                             gif;

image/jpeg                            jpeg jpg;

application/javascript                js;

image/png                             png;

}

        listen       80;

        server_name  localhost;

       

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

location ~* \.(html|htm|gif|jpg|svg|jpeg|bmp|png|ico|txt|js|css|ttf)$  {

            root   /home/nginx/html/cloudclinich5;

            index  index.html;

            try_files $uri $uri/ /index.html;

}

location / {

proxy_pass http://sunplus:8089;

}

        

    }

}

3.加载上传的nginx离线包

docker load -i xx.tar

4.创建容器挂载启动

docker run -d \

  --name nginx \

  --network my-network \

  -p 80:80 \

  -v /home/nginx/html/cloudclinich5:/usr/share/nginx/html \ 

  -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \

  cmhs-nginx:1.0

安装redis

  1. 在有网络的服务器上拉取docker离线压缩包
  2. 上传到目标服务器并加载

docker load -i xx.tar

  1. 启动容器

docker run -d \

  --name redis \

  --network my-network \

  -p 6379:6379 \

  -e REDIS_PASSWORD=123456\

  cmhs-redis:1.0 \

  redis-server --requirepass 123456

一些用到的命令

首先停止并删除现有容器(保留数据卷)

docker stop sunplus

docker rm sunplus

删除镜像 docker rmi <IMAGE_ID>

docker build -t sunplus:1.0 .

docker images

Docker ps

Docker logs -f 容器名

chmod 755 xx 授权

docker restart sunplus  重启容器

查看容器ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名

验证容器是否在指定网络中

docker inspect 容器名 | grep NetworkMode

导入数据库

docker exec -i mysql mysql -uroot -p123456

 databasename < /home/java/xx.sql

rm -r 逐级删除非空目录

Rm file 删除文件

mkdir -p  创建多级目录

Touch xx.file 创建文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式专题-Redis Cluster集群运维与核心原理剖析

一. 哨兵集群与Redis Cluster 架构异同&#xff1a; redis单机内存不会超过10g&#xff0c;如果太大的话bgsave命令的话对单节点压力过大。 节点多了&#xff0c;之间的通信也会非常缓慢。 redis集群模式下对从节点是没有读取操作的&#xff0c;只在主节点进行读取操作。 哨…

使用 Node.js、Express 和 React 构建强大的 API

了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始&#xff0c;到集成 React 前端&#xff0c;并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者&#xff0c;这篇文章都适合你。 今天&#…

智慧声防:构筑海滨浴场安全屏障的应急广播系

海滨浴场是夏季旅游的热门目的地&#xff0c;但潮汐变化、离岸流、突发天气、溺水事故等安全隐患时刻威胁着游客安全。传统的安全管理依赖人工瞭望和喊话&#xff0c;存在覆盖范围有限、响应速度慢等问题。“智慧声防”应急广播系统&#xff0c;通过智能化、网络化、多场景协同…

Redis之缓存穿透

Redis之缓存穿透 文章目录 Redis之缓存穿透一、什么是缓存穿透&#xff1f;二、缓存穿透常见的解决方案1. 缓存空对象&#xff08;Null Caching&#xff09;2. 布隆过滤器&#xff08;Bloom Filter&#xff09;​3. 互斥锁&#xff08;Mutex Lock&#xff09;​4. 接口层校验5.…

【蓝桥杯】颜色平衡树

思路 颜色平衡树&#xff0c;即子树中的节点颜色均匀分布。所以要确认一个子树是否为颜色平衡树&#xff0c;需要得到它的所有节点的颜色&#xff0c;也就是要深搜它所有的子树。 这个想法就很标准的启发式合并了&#xff0c;何为启发式合并&#xff1f;简单来说&#xff0c;…

自动化测试工具playwright中文文档-------14.Chrome 插件

介绍 注意 插件仅在以持久化上下文启动的 Chrome/Chromium 浏览器中工作。请谨慎使用自定义浏览器参数&#xff0c;因为其中一些可能会破坏 Playwright 的功能。 以下是获取位于 ./my-extension 的 Manifest v2 插件背景页面句柄的代码示例。 from playwright.sync_api imp…

让 Python 脚本在后台持续运行:架构级解决方案与工业级实践指南

让 Python 脚本在后台持续运行&#xff1a;架构级解决方案与工业级实践指南 一、生产环境需求全景分析 1.1 后台进程的工业级要求矩阵 维度开发环境要求生产环境要求容灾要求可靠性单点运行集群部署跨机房容灾可观测性控制台输出集中式日志分布式追踪资源管理无限制CPU/Memo…

MyBatis 详解

1. 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的 持久层框架&#xff0c;它通过 XML 或注解配置&#xff0c;将 Java 对象&#xff08;POJO&#xff09;与数据库操作&#xff08;SQL&#xff09;进行灵活映射&#xff0c;简化了 JDBC 的复杂操作。 核心思想&#xff1a;S…

循环神经网络 - 深层循环神经网络

如果将深度定义为网络中信息传递路径长度的话&#xff0c;循环神经网络可以看作既“深”又“浅”的网络。 一方面来说&#xff0c;如果我们把循环网络按时间展开&#xff0c;长时间间隔的状态之间的路径很长&#xff0c;循环网络可以看作一个非常深的网络。 从另一方面来 说&…

GoLand 标红但程序可正常运行:由符号索引缓存失效引起的假报错问题

问题描述&#xff1a; 在 GoLand 中&#xff0c;api/tls.go 文件中引用了 api/type.go 中定义的结构体 Options&#xff0c;但 GoLand 把 Options 标红显示为未定义&#xff08;undefined symbol&#xff09;&#xff0c;尽管程序实际可以正常编译和运行&#xff08;go build /…

python-各种文件(txt,xls,csv,sql,二进制文件)读写操作、文件类型转换、数据分析代码讲解

1.文件txt读写标准用法 1.1写入文件 要读取文件&#xff0c;首先得使用 open() 函数打开文件。 file open(file_path, moder, encodingNone) file_path&#xff1a;文件的路径&#xff0c;可以是绝对路径或者相对路径。mode&#xff1a;文件打开模式&#xff0c;r 代表以…

Uniapp:确认框

目录 一、 出现场景二、 效果展示三、具体使用 一、 出现场景 在项目的开发中&#xff0c;会经常出现删除数据的情况&#xff0c;如果直接删除的话&#xff0c;可能会存在误删&#xff0c;用户体验不好&#xff0c;所以需要增加一个消息提示&#xff0c;提醒用户是否删除。 二…

解密 Vue 打包策略

1. 总体概述 在现代前端开发中&#xff0c;Vue 已成为流行框架之一&#xff0c;开发者通常使用 webpack、vite 或 vue-cli 来构建项目。可能会困惑&#xff1a; 为什么源码中的资源引用路径与打包后实际产出的路径会不一样&#xff1f;静态路径与动态路径到底如何正确书写&am…

Golang|接口并发测试和压力测试

文章目录 这里出现某些奖品和数据库中库存量不一致的问题原因就是在并发的情况下&#xff0c;sync.Map仍然会出现脏写问题&#xff0c;就是在同时操作下的操作覆盖问题可以先把数据放到channel里&#xff0c;然后用一个单一的协程负责读取channel并写入map

CentOS下,Xftp中文文件名乱码的处理方式

乱码原因 中文版Windows默认使用GBK编码&#xff0c;现代Linux发行版&#xff08;如CentOS、Ubuntu等&#xff09;默认使用UTF-8编码。Windows下正常的编码&#xff0c;可能在linux下无法识别&#xff0c;例如&#xff1a;Windows的GBK字节0xD6D0被Linux用UTF-8解码时&#xf…

解决 Vue 中 input 输入框被赋值后,无法再修改和编辑的问题

目录 需求&#xff1a; 出现 BUG&#xff1a; Bug 代码复现 解决问题&#xff1a; 解决方法1&#xff1a; 解决方法2 关于 $set() 的补充&#xff1a; 需求&#xff1a; 前段时间&#xff0c;接到了一个需求&#xff1a;在选择框中选中某个下拉菜单时&#xff0c;对应的…

【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现

项目视频介绍&#xff1a; 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介&#xff1a; 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…

【Vue】案例——To do list:

【Vue】案例——To do list&#xff1a; 一、案例介绍&#xff1a;二、效果展示&#xff08;如图&#xff09;三、主要功能&#xff1a;四、技术要点&#xff1a;补充&#xff1a;【Vue】Vue模板语法(点击可跳转)补充&#xff1a;【Vue】数据绑定&#xff08;单双向&#xff09…

导入 .sql 文件到 云服务器上的MySQL中

导入 .sql 文件到 云服务器上的MySQL中 步骤 1&#xff1a;确保 .sql 文件已上传到云服务器步骤 2&#xff1a;登录到云服务器步骤 3&#xff1a;检查文件是否成功传输步骤 4&#xff1a;登录 MySQL步骤 5&#xff1a;创建空数据库&#xff08;如果尚未创建&#xff09;步骤 6&…

我的机器学习之路(初稿)

文章目录 一、机器学习定义二、核心三要素三、算法类型详解1. 监督学习&#xff08;带标签数据&#xff09;2. 无监督学习&#xff08;无标签数据&#xff09;3. 强化学习&#xff08;决策优化&#xff09;(我之后主攻的方向) 四、典型应用场景五、学习路线图六、常见误区警示七…