Linux系统使用docker+docker-compose部署nacos以及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)
- 构建、测试、部署的标准化环境
- 简化流水线配置
- 混合云环境
- 相同的容器可以在本地和云平台运行
- 避免供应商锁定
- 开发环境标准化
- 新成员快速搭建一致的开发环境
- 避免环境配置差异导致的问题
一、使用 openEuler 官方源安装docker
- 安装依赖
sudo yum install -y tar bzip2 make automake gcc gcc-c++ pkgconfig libtool libseccomp-devel libcap-devel libcgroup device-mapper
- 安装 Docker
sudo yum install -y docker
3. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
执行结果
4. 查看docker是否成功运行
sudo systemctl status docker
结果如下图
5. 配置镜像加速器
由于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"
}
- 重启docker(为了使镜像源生效)
sudo systemctl restart docker
- 测试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 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 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: nginxcontainer_name: nginx-containerports:- "8667:8667"volumes:- /data/life_project/nginx/html:/usr/share/nginx/html- /data/life_project/nginx/conf/nginx.conf:/etc/nginx/nginx.confnacos:image: nacos/nacos-server:latestcontainer_name: nacos-containerrestart: alwaysports:- "8848:8848"- "9848:9848"environment:MODE: standalone # 单机模式SPRING_DATASOURCE_PLATFORM: mysqlMYSQL_SERVICE_HOST: 192.168.5.133MYSQL_SERVICE_DB_NAME: nacos_config # 指定Nacos专用库MYSQL_SERVICE_USER: root # 专用账号MYSQL_SERVICE_PASSWORD: 123456MYSQL_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-25Zcontainer_name: minio-containercommand: server /data --console-address ":9001" # 控制台端口9001environment: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
# 执行如下命令,启动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建表, 如图所示
3.docker启动nacos
本文配置的nacos默认是启动鉴权以及持久化数据到数据库的, 鉴权如何开启请移步我的另一篇文章, 链接如下
点击查看: 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
到此使用docker部署springboot项目就完成了 !