内网环境使用docker部署微服务系统记录

news2024/11/23 21:18:21

背景

内网环境部署一套微服务应用系统,采用docker方式部署。包括mysql、redis、nginx、nacos、gateway以及应用程序的jar包。下面记录部署的过程和遇到的问题。

一、内网dockcer部署mysql服务

内网生成mysql镜像

  1. 在一个可以连接外网的环境中,下载mysql镜像:
docker pull mysql:5.7
  1. 将镜像打包:
docker save -o mysql.tar mysql:5.7
  1. 将打好的mysql.tar包传到内网服务器中,解压:
docker load -i mysql.tar 

此时,内网环境中就具备了mysql镜像。执行docker images命令可以查看是否有mysql镜像。

mysql容器启动

  1. 在内网宿主机上创建mysql容器的挂载目录,分别为:

创建数据目录:

mkdir /usr/local/mysql/data

创建配置文件目录:

mkdir /usr/local/mysql/conf

创建日志目录:

mkdir /usr/local/mysql/logs

创建配置文件:

cd /usr/local/mysql/conf
touch my.cnf
  1. 启动mysql容器:
docker run -p 3306:3306 --name mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/logs  -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.40

其中,通过-e 参数设置mysql的登录密码。

启动容器后,在/data目录下,就有了数据库的数据文件。

  1. 远程连接数据库,创建数据库。至此,mysql部署完成。

踩坑记录

如果启动docker容器时,查看容器的日志报错:(13: Permission denied)。
查阅资料给出的解决方案是docker启动容器命令增加 --privileged=true 参数,但是并没有效果。经过多次尝试,通过赋予宿主机mysql挂载文件权限接口:

chmod -R 777 /usr/local/mysql/

这样就解决了容器日志报权限不足的问题。在下面的redis容器,nginx容器部署时,也报这个错误,解决方案都是给挂载文件目录赋予权限解决。

二、内网dockcer部署redis服务

与mysql步骤类似,下面记录一下步骤过程:

  1. 外网环境拉取redis镜像:
docker pull redis
  1. 镜像文件打包:
docker save -o redis.tar redis
  1. 将redis.tar复制到内网环境,解压:
docker load -i redis.tar 
  1. 内网宿主机创建挂载目录:
mkdir /usr/local/redis/conf
mkdir /usr/local/redis/data
touch /usr/local/redis/redis.log
chmod 777 redis.log
  1. 配置redis配置文件redis.conf
#bind 127.0.0.1            #注释掉这部分,使redis可以外部访问
requirepass 123456  
logfile /data/redis.log  
protected-mode no  


# 设置 RDB 文件名和文件路径
dbfilename dump.rdb 
dir /data
#----------------------------------------------------------------------(下面的不用修改)
# RDB 默认的设置 ,可以按照如下规则,根据自己的实际请求压力进行设置调整。
# 如果900秒内有1条Key信息发生变化,则进行快照;
save 900 1
#如果300秒内有10条Key信息发生变化,则进行快照;
save 300 10
#如果60秒内有10000条Key信息发生变化,则进行快照。
save 60 10000

# 启动备份文件压缩
rdbcompression yes
#redis 5之后,64位的CRC冗余校验码会放在RDB文件的末尾,以对文件完整性进行验证,但是在保存和加载RDB文件时,会损失10%左右的性能
rdbchecksum yes
# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes

#———————AOF配置文件—————————
# 开启AOF 备份
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的
dir /data

# AOF持久化的文件名,默认是appendonly.aof
appendfilename "appendonly.aof"
# 同步策略
# appendfsync always
appendfsync everysec
# appendfsync no

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 触发设置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof出错如何处理
aof-load-truncated yes

# 文件重写策略
aof-rewrite-incremental-fsync yes

  1. 将redis.conf传到宿主机/usr/local/redis/conf目录下
  2. 启动镜像:
docker run -d --name redis -p 6379:6379 --restart=always -v /usr/local/redis/conf:/usr/local/etc/redis -v /usr/local/redis/data:/data redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

