【从零开始超详细】OpenEuler系统使用【docker及 docker-compose】部署SpringBoot+vue的cloud项目【nacos+reids+nginx+minio】
OpenEuler系统SpringBoot+vue项目详细方案
本文章Linux发行版为openEuler 22.03 (LTS-SP2), 多数命令与centos一致, 使用centos的小伙伴也可以参考
不知道自己的服务器是什么发行版的小伙伴可以执行如下命令查看:
cat /etc/os-release
执行结果

docker是什么?
给第一次接触docker的小伙伴简单解释一下docker, 使用过docker的小伙伴可以跳过 :
Docker是一个开源的容器化平台,它允许开发者和运维人员将应用程序及其依赖打包成标准化的、可移植的容器。这些容器可以在任何支持Docker的环境中运行,提供了一种轻量级、高效的应用程序部署解决方案。
核心概念解析
- 容器(Container)
容器是Docker的基本运行单元,它是一个轻量级、独立、可执行的软件包,包含:- 应用程序代码
- 运行时环境
- 系统工具
- 系统库
- 配置文件
- 容器与虚拟机不同,它共享主机操作系统的内核,不需要单独的客户操作系统,因此更加轻量高效。
- 镜像(Image)
镜像是容器的静态模板,包含:- 文件系统快照
- 应用程序及其依赖
- 启动命令和其他元数据
Docker的主要优势
- 环境一致性
- "开发环境"与"生产环境"完全一致
- 解决"在我机器上能运行"的问题
- 示例:开发人员可以在本地运行与生产环境相同的MySQL版本
- 快速部署和扩展
- 容器启动速度极快(秒级)
- 便于水平扩展和负载均衡
- 示例:电商网站在促销期间快速扩展Web服务实例
- 资源利用率高
- 比虚拟机更轻量
- 在相同硬件上可运行更多服务
- 示例:一台物理服务器可运行数十个容器
- 隔离性和安全性
- 每个容器有独立的文件系统和网络空间
- 资源限制和配额控制
- 示例:不同的微服务可以在同一主机上隔离运行
应用场景
- 微服务架构
- 每个微服务运行在独立容器中
- 便于独立开发、部署和扩展
- 持续集成/持续部署(CI/CD)
- 构建、测试、部署的标准化环境
- 简化流水线配置
- 混合云环境
- 相同的容器可以在本地和云平台运行
- 避免供应商锁定
- 开发环境标准化
- 新成员快速搭建一致的开发环境
- 避免环境配置差异导致的问题
一、安装docker并配置
1. 安装docker【推荐使用方法二】
方法一: 使用 openEuler 官方源安装docker比较简单, 但是openEuler 官方源docker版本老旧
方法二: 使用华为云镜像源安装最新版 Docker, 因为Docker 20.10.0 版本后自带docker-compose插件无需单独安装
方法一: 使用 openEuler 官方源安装docker
1. 安装依赖
sudo yum install -y tar bzip2 make automake gcc gcc-c++ pkgconfig libtool libseccomp-devel libcap-devel libcgroup device-mapper

2. 安装 Docker
sudo yum install -y docker

3. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
执行结果

4. 查看docker是否成功运行
sudo systemctl status docker
结果如下图

方法二: 使用华为云镜像源安装最新版 Docker(推荐使用该方法 !)
1.更新系统并安装依赖
sudo dnf update -y
执行完成如下图所示

2.添加 Docker CE 仓库
sudo dnf config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 替换为 CentOS 8 的仓库
sudo sed -i 's+\$releasever+8+' /etc/yum.repos.d/docker-ce.repo
执行结果如下所示

3.安装 Docker CE
sudo dnf install -y docker-ce docker-ce-cli containerd.io
执行完成如下图所示

4.启动 Docker 设置开机自启及验证安装
# 启动docker
sudo systemctl start docker
# 设置开机自启动
sudo systemctl enable docker
# 查看docker版本
sudo docker --version
# 查看docker运行状态
systemctl status docker
执行完成如下图所示

