运维_Mac环境单体服务Docker部署实战手册

Docker部署

本小节,讲解如何将前端 + 后端项目,使用 Docker 容器,部署到 dev 开发环境下的一台 Mac 电脑上。

1 环境准备

需要安装如下环境:

  • Docker:容器
  • MySQL:数据库
  • Redis:缓存
  • Nginx:负载均衡

1.1 安装 Docker

此处省略,自行查询安装环境。安装后配置加速镜像。

配置 Docker 镜像加速器(推荐)
修改 Docker 配置
编辑 /etc/docker/daemon.json(Linux)或 Docker Desktop 的配置(Windows/macOS),添加以下内容:

{
“registry-mirrors”: [“https://m.daocloud.io”]
}

1.2 使用Docker网络

如果使用 Docker Compose,可忽略本节。

默认 bridge 网络的局限性

  • 不支持容器名称解析:必须使用 IP 地址,而 IP 地址可能会在容器重启后发生变化。

  • 隔离性差:所有容器共享同一个默认 bridge 网络,可能存在端口冲突或安全问题。

  • 配置复杂:需要手动获取 IP 地址,不适合动态环境。

为了克服默认 bridge 网络的局限性,建议使用 自定义 bridge 网络,它支持容器名称解析,并提供更好的隔离性。

# 列出所有网络
docker network ls 
# 创建网络
docker network create my-network

1.3 安装 MySQL

① 执行如下命令,使用 Docker 启动 MySQL 容器。

#  拉取 MySQL 镜像
docker pull m.daocloud.io/docker.io/mysql:8.0# mac 启动 MySQL
docker run -d \
-v ~/work/mysql/:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always --name mysql \
--network my-network \
m.daocloud.io/docker.io/mysql:8.0

导入SQL脚本。

1.4 安装 Redis

执行如下命令,使用 Docker 启动 Redis 容器。

# 拉取并启动 Redis 镜像
docker run -d \
--name redis \
--restart=always \
-p 6379:6379 \
-e REDIS_PASSWORD=123456 \
--network my-network \
-v ~/work/redis/data:/data \
m.daocloud.io/docker.io/redis:7.0# 进入 Redis 容器并连接
docker exec -it redis redis-cli -a 123456

1.5 安装 Nginx

创建挂载目录

Nginx 挂载到服务器的目录:

/work/nginx/conf.d 用于存放配置文件
/work/nginx/html 用于存放网页文件
/work/nginx/logs 用于存放日志
/work/nginx/cert 用于存放 HTTPS 证书

创建 /work/nginx 目录,并在该目录下新建 nginx.conf 文件,避免稍后安装 Nginx 报错。内容如下:

user  nginx;
worker_processes  1;events {worker_connections  1024;
}error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;http {include       /etc/nginx/mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
#    access_log  /var/log/nginx/access.log  main;gzip on;gzip_min_length 1k;     # 设置允许压缩的页面最小字节数gzip_buffers 4 16k;     # 用来存储 gzip 的压缩结果gzip_http_version 1.1;  # 识别 HTTP 协议版本gzip_comp_level 2;      # 设置 gzip 的压缩比 1-9。1 压缩比最小但最快,而 9 相反gzip_types text/plain application/x-javascript text/css application/xml application/javascript; # 指定压缩类型gzip_proxied any;       # 无论后端服务器的 headers 头返回什么信息,都无条件启用压缩include /etc/nginx/conf.d/*.conf; ## 加载该目录下的其它 Nginx 配置文件
}

启动 Nginx

① 执行如下命令,使用 Docker 启动 Nginx 容器。

docker run -d \
--name nginx --restart always \
-p 80:80 -p 443:443 \
-e "TZ=Asia/Shanghai" \
-v ~/work/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v ~/work/nginx/conf.d:/etc/nginx/conf.d \
-v ~/work/nginx/logs:/var/log/nginx \
-v ~/work/nginx/cert:/etc/nginx/cert \
-v ~/work/nginx/html:/usr/share/nginx/html \
--network my-network \
m.daocloud.io/docker.io/nginx:stable

② 执行 docker ps 命令,查看到 Nginx 容器的状态是 UP 的。

2 部署后端服务

第一步,修改配置
后端 dev 开发环境对应的是 application-dev.yaml 配置文件,主要是修改 MySQL 和 Redis 为你的地址。

#  MySQL 直接改成容器名称
url: jdbc:mysql://mysql:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
#  Reids 连接直接改成容器名称

第二步,编译后端
在项目的根目录下,执行 mvn clean package -Dmaven.test.skip=true 命令,编译后端项目,构建出它的 Jar 包。

第三步,上传 Jar 包
创建 /work/projects/demo-server 目录,将 demo-server.jar 上传到该目录下。

第四步,构建镜像
① 在 /work/projects/demo-server 目录下,新建 Dockerfile 文件,用于制作后端项目的 Docker 镜像。编写内容如下:

FROM m.daocloud.io/docker.io/eclipse-temurin:17-jre## 创建目录,并使用它作为工作目录
RUN mkdir -p /demo-server
WORKDIR /demo-server
COPY demo-server.jar app.jarENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom"EXPOSE 48080ENTRYPOINT java ${JAVA_OPTS} -jar app.jar                                

② 执行如下命令,构建名字为 demo-server 的 Docker 镜像。

cd /work/projects/demo-server
docker build -t demo-server .

③ 在 /work/projects/demo-server 目录下,新建 Shell 脚本 deploy.sh,使用 Docker 启动后端项目。编写内容如下:

#!/bin/bash
set -eecho "开始删除 demo-server 容器"
docker stop demo-server || true
docker rm demo-server || true
echo "完成删除 demo-server 容器"echo "开始启动 demo-server 容器"
docker run -d \
--name demo-server \
-p 48080:48080 \
-e "SPRING_PROFILES_ACTIVE=dev" \
-v ~/work/projects/demo-server:/root/logs/ \
--network my-network \
demo-server
echo "正在启动 demo-server 容器中,需要等待 60 秒左右"

第五步,启动后端
执行 sh deploy.sh 命令,使用 Docker 启动后端项目。
执行 docker logs demo-server 命令,查看启动日志。

3 部署前端

第一步,修改配置
前端 dev 开发环境对应的是 .env.dev 配置文件,主要是修改 VITE_BASE_URL 为你的后端项目的访问地址。

请求路径:

VITE_BASE_URL='http://127.0.0.1:48080'

第二步,编译前端
在前端项目的根目录下,执行 npm run build:dev 命令,编译前端项目,构建出它的 dist 文件,里面是 HTML、CSS、JavaScript 等静态文件。

第三步,上传 dist 文件
创建 /work/nginx/html/demo-ui-admin 目录,将 dist 上传到该目录下。

4 配置 Nginx 转发

① 在 /work/nginx/conf.d 目录下,创建 demo-server.conf,内容如下:

server {listen       80;server_name  localhost; ## 重要!!!修改成你的外网 IP/域名location / {root   /usr/share/nginx/html/demo-admin-ui;index  index.html index.htm;try_files $uri $uri/ /index.html;}location /admin-api/ { ## 后端项目 - 管理后台proxy_pass http://demo-server:48080/admin-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IPproxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /app-api/ { ## 后端项目 - 用户 Appproxy_pass http://demo-server:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IPproxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}

友情提示:

[root] 指令在本地文件时,要使用 Nginx Docker 容器内的路径,
即 /usr/share/nginx/html/demo-admin-ui,否则会报 404 的错误。

② 执行 docker exec nginx nginx -s reload 命令,重新加载 Nginx 配置。

友情提示:如果你担心 Nginx 配置不正确,可以执行 docker exec nginx nginx -t 命令。

③ 请求 http://127.0.0.1:80 地址,成功访问前端项目地址。

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

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

相关文章

keil5显示[NO J-link found]解决办法——【J-LINK】驱动下载安装教程

打开电脑的设备管理器,检查通用串行总线控制器 看这里发现没有J-link driver,于是开始安装下驱动。 一、下载 打开J-link下载官网链接: SEGGER - The Embedded Experts - Downloads 点击左下角下载按钮 二、安装 等待下载完成以后双击下载…

Maven的dependencyManagements锁定版本依赖

Pom工程的父项目定义的依赖 <dependencyManagement><dependencies><!--springcloud 2023.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version&g…

基于 Nginx 的 CDN 基础实现

概览 本文是对基于Nginx的CDN网络的学习笔记&#xff0c;阅读的代码为&#xff1a;https://github.com/leandromoreira/cdn-up-and-running 其中&#xff0c;先确定CDN中的一些基础概念&#xff1a; Balancer&#xff1a;负载均衡&#xff0c;即请求数据的流量最开始打到Bal…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

user、assistant、system三大角色在大语言模型中的作用(通俗解释)

1 概述 在大语言模型中&#xff0c;通常涉及到三种角色&#xff1a;用户&#xff08;user&#xff09;、助手&#xff08;assistant&#xff09;和系统&#xff08;system&#xff09;。简单来说&#xff0c;和大模型对话其实是三个人的电影。 2 角色定义 2.1 系统&#xf…

【文献讲解】《Non-local Neural Networks》

一、引言 传统的深度学习方法(如卷积神经网络CNN和循环神经网络RNN)在捕捉长距离依赖关系时存在局限性。CNN主要关注局部邻域的特征,而RNN则依赖于序列的递归计算,无法直接捕捉全局信息。为了解决这一问题,本文提出了一种非局部神经网络(Non-local Neural Networks),通…

BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长&#xff0c;光伏…

经典题型:求数组中逆序对的数量

经典题型&#xff1a;求数组中逆序对的数量 题目思路代码 题目 链接 思路 步骤一&#xff1a;两个指针指向两个有序区间&#xff0c;进行合并操作。 步骤二&#xff1a;1与前面的区间&#xff0c;构成逆序对&#xff0c;个数就是前面区间的个数。 步骤三&#xff1a;前面数组…

安卓逆向(Xposed-Hook)

关于参数问题 &#x1f4cc; 如果方法是这样 public int addNumbers(int a, int b) {return a b; }&#x1f4cc; Hook 代码 XposedHelpers.findAndHookMethod("com.example.app.Calculator",lpparam.classLoader,"addNumbers",int.class, int.class, …

nacos报错9848端口解决方法

近日在部署nacos时一直出现长报错&#xff0c;显示9848端口被占用无法访问&#xff0c;但是通过netstat -ano | findstr 9848查看端口状态却没有输出&#xff0c;表明没有运行在此端口上的程序&#xff0c;同时重新下载不同版本的nacos均出现此问题&#xff0c;排除是nacos的问…

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…

【React】页面刷新后状态丢失的原因与解决方案

在 React 应用中,页面刷新后状态丢失是一个常见的问题。这主要是因为 React 的状态(state)是存储在内存中的,而页面刷新会导致内存被清空,从而导致状态丢失。以下是常见的原因及对应的解决方案。 一、状态丢失的原因 1. React 的状态存储在内存中 React 的状态(通过 us…

kafka消费端之分区分配策略

文章目录 概述分区分配策略RangeAssignor分配策略RoundRobinAssignor分配策略StickyAssignor自定义分区分配策略 总结 概述 我们知道kafka的topic可以被分成多个分区&#xff0c;消费者在集群模式下消费时一个消费组内的每个消费者实例只能消费到一个分区的消息&#xff0c;那…

Flink CDC YAML:面向数据集成的 API 设计

摘要&#xff1a;本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;老师在 Flink Forward Asia 2024 数据集成&#xff08;一&#xff09;专场中的分享。主要分为以下四个方面&#xff1a; Flink CDC YAML API Transform A…

【截图】selenium自动通过浏览器截取指定元素div的图片

【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…

gradio教程

Gradio 是一个开源的 Python 库&#xff0c;专为快速创建和共享机器学习模型和数据科学应用的交互式界面而设计。它简化了将复杂的机器学习模型转换为易于使用的 Web 应用程序的过程&#xff0c;使开发者能够轻松地与他人分享他们的工作成果。 主要特点&#xff1a; 简单易用&…

清理软件——软媒清理大师

随着电脑使用时间的增加&#xff0c;系统垃圾文件也会不断累积&#xff0c;导致C盘空间逐渐变得紧张。今天&#xff0c;我为大家推荐一款专业的清理软件——软媒清理大师&#xff0c;它能够高效地清理电脑中的无用垃圾文件&#xff0c;为您的电脑“减负”。 清理软件——软媒清…

【C++八股】 前置 ++i vs. 后置 i++ 的区别

在 C 中&#xff0c; 运算符有前置 i 和后置 i 两种方式&#xff0c;它们都能让变量自增 1&#xff0c;但在执行顺序、性能、应用场景上有所不同。 1. i vs. i 对比表 2. 代码示例 #include <iostream> int main() {int a 5, b 5;std::cout << "a "…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

PyTorch快速入门

Anaconda Anaconda 是一款面向科学计算的开源 Python 发行版本&#xff0c;它集成了众多科学计算所需的库、工具和环境管理系统&#xff0c;旨在简化包管理和部署&#xff0c;提升开发与研究效率。 核心组件&#xff1a; Conda&#xff1a;这是 Anaconda 自带的包和环境管理…