三、内网docker部署nginx服务

  1. 外网环境下载nginx镜像:
docker pull nginx
docker save -o nginx.tar nginx
  1. 将tar包放入内网环境,解压:
docker load -i nginx.tar
  1. 宿主机创建挂载目录:
mkdir /usr/local/nginx/web
  1. 第一次启动nginx容器,目的是复制容器内部nginx相关文件到宿主机:
docker run -d --name nginx -p 3100:80  -v /usr/local/nginx/web:/usr/share/nginx/html nginx
  1. 复制文件到宿主机:
docker cp nginx:/etc/nginx /usr/local/nginx

此时,在/usr/local/nginx/nginx下就有了nginx的相关文件,如下图:
在这里插入图片描述
6. 停止并删除刚刚启动的nginx容器:

docker stop  nginx
docker rm nginx
  1. 修改上图中conf.d/default.conf文件,配置nginx转发信息
server {
    listen       3100;
    server_name  localhost;
    location / {
            root    /usr/share/nginx/html/xxx/portal; #/usr/share/nginx/html对应/usr/local/nginx/web路径,后面填项目路径

          index  index.html index.htm;
          if (!-e $request_filename) {
            rewrite ^(.*)$ /index.html?s=$1 last;
            break;
            }
        }
        
    
    location ^~ /xxx-gateway/{
          proxy_pass              http://xxx.xxx.xxx.xxx:9999/;
          proxy_set_header        X-Real-IP $remote_addr;
          proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

       }

}
  1. 将前端工程放入到web路径下。
  2. 启动nginx容器:
docker run -d --name nginx -p 3100:3100  -v /usr/local/nginx/nginx/:/etc/nginx -v /usr/local/nginx/web:/usr/share/nginx/html nginx

四、java服务jar包镜像制作

nacos、gateway和应用微服务都采用jar包形式部署,这里以nacos为例,记录部署过程,其他服务部署方式步骤一致。

  1. 外网环境下载jdk镜像,打包:
docker pull java:8
docker save -o  java_8.tar java:8
  1. 将java_8.tar传入内网环境,解压:
docker load -i java_8.tar
  1. 制作Dockerfile文件
FROM java:8
MAINTAINER xiaoxiaosu
#VOLUME指定临时文件目录为tmp,在主机/var/lib/docker目录下创建一个临时文件并连接到容器的tmp
#VOLUME /tmp
ADD jeecg-cloud-nacos-3.5.0.jar jeecg-cloud-nacos-3.5.0.jar
#运行jar包
RUN bash -c 'touch jeecg-cloud-nacos-3.5.0.jar'
ENTRYPOINT ["java","-jar","jeecg-cloud-nacos-3.5.0.jar"]
EXPOSE 8848
  1. 将Dockerfile和nacos.jar传入内网服务器,且在一个目录下,生成镜像:
docker build -t nacos .

至此jar包镜像生成。

  1. 启动jar包镜像:
docker run -d --network host -p 8848:8848 --name nacos nacos

注意: --network host参数是为了让容器共用宿主机ip,这样就可以通过宿主机ip访问nacos了。否则无法通过宿主机ip访问nacos。其他jar包程序也是一样。

五、使用docker-compose编排微服务

上述用了mysql、nginx、redis、nacos、gateway和三个业务微服务,一个一个启动容器很费力,因此使用docker-compose编排启动微服务。

踩坑

起初,通过depends_on参数指定各个微服务的启动顺序。发现业务微服务无法注册到nacos上,报错为连接nacos失败,微服务也起不来。

网上搜索资料得知,depends_on是微服务启动成功后,依赖于它的其他微服务就立即启动。而nacos微服务启动成功后,还需等待一段时间,才能让其他微服务去注册。因此会出现注册连接失败的问题。

网上给出的方案是使用wait-for-it脚本进行解决。博主尝试了一下并没有成功,而是用另一种方式进行了解决。