至此docker安装完成 !
2. 配置docker
1. 配置镜像加速器
由于docker镜像在国外, 国内下载docker镜像经常会出现下载失败的情况, 所以最好配置docker镜像. 如下是我一直用的docker镜像配置, 直接复制即可!
# 进入docker目录
cd /etc/docker
# 创建daemon.json文件, 此文件用来写docker镜像配置
touch daemon.json
# 编辑文件, 粘贴如下配置文件, 并保存
vi daemon.json
将如下配置粘贴到daemon.json文件中
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://dockerhub.azk8s.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.1panel.live",
"https://atomhub.openatom.cn/",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"data-root": "/home/docker_data",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
2. 重启docker(为了使镜像源生效)
sudo systemctl restart docker
3. 测试docker运行情况
# 拉取镜像
docker pull hello-world:latest
# 运行hello-world镜像
docker run hello-world
如图所示及为成功 !

到此docker安装结束 !
二、docker拉取并查看镜像
1. 拉取镜像
命令如下
# xxx代表镜像名例如redis, yyy代表版本例如4.0.14
docker pull xxx:yyy
如图所示

2. 查看镜像
docker images
如图所示

三、安装 Docker Compose【注意:使用方法二安装docker此步骤可忽略!!!】
注意: 如果单纯使用docker部署不需要安装Docker Compose, 本文以Docker Compose部署服务故而安装Docker Compose
- 下载最新版 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 设置执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 验证安装
docker-compose --version
所有步骤如图所示

至此, Docker Compose安装完成 !
注意: 本文后续部署使用方法一安装的旧版本docker部署, 部署与新版本一致, 但是旧版本部署有网络问题, 新版本不存在这个问题, 如用新版本部署后文的问题请忽略!
四、使用Docker Compose部署服务
1. 配置docker-compose.yml文件
(1) 创建docker-compose.yml文件, 创建的位置最好在你项目同目录的位置创建, 如下图所示, 我本地项目在spingboot文件夹中, 我的yml文件就创建在springboot同目录下

(2) 配置docker-compose.yml文件, 按照如上拉取的镜像来配置yml文件
注: 本文docker-compose.yml文件位置为: /data/life_project
services:
redis:
image: redis:4.0.14 #镜像名
container_name: redis-container # 容器名
ports:
- "6379:6379" # docker容器映射服务器的端口(docker容器端口:服务器端口)
volumes:
- /data/life_project/redis:/data # docker容器映射服务器的文件夹(数据持久化)
command: redis-server --requirepass "123456" # 设置redis密码
# 如下配置基本一致不再赘述, 如有疑问可以留言也可以直接百度
nginx:
image: nginx
container_name: nginx-container
ports:
- "8667:8667"
volumes:
- /data/life_project/nginx/html:/usr/share/nginx/html
- /data/life_project/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
nacos:
image: nacos/nacos-server:latest
container_name: nacos-container
restart: always
ports:
- "8848:8848"
- "9848:9848"
environment:
MODE: standalone # 单机模式
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 192.168.5.133
MYSQL_SERVICE_DB_NAME: nacos_config # 指定Nacos专用库
MYSQL_SERVICE_USER: root # 专用账号
MYSQL_SERVICE_PASSWORD: 123456
MYSQL_SERVICE_DB_PARAM: "useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"
volumes:
- /data/life_project/nacos/data:/home/nacos/data # 数据持久化
- /data/life_project/nacos/logs:/home/nacos/logs # 日志持久化
- /data/life_project/nacos/conf:/home/nacos/conf # 自定义配置
minio:
image: minio/minio:RELEASE.2023-10-25T06-33-25Z
container_name: minio-container
command: server /data --console-address ":9001" # 控制台端口9001
environment:
MINIO_ROOT_USER: minioadmin # 管理账号
MINIO_ROOT_PASSWORD: minioadmin # 管理密码
ports:
- "9000:9000" # API端口
- "9001:9001" # 控制台端口
volumes:
- /data/life_project/minio/minio-data:/data # 数据持久化
restart: unless-stopped
如上配置的yml文件只是项目所用到的工具, 具体的项目jar包和前端包配置请继续往往下看 !
2.部署vue前端项目
注:
- 使用nginx反向代理前端包
- 本文的部署目录为: /data/life_project/
-
按照docker-compose.yml文件所配置的nginx
如图所示, 在部署目录创建:
(1) nginx/conf/nginx.conf文件(映射docker容器中的nginx.conf)
(2) nginx/html(映射docker容器中的html文件夹, 前端文件资源都放到此文件夹中)

