Docker部署Nginx和SpringBoot项目,一遍把坑全踩完!

news2024/12/23 5:27:20

一.下载Docker

理论上来说,直接跟官网就行了,不过这里有个小坑。
官网默认推荐的是Docker Desktop(一个docker图形化工具)的安装方式,而不是Docker Engine(docker核心组件)的安装。
正确查看安装文档的方式是官网->Get Started->Docker Engine->CentOS(或其它系统),如下图所示。

二、下载镜像

这一步很简单,你项目需要什么镜像,就选择下载什么镜像。例如我使用到了RedisMysqlNginx,访问DockerHub,然后对应pull或是直接使用run命令都能下载镜像。
如果需要特定的版本,可以指定特定的标签。

三、封装自定义app镜像

我们的Spring项目想要在docker容器上运行,就需要封装一个自己的image,操作起来并不复杂。

1.新建文件夹并上传jar文件

如下图所示,我这里命名为lightcloud-backend,因为我这里是一个前后端分离项目,这里是后端部分。图片里其余的文件暂时可以忽略。

2.创建Dockerfile文件

Dockerfile是Docker用于构建镜像的特殊文件,里面声明了构建镜像所需的依赖、镜像运行时执行的命令等等。以下是一个简单的样例,供大家参考。

FROM eclipse-temurin:17
RUN mkdir /opt/app
COPY LightCloud-BackEnd.jar /opt/app
CMD ["java", "-jar", "/opt/app/LightCloud-BackEnd.jar"]

解释一下上述配置的含义:
FROM表示要构建的镜像依赖的其他镜像,我们这里构建Java应用,需要使用到jdk,选了一个17的版本(tag)。
RUN表示初始化时需要执行的命令,要在容器内创建一个新的/opt/app文件夹。
COPY不必多说,将我们的jar包拷贝到指定位置。
CMD同样是执行命令,目录下运行Java程序。

3.构建镜像

在当前目录下执行构建就好了,但是注意不要漏掉.字符。

docker build -t <image_name>:<tag(默认是latest)> .

完成后,你可以在docker image ls中观察到你的镜像。

四、创建内网并配置Nginx

1.引入

docker的容器默认是bridge网络模式,这种模式下,每个容器都会有独立且隔离的IP。因而各容器之间的网络通信是一大难题。
一种显而易见的解决方法是,给每个容器添加主机的端口映射,相互之间使用主机的ip和端口进行通信。但是这样弊端不少,首先是大量占用主机端口,容易导致端口冲突等配置问题。其次是不方便,一旦主机端口或是ip发生变更,与之相关的配置全部都要更改。
因而,事实上有更合理的解决方式,那就是创建docker内网。
如果你通过如下命令访问某docker容器内部,下载好ping指令库后让其ping另一台虚拟机,你会发现他们之间是可以ping通的,也就是说,容器之间本来就是相连的。

docker exec -it <container_name or id> /bin/bash

但是仅仅是相连还不够,学过微服务的都知道,不同微服务之间是通过微服务名而非ip进行关联的。如果docker也可以这样关联,灵活性显然大大提高。
答案就是,将Docker容器通过内网连接。

2.连接内网的方法

要将多个Docker容器置于同一内网之中,只需要在容器运行时添加--net的配置即可
当然首先,我们得创建一个docker内网。

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-net
docker run -d --rm --name lightcloud-backend  --net my-net lightcloud-backend

通过上面的方式,我们就将容器关联到了内网中,这时候我们再次通过ping指令访问容器名,就能够ping通啦。

3.nginx的配置