解决方案

写了两个docker-compose.yml文件,一个文件里定义nginx、redis、mysql、nacos这些基础组件。另一个文件里定义gateway和三个业务微服务。先一键启动有nacos的编排,再启动业务微服务编排。
两个docker-compose.yml放在两个文件夹,启动即可。

version: "3"
services:
  nacos:
    image: xxx_nacos
    ports:
      - "8848:8848"
    networks:
      - bonc
    depends_on:
      - mysql
  nginx:
    image: nginx
    ports:
      - "3100:3100"
    volumes:
      - /usr/local/nginx/nginx/:/etc/nginx
      - /usr/local/nginx/web:/usr/share/nginx/html
    networks:
      - bonc


  mysql:
    image: mysql:5.7.40
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /usr/local/mysql/conf:/etc/mysql/conf.d
      - /usr/local/mysql/logs:/logs
      - /usr/local/mysql/data:/var/lib/mysql
    networks:
      - bonc
    environment:
      MYSQL_ROOT_PASSWORD: 123456

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - /usr/local/redis/conf:/usr/local/etc/redis
      - /usr/local/redis/data:/data
    networks:
      - bonc
    command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
networks:
  bonc:
    external: true
version: "3"
services:
  gateway:
    image: xxx_gateway
    ports:
      - "9999:9999"
    networks:
      - bonc
  xxxsystem:
    image: xxx_xxxsystem
    ports:
      - "7001:7001"
    networks:
      - bonc
  xxxsystem:
    image: xxx_system
    ports:
      - "7019:7019"
    networks:
      - bonc
  xxx:
    image: xxx
    ports:
      - "7018:7018"
    networks:
      - bonc
networks:
  bonc:
    external: true

需要注意的是docker-compose需要定义自定义网络,然后在yml里配置networks项。

分别进入两个yml目录下,执行

docker-compose up -d 

参考文章:
内网如何下载docker镜像
docker安装mysql5.7
Nginx 的 Docker 镜像使用教程
Docker安装Redis镜像

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

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

相关文章

数据库压力测试方法小结

一、前言 在前面的压力测试过程中,主要关注的是对接口以及服务器硬件性能进行压力测试,评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说,整个系统的瓶颈在于数据库。 原因很简单:Web应用中的其他因素,…

端口操作指南

知行之桥 EDI 系统中的端口是用于创建数据工作流的功能模块。每个端口可执行以下的一个任务: 使用标准网络协议 (AS2,AS4,FTP,SFTP,OFTP 等)与外部目标之间传输文件与后端系统集成,例如数据库或云端应用程序使用或公开…

抖音seo源码搭建---PHP,vue jquery layui

抖音seo源码,抖音seo矩阵系统源码技术搭建,抖音seo源码技术开发思路梳理搭建 开发思路:抖音seo系统,抖音seo矩阵系统底层框架上支持了ai视频混剪,视频产出,视频AI制作,多账号多平台矩阵&#x…

Python实现Excel文件拷贝图片到另一个的Excel文件(保持原有图片比例)

Python实现Excel文件拷贝图片到另一个的Excel文件(保持原有图片比例) 1、前言1.1 成功拷贝但是比例错误1.2 直接报错 2、解决办法3、号外 1、前言 今天朋友给我一个需求,需要把xlsx文件中的图片拷贝到另一个xlsx中,但是试过网上比…

Git超级详细使用

一、概述 1.1 、git工作流程 命令如下: 1. clone (克隆):从远程仓库中克隆代码到本地仓库 2. checkout(检出) :从本地仓库中检出一个仓库分支然后进行修订add (添加):在提交前先将代码提交到暂存区 3. commit(提交)︰提交到本地仓库。本地仓库中保存修…

“管理Layui树形图,提高页面交互性与可视化效果“

标题:管理Layui树形图,提高页面交互性与可视化效果 Layui树形图简介一、引入Layui和jQuery库:二、HTML结构准备:三、初始化树形图:四、配置树形图的其他属性和事件:4.1 实体类4.2 PermissionDao方法4.3 Per…