配置nginx.conf和html文件夹中文件, 此处自行配置, 不在赘述 -
docker启动nginx
# 旧版本docker执行如下命令,启动nginx
docker-compose up -d nginx
# 新版本docker执行如下命令,启动nginx
docker compose up -d nginx
- 开放端口
此步骤比较重要如果未能开放端口外部服务器请求会被防火墙拦截 导致访问不到该服务
# 开放8667端口
firewall-cmd --zone=public --add-port=8667/tcp --permanent
# 重启防火墙
firewall-cmd --reload

4. 验证启动成功
可以使用curl命令来测试, 也可以直接浏览器输入地址加端口看是否能出现页面, 此处使用命令测试
curl http://192.168.9.224:8667/
如下图即为成功(其他局域网服务器验证方法同理)

3.docker部署nacos
1.按照docker-compose.yml文件中配置nacos

2.nacos数据库准备
去数据库创建nacos_config数据库, 然后容器启动成功后找到 mysql-schema.sql文件: 文件目录位置如下nacos/conf/ , 去数据库执行sql!
按理来说nacos会自动创建数据库表, 但是博主安装的时候并未自动创建 !
nacos建表, 如图所示

3.docker启动nacos
本文配置的nacos默认是启动鉴权以及持久化数据到数据库的, 鉴权如何开启请移步我的另一篇文章, 链接如下
# 启动命令,注意新版本docker使用docker compose up -d nacos
docker-compose up -d nacos
# 使用docker ps命令查看nacos是否启动成功
docker ps
启动后发现nacos状态一直处于重启中

查看nacos启动日志
# 116代表container_id(docker ps命令会返回), 不需要全拼用前几个符号就可以了
docker logs 116
看到如下报错(这是我遇到的错误, 如果没遇到可以跳过)

此时nacos配置文件是默认的, 我们并没有设置nacos配置文件, 该问题就是因为配置文件的问题, 我们需要在application.properties文件nacos进行一下设置
到nacos/conf目录下, 找到application.properties文件, 文件内容可以参考官方或者网上搜一下, 如果太懒, 下面我也给出来可以直接复制再改一下即可
application.properties
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://填自己的数据库ip地址:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=填自己的数据库账号
db.password.0=填自己的数据库密码
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
spring.security.enabled=true
nacos.core.auth.enabled=true
# nacos账号(想改可以改, 我这边默认用naocs)
nacos.core.auth.username=nacos
# nacos密码(想改可以改, 我这边默认用naocs)
nacos.core.auth.password=nacos
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:nacos}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:nacos}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true
再次用docker启动nacos
docker-compose start nacos
nacos正常启动 !

4.启动完成后又发现新问题
注: 以下内容是我本次部署遇到的问题, 小伙伴们没遇到话可以跳过
查看docker服务命令
docker ps
发现nacos一直在重启, 其实也就是nacos启动失败
查看nacos日志
# -f代表实时监控, --tail 100 代表看尾部100行数据, ca代表容器id前两个字符其实就是代表容器id
docker logs -f --tail 100 ca
错误日志如下, 按照报错提示, 发现是nacos连不上数据库

此时基本上有两种可能:
- nacos连接mysql的配置写错了, 去application.properties中查看nacos配置, 确认无误 !
- 网络不可达, 访问不到mysql服务器
这个有点坑, 通过ping命令发现两台服务器都是网络互通的, 此时我怀疑是不是nacos的配置有问题, 然而正好相反, 最后排查完确实是网络问题, 虽然两台服务器网络互通, 但是docker容器与mysql服务器网络不通, 具体排查过程不再详述, 直接给出解决办法
修改docker配置文件, 上文在修改docker镜像源的时候有修改过这个文件
# 编辑daemon.json
vi /etc/docker/daemon.json
# 添加如下配置
"iptables": true,
"ip-forward": true
# 重启docker
systemctl restart docker
如图所示添加配置