我的前端使用的是vue的SPA(单页面应用),因而我在nginx中需要将前端和后端的路由进行配置,以避免我希望访问前端页面时,被误认为是访问后台资源。
配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  lightcloud.io;

        location /api {
            #root   html;
            proxy_pass   http://lightcloud-backend:8002/api;
            # 这个字段是用来让服务器标识原客户端的主机和IP的
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
            client_max_body_size 3M;  # 对上传路径设置单独的最大文件大小限制
        }

        location / {
            #通过break避免循环匹配
            rewrite ^/(.*)$ / break;
            proxy_pass   http://lightcloud-frontend:8001/;
            # 这个字段是用来让服务器标识原客户端的主机和IP的
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        
        location ~ \.(js|css|svg|png|jpg|ico)$ {
            #root   html;
            proxy_pass   http://lightcloud-frontend:8001;
            # 这个字段是用来让服务器标识原客户端的主机和IP的
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


}

这里的容器名和端口号自行修改为对应的即可,如果你使用的不是SPA和前后端分离部署,那么配置也会简单很多。
PS:不要忘记Spring项目中也要修改对应的URL为Docker容器名(例如Mysql和Redis)。

Mysql的配置

和Nginx相似,但是mysql默认我们并不需要修改其配置文件,因而需要注意的地方就只有启动命令了。

docker run --name my-mysql  -v /opt/mysql-data:/var/lib/mysql -p 3306:3306 --rm -d -e MYSQL_ROOT_PASSWORD=123456 --net my-net mysql

由于mysql是一个持久型数据库,因而数据的保存十分关键,如果我们不对数据保存进行映射,数据就只会保存到容器中,而容器每次重启,之前的操作都会被清空,这显然十分危险。
这里-v就是将容器的数据目录映射到了主机的目录,这样,即使我们重启容器,数据也不会丢失。-p是为了更方便的操作数据,因而映射主机的端口,以便能远程操作数据库。
至于--rm-d,分别是让容器stop后自动清除和容器输出后台运行。

总结

看到这里,基本就能够解决Docker容器的部署问题了,离成功又进了一步!

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

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

相关文章

电脑怎么拖动文件到想要的位置?电脑上拖拽没了的文件怎么找回

在日常的办公和学习中&#xff0c;电脑文件拖拽操作是每位用户都不可或缺的技能。然而&#xff0c;有时在拖动文件时&#xff0c;可能会因为误操作或其他原因&#xff0c;导致文件消失或移至未知位置。本文将详细解析如何在电脑上轻松拖动文件到指定位置&#xff0c;并为您提供…

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用&#xff0c;主要包含以下功能&#xff1a; 播放应用中的音频资源文件&#xff0c;并可进行上一曲、下一曲、播放、暂停、切换播放模式&#xff08;顺序播放、单曲循环、随机播放&#xff09;等操作。结合后台任务管理模块&…

多因素不同水平的正交表设计(并列法)

文章目录 一、问题提出二、举例说明 一、问题提出 参考高等教育课本《实验设计与数据处理》 很多时候&#xff0c;我们要考察的因素水平数不尽相同&#xff0c;这时候一般采用混合水平正交表或者对普通的正交表作修改&#xff0c;其中&#xff0c;混合水平正交表由于水平数不规…

某翻译平台翻译接口逆向之加解密参数刨析

上文链接 某翻译平台翻译接口逆向之webpack学习 分析参数 加密参数&#xff1a; ${t} function S(e, t) {return _(client${u}&mysticTime${e}&product${d}&key${t}) } function k(e, t) {const n (new Date).getTime();return {sign: S(n, e),client: u,produc…

STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》&#x1f33f;《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f530;MT6701芯片和AS5600从软件读取对比&#xff0c;只是读取的寄存器和…

掉落回弹问题(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;float b 100;float sum 0;int i 0;//运算&#xff1b;for (i 1; i < 10; i){//运算&…

2024平替电容笔买哪个品牌好?iPad电容笔全能榜单热门款TOP5分享!

2024年&#xff0c;随着科技的不断发展和消费者对生活品质的追求&#xff0c;电容笔作为一种创新的无纸化工具&#xff0c;逐渐走进人们的生活和工作中。然而&#xff0c;在电容笔市场的繁荣背后&#xff0c;也隐藏着品质良莠不齐的现象。众多品牌为了追求利润&#xff0c;推出…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

美业连锁多门店收银系统源码-美业系统iPad端使用前准备工作分享

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、 购买一台iPad并安装应用 请使用系统版本在10.0.0或以上的苹果iPad&#xff08;建议购…

node-sass安装失败解决

老项目安装node-sass4.14.1一直失败 "node-sass": "^4.14.1",报错环境变量Path 中没有 python2.7 gyp verb check python checking for Python executable "python2.7" in the PATH安装python2.7,然后设置npm config set python C:\Python27 …

HART协议

一、HART协议 HART 协议采用美国电话通讯系统Bell202频移键控(FSK)标准&#xff0c;在4&#xff5e;20mA的模拟0.5mA的正弦波&#xff0c;波特率是 1200bps。因为所叠加的正弦信号平均值为0&#xff0c;而且相位连续频移键控技术要求在波特率为 1200Hz的数据位 1 和 0 的边界的…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

mybatis拦截器和mybatis plus的拦截器

MyBatis拦截器和MyBatis Plus的拦截器在概念上是一致的&#xff0c;都是通过拦截器机制对MyBatis的SQL执行过程进行扩展和控制&#xff0c;但是在实现细节和功能上有所差异。MyBatis Plus的拦截器是建立在MyBatis拦截器基础之上&#xff0c;通过封装简化了开发流程&#xff0c;…

动物解剖流程3d仿真展示动画支持反复观看和使用

在兽医专业的广袤领域中&#xff0c;动物解剖学作为基石学科&#xff0c;为组织胚胎学、生理学、病理解剖学、外科手术学、临床诊断学等科研教学提供了坚实的基础。而如今&#xff0c;随着科技的飞速发展&#xff0c;我们迎来了一个全新的学习时代——3D数字动物解刨虚拟仿真实…

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

autodesk系列软件安装错误1603,手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067

一般Autodesk Desktop Licensing Service这个服务没安装或者不正常会导致autodesk系列软件安装错误1603或者其他报错。 手动安装Autodesk Desktop Licensing Service之后&#xff0c;启动服务提示错误1067&#xff0c; 解决方法如下 打开autoremove点击扩展功能&#xff0c;输…

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

李廉洋:4.23黄金休市之后一蹶不振,原油小幅度上涨。晚间策略!

美国利率居高不下&#xff0c;降低了黄金等非收益资产的吸引力。今天的经济数据可能会影响美联储的利率决定&#xff0c;从而可能影响金价走势。美国货币政策对黄金价格的影响&#xff0c;美元走强以及对美国利率持续高企的预期&#xff0c;正对金价施加额外压力。美联储对持续…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区&#xff01; 去年 12 月&#xff0c;Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…