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

背景

内网环境部署一套微服务应用系统,采用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_nacosports:- "8848:8848"networks:- boncdepends_on:- mysqlnginx:image: nginxports:- "3100:3100"volumes:- /usr/local/nginx/nginx/:/etc/nginx- /usr/local/nginx/web:/usr/share/nginx/htmlnetworks:- boncmysql:image: mysql:5.7.40container_name: mysqlports:- "3306:3306"volumes:- /usr/local/mysql/conf:/etc/mysql/conf.d- /usr/local/mysql/logs:/logs- /usr/local/mysql/data:/var/lib/mysqlnetworks:- boncenvironment:MYSQL_ROOT_PASSWORD: 123456redis:image: redisports:- "6379:6379"volumes:- /usr/local/redis/conf:/usr/local/etc/redis- /usr/local/redis/data:/datanetworks:- bonccommand: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
networks:bonc:external: true
version: "3"
services:gateway:image: xxx_gatewayports:- "9999:9999"networks:- boncxxxsystem:image: xxx_xxxsystemports:- "7001:7001"networks:- boncxxxsystem:image: xxx_systemports:- "7019:7019"networks:- boncxxx:image: xxxports:- "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.hqwc.cn/news/22906.html

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

相关文章

基于51单片机的红外测温系统的设计与实现

功能框图 功能描述 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成非接触人体红外测温的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入部分数据,经过内部处理…

PostgreSQL的进程架构和内存架构

文章首发地址 PostgreSQL的进程架构 PostgreSQL的进程架构是由多个进程组成的,每个进程都有不同的作用和职责。下面是PostgreSQL的进程架构的详细说明: 后台进程(Postmaster) 后台进程是PostgreSQL启动时创建的第一个进程,它负责管理和控…

搭建Home Assistant智能家居系统 - 随时随地控制你的家庭设备「内网穿透」

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自cpolar极点云文章&a…

【Linux系统编程】Linux第一个小程序——进度条

文章目录 1. 对回车(\r)和换行(\n)的理解1.1 概念理解1.2 测试 2. 缓冲区的理解2.1 观察现象2.2 原因解释 3. 倒计时小程序4. 进度条小程序4.1 基本思路及实现4.2 改进及优化4.3 增加百分比显示4.4 增加旋转光标4.5 给进度条配色 …

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级(保存数据库历史数据): 升级(不保存数据库历史数据): 降级&…

计网笔记--运输层(vital)

目录 1--运输层概述 2--端口号、复用与分用的概念 3--UDP和TCP的对比 4--TCP的流量控制 5--TCP的拥塞控制 6--TCP超时重传时间的选择 7--TCP可靠传输的实现 8--TCP的连接建立 9--TCP的连接释放 10--TCP报文段的首部格式 1--运输层概述 运输层的任务: 为运…

Yalmip工具箱使用教程(1)-入门学习

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:YALMIP 1.Yalmip工具箱的下载与安装 1.1下载 Yalmip的作者是Johan Lfberg,是由Matlab平台编程实现的一个免费开源数学优化工具箱,在官网上就可以下载。官方下载…

cmake 提前结束处理命令: return

有时候,我们有这样的需求,当处理到某个地方的时候,后面的我们都不想处理或者不需要处理的时候,就可以提前结束当前的处理逻辑,回到父级去处理.在C/C中,我们有break关键字跳出当前循环,continue关键字进入下一次循环,return关键字返回当前处理的函数. cmake也提供了break(),con…

场景图生成——RelTR训练自己的数据集

RelTR训练自己的数据集 省流量省时间版本框的标注关系的标注总的 前言Open Images V6的标注格式RelTR中使用的Open Images V6的数据标注格式具体步骤框的标注生成格式关系三元组的生成格式 结束语参考链接 省流量省时间版本 框的标注 共需要创建4个json标注文件 train.json, …

本地部署 Stable Diffusion XL Gradio Demo WebUI

StableDiffusion XL Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradio De…

洛谷:P5016 龙虎斗 ← NOIP2018 普及组T2

【题目来源】https://www.luogu.com.cn/problem/P5016【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n 个兵营(自左至右编号 1∼n),相邻编号的兵营之间相隔 1 厘米,…

Learning Spatial and Spatio-Temporal Pixel

Learning Deformable Kernels for Image and Video Denoising 作者: Xiangyu Xu 商汤科技SenseTime Research 论文思想:一是将传统的双边滤波算法与CNN结合起来,二是用变形卷积来做多帧对齐的问题,三还是在raw上进行处理的。 …