【crash】浮点除0堆损坏

摘要:工作中遇到一个crash,其现象真实的crash原因差别比较大,和我自身原本了解的只是冲突,因此在本片文档中简单描述下。关键字:除0、IEEE754 1 前情提要 QA测试过程发现一个比较奇怪的crash,只会在特定机…

python爬虫-获取headers(报文头)关键参数实例小记

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:请求页面,得到响应。建议首次请求时headers内容都带着,调试…

OpenCV入坑第一天:图像的基础操作

我们都知道,OpenCV能够帮助我们处理视频和图像,咱们在图像处理中,除了Pillow库之外,最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python,一起来感受一下OpenCV的魅力吧! 文章目录 读取图像 im…

GAMES101笔记 Lecture11 Geometry 2(Curces and Surfaces)

目录 Explicit Representations in Computer Graphics(计算机图形学中的显式几何表示)Point Cloud(点云)Polygon Mesh(多边形网格)The Wavefront Object File(.obj) Format(OBJ格式文件) Curves(曲线)Bezier Curves(贝塞尔曲线)Defining Cubic Bezier Curve With Tangents(定义…

el-checkbox和el-switch绑定一个Number值

因为我们对状态这种字段,后端一般返回的是Number值。0为正常,1为停用。 el-switch,el-checkbox这种控件呢,一般是绑定布尔值的。原来我的做法是使用value和change事件来做转换,而不是v-model。但是后来发现&#xff0c…

row_number 和 cte 使用实例:按照队列进行数据抵消

row_number 和 cte 使用实例:按照队列进行数据抵消 问题来源模拟数据使用 cte使用sum结合开窗函数结合 row_number 最终实现完整的模拟代码小结问题来源 今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,…

二次元少女-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址: https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置: 模型版本:chilloutmix_NiPrunedFp32Fix.safetensors 采样方法(Sampler)Sampling method:DPM SDE …

Elasticsearch--客户端

Es客户端 语言无关 ​ java最常用的客户端是Java Client、Java Rest Client、Java Transport Client Java Client 从es7.17开始,官方推出Java Client,并且将Java Rest Client标为Deprecated(过期) 要求jdk至少要jdk8 具体用法…

大模型技术发展概述 -(四)

文本内容参考论文《A Survey of Large Language Models》 论文标题:A Survey of Large Language Models 论文链接:https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -(四) 6. 使用方法6.1 上下文学习6.1.1 提示形式6.…

网络套接字编程(三)(HTTP)

gitee仓库:https://gitee.com/WangZihao64/linux/tree/master/CalTcp 一、重谈协议 协议是一种“约定”,这种约定是双方都知道的。有了一致的约定,双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过,协议是双方进行通…

uniapp中H5定位功能实现

1.要实现该功能 必须使用vue-jsonp进行跨域 JSONP是一种跨域数据请求的解决方案,它使用script元素来请求数据,再利用回调函数将数据传回页面。 Vue框架提供了对JSONP的支持,可以方便地在Vue应用中使用JSONP获取跨域数据。下面我们来了解一下…

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的,在每次进行修改操作时,都不会产生新的对象,所以在进行修改的时候,尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

keepalived安装配置详解

文章目录 高可用介绍keepalived安装、使用vip漂移抓包脑裂脑裂有没有危害?如果有危害对业务有什么影响? keepalived架构双vip架构 Healthcheck实现 notifyVRRP选举格式 高可用 介绍 高可用性(High Availability)是指系统或服务能…

Linux的locale本地化配置

Linux的locale本地化配置 locale简介localectl常用操作语言环境键盘布局 常见问题:配置语言环境报错Linux系统locale(UTF-8)报错最小化自动安装的Centos7修改完整中文显示 locale简介 参考: http://m.blog.chinaunix.net/uid-20621049-id-3427444.html locale把按照所涉及到的…