再次启动nacos, 成功 !
登录nacos成功 !

3.docker部署springboot项目
1.配置docker-compose.ym文件
在yml文件中添加springboot项目配置,
base-info:
image: base-info #镜像名
container_name: base-info #容器名
ports:
- "29924:29924" # 映射端口
environment:
- TZ=Asia/Shanghai # 把docker容器时间改为上海时间
volumes:
- /data/life_project/springboot/base-info/logs:/app/logs # 映射日志目录
- /data/life_project/springboot/base-info/config:/app/ # 映射jar包以及配置文件目录
注意:以后构建镜像会按照此配置来构建, 请重点关注yml的配置 !
2.配置Dockerfile文件
把jar包和bootstrap.yml文件拷贝过来, bootstrap.yml文件配置此文不详述
# 创建Dockerfile文件
touch Dockerfile

# 编辑Dockerfile文件
vi Dockerfile
把如下内容拷贝到Dockerfile文件中, 请按照您所启动的jar名称和端口修改如下文件
FROM openjdk:8u262 #设置基础镜像为jdk
# 设置工作目录
WORKDIR /app
# 创建日志目录并设置权限(推荐使用具体用户而非777)
RUN mkdir -p /app/logs && \
chown -R 1000:1000 /app/logs && \
chmod -R 755 /app/logs
# 复制JAR文件(使用明确的目标文件名)
COPY ./base-info-1.0-SNAPSHOT.jar /app/base-info-1.0-SNAPSHOT.jar
COPY ./bootstrap.yml /app/bootstrap.yml
# 声明环境变量(统一管理配置)
ENV JAVA_OPTS="\
-Dfile.encoding=utf-8 \
-Dspring.cloud.compatibility-verifier.enabled=false \
-Xms1024M \
-Xmx2048M \
-Xmn512M \
-XX:MaxMetaspaceSize=512M \
-XX:MetaspaceSize=512M"
# 声明暴露端口
EXPOSE 29924
# 使用数组格式的ENTRYPOINT
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/base-info-1.0-SNAPSHOT.jar"]
3.构建springboot项目镜像
完成步骤二后, 开始构建镜像
# base-info为docker-compose.yml中已经规定好的image, 要对应起来
docker build -t base-info . # 注意后面有个 .
构建结果如图所示

4.构建完成后启动项目
# 使用docker-compose命令启动项目
docker-compose up-d base-info
启动成功 !

其他服务部署参考base-info即可, 步骤全部一致 !
5.再次发现新问题
(1) 出现问题
部署完成后测试发现, 单个服务访问接口是没问题的, 但是本项目为微服务cloud项目, 需要网关服务来访问其他服务, 此时报错: No route to host (Host unreachable), 具体请看下图所示

本报错是发生于网关服务调用其他服务出现的错误, No route to host (Host unreachable), 172.19.0.9这个ip是docker中内网ip, 部署完成后docker会给每个服务都分配一个这种内网ip, 且内网ip处于同一个网段内, 如上是很明显的网络错误 ! 而且是docker的内部的网络错误
怀疑的原因: 以前我也部署过类似的项目, 其实并没有出现这种问题, 到这里基本上就没有问题了, 我猜测可能是docker版本的问题, 因为openEuler 22.03 (LTS-SP2), 官方docker镜像源版本是18, 我以前用的docker版本都是26, 而且26版本不需要单独安装docker-compose, 自带插件, 而且没有出现网络问题!
(2)解决办法
我尝试了很多种解决办法, 都没有解决, 最后迫不得已使用终极解决办法: 就是让docker和服务器使用同一个网络
修改配置如下, 在每个docker-compose.yml文件下的服务添加
network_mode: host
如下图所示

再次启动后, docker网络通信问题就解决了, 但是每个服务都用的是服务器的ip, 可以去nacos中验证, 如下图

其实并不推荐使用这种方式, 因为可能会导致与服务器存在冲突, 最好还是使用docker自己分配的网络, 如果大佬有什么好办法, 请指点 !
到此使用docker部署springboot项目就完成了 !
更多推荐
所有评论(0)