-
【案例共创】ESC基于RAGFlow和DeepSeek构建本地问答知识库一、案例介绍在人工智能技术飞速发展的当下,企业知识库智能化正成为提升运营效率的核心路径。DeepSeek 几乎家喻户晓,而 RAGFlow 是一个基于深入文档理解的开源RAG(检索增强生成)引擎。当与LLMs集成时,它能够提供真实的问题回答功能,并由来自各种复杂格式数据的有理有据的引用支持。本次我们基于ESC使用 Docker 部署RAGFlow,并使用 ollama 部署 DeepSeek R1 模型和 bge-m3 嵌入模型,体验 RAGFlow 的知识库、对话、Agent等功能,通过RAGFlow的智能文档解析与DeepSeek大语言模型的精准推理能力,构建具备多源异构数据处理、语义深度理解及动态知识更新特征的问答知识库、Agent。二、案例用时本案例总时长预计120分钟。三、案例流程 说明:通过ECS中安装dokcer部署ragflow通过ECS中docker部署ollama来运行deepseek通过配置ragflow来调用deepseek-r1模型能力用过通过公网ip访问ECS从而体验ragflow+deepseek四、资源总览云资源消耗/时时长ECS(含公网IP、磁盘等)0.9885120min合计:1.977元五、实践步骤0. 购买ECS配置如下:bash计费模式: 按需计费区域: 西南-贵阳一可用区: 随机分配CPU架构:x86计算实例规格:通用计算增强型 | x1e.4u.16g | 4vCPUs | 16GiB镜像: 公共镜像-Ubuntu 24.04 server 64bit(10GiB)磁盘: 通用型SSD 50G弹性公网IP:现在购买-全动态BGP-按带宽计算-5Mbit/s-随实例释放云服务器名称:ecs-ragflow密码:RagFlow@123使用时长:设定删除时间为 8 小时之后购买数量: 1清单链接:https://www.huaweicloud.com/pricing/calculator.html?shareListId=267c3c60fc6411efa933bd915e6892f51、安装 RAGFlow1.1 安装 Docker CE 和 Docker Compose打开终端,新建 install-docker.sh:bash# 查看系统uname -alsb_release -a# 准备安装 dockercd ~pwdmkdir RAGFlowcd RAGFlowvi install-docker.sh写入以下脚本到 install-docker.shbash#!/bin/bash# 定义日志文件路径LOGFILE="/var/docker-install.log"# 将标准输出和错误输出重定向到日志文件,同时显示到终端exec > >(tee -a "$LOGFILE") 2>&1# 设置DEBUG模式下的时间戳输出格式trap '{ set +x; } 2>/dev/null; echo -n "[$(date -Is)] "; set -x' DEBUG# 下载并安装 docker CE 和 docker composeecho "开始安装 Docker CE 和 Docker Compose..."# 添加Docker官方GPG密钥curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -echo "已添加 Docker GPG 密钥"# 添加Docker软件源echo "" | sudo add-apt-repository "deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"echo "已添加 Docker 软件源"# 更新软件包列表echo "正在更新软件包列表..."echo "y" | sudo apt-get update# 安装Docker CE和Docker Composeecho "正在安装 Docker CE 和 Docker Compose..."echo "y" | sudo apt-get install docker-ce docker-composeecho "Docker 安装完成"# 配置docker镜像仓库为华为云镜像echo "正在配置华为云镜像源..."sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.json# 重启docker服务使配置生效echo "正在重启 Docker 服务..."sudo systemctl restart dockerecho "Docker 配置完成"接着运行 docker 安装脚本:bashsudo bash ./install-docker.sh我们查看版本发现 docker-compse 版本有点低,可能会影响后续的安装,因此尝试升级 docker-composebashdocker -vdocker-compse -v升级 docker-compose:bash# 先看看 docker-compose 的路径whereis docker-compose# 备份一下sudo mv /usr/bin/docker-compose /usr/bin/docker-compose.bak# 下载对应系统的 docker-composewget https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 如果速度慢可以尝试使用加速源,如 https://hub.gitmirror.com/、https://github.moeyy.xyz/、https://ghfast.top/# wget https://hub.gitmirror.com/https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 也可以自行去 github 下载: https://github.com/docker/compose/releases# 替换 docker-composesudo cp ./docker-compose /usr/bin/docker-compose# 加权限sudo chmod +x /usr/bin/docker-compose# 验证docker-compose -v1.2 安装 RAGFlow先设置一下最大虚拟内存。vm.max_map_count该值设置进程可能拥有的内存映射区域的最大数量。它的默认值是65530。虽然大多数应用程序需要的映射少于一千个,但减小此值可能会导致异常行为,并且当进程达到限制时,系统将抛出内存不足错误。RAGFlow v0.17.0使用Elasticsearch或Infinity进行多次调用。正确设置vm.max_map_count的值对于Elasticsearch组件的正常运行至关重要。bash# 检查vm.max_map_count的值sysctl vm.max_map_count# 如果小于 262144 则至少设置为 262144sudo sysctl -w vm.max_map_count=262144接着安装 RAGFlowbash# 下载源码git clone https://github.com/infiniflow/ragflow.git# 如果下载比较慢请尝试使用镜像加速,如:# git clone https://ghfast.top/https://github.com/infiniflow/ragflow.gitcd ragflow/docker# 切换最新稳定分支 (截止 20205-03-08 为 0.17.0)git checkout -f v0.17.0git branch我们可以修改 .env 启用全量版本(非必须,可无须修改直接使用 slim 版本),并设置 docker 镜像源:bashsudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonRAGFlow镜像标签镜像大小(GB)是否包含嵌入模型和Python包是否稳定v0.17.0≈9✔️稳定版本v0.17.0-slim≈2❌稳定版本nightly≈9✔️nightly 构建不稳定nightly-slim≈2❌nightly 构建不稳定接着通过 docker-compose 启动 RAGFlow,全量的镜像约 9G,安装稍微慢些,需要耐心等待大约10分钟bash# 拉取镜像并启动(默认不包含 embedding 模型, 可以修改 .env 配置,选为华为云镜像v0.17.0 )# vi .env 找到对应位置进行修改docker-compose -f docker-compose.yml up -d# 如果minio拉取不顺,请尝试切换镜像源,需修改 docker-compose-base.yml 的:quay.io 为 quay.m.daocloud.io# 查看日志docker-compose logs -f ragflow-server# 查看端口情况netstat -nptl2. 访问本地 RAGFlow并配置模型RAGFlow是一个RAG引擎,需要与大模型服务一起搭配使用,实现本地、无幻觉的问答功能。RAGFlow支持大多数主流LLMs。2.1 访问本地RAGFlow 并注册账号登录如本次案例中 ecs-ragflow 的 ip 为1.95.184.111 则访问: http://1.95.184.111/login ,注册账号即可使用 RAGFlow。登录之后的主界面如下:⚠️本地模型为选配,同样可以使用其他大模型API服务,比如 Mass、硅基流动等2.2 通过 Docker 安装 ollama首先我们设置docker镜像源,重启docker之后,通过docker拉取ollama镜像并运行bash# 设置 docker 镜像源sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonsudo systemctl restart dockersudo docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama2.3 安装 DeepSeek-R1 模型和 bge-m3 鉴于网络下载速度比较慢,我们拉取相对较小的 deepseek-r1:1.5b 和嵌入模型 bge-m3 (预计25分钟,具体看网络状况)bash# 拉取 deepseek-r1:1.5bsudo docker exec ollama ollama pull deepseek-r1:1.5b# 拉取 bge-m3sudo docker exec ollama ollama pull bge-m32.4 配置模型虽然RAGFlow和Ollama都是跑在同一台机器上,但由于分别使用了docker-compose和docker来部署,可能会导致网络不通的情况,那我们可以通过暴露 11434 ollama的端口来提高大模型服务。于是,我们在模型提供商选择Ollam之后分别配置了嵌入模型 bge-m3 和聊天模型deepseek-r1:1.5b。接着并在设置--系统模型设置中配置好聊天模型和嵌入模型。3. 简单使用接下来,我们简单体验一下RAGFlow 提供的功能,分别是知识库、聊天、搜索、Agent。3.1 知识库功能体验点击知识库,我们创建了一个名为ModelArts助手的知识库,传入了几个pdf文件作为本地知识库。在RAGFlow中知识库被称为数据集,我们可以上次多个文件作为数据集,并通过不通的解析方法将文档进行处理如切片、Q/A等。解析成功的文档可以在后续功能中作为知识库引入。3.2 聊天功能体验我们创建了ModelArts助手的助理,可以对助理进行配置如基本信息、关键词分析、模型参数设置等,并选取知识库作为回答语料。我们一个“如何快速入门”的简单问题开始,AI助理根据挂载的知识给了相关的回答。3.3 搜索功能体验在RAGFlow中,还有搜索功能,类似于传统的搜索引擎给出结果并添加了智能回答和思维导图。3.4 Agent功能体验最后我们来体验Agent功能,这里我们使用的是预置的 text2sql。Agent 会提供一个工作流编排界面,并提供运行测试功能,我们发现Agent也是可以作为单独的页面嵌入到其他网站,简单地要Agent给出“用户转化率”,它基于 deepseek-r1 模型,因此也有思考能力,最终它生成了一段完整的 SQL 语句。至此,案例实践就结束了,记得释放资源哦!记得释放资源哦!记得释放资源哦!我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0
-
1.Docker应用部署(Mysql、tomcat、Redis、redis)https://bbs.huaweicloud.com/forum/thread-0251176000289103057-1-1.html 2. 鸿蒙NEXT开发案例:随机数生成https://bbs.huaweicloud.com/forum/thread-0226175856046738051-1-1.html3.ExaGear for Server on Ubuntuhttps://bbs.huaweicloud.com/forum/thread-02127175583262901024-1-1.html4.惊叹数据结构之美,品味排序算法之妙:对快排的详细介绍 -转载https://bbs.huaweicloud.com/forum/thread-0210175572143077031-1-1.html5.修改 Docker 容器的 http_proxy 和 https_proxy -转载https://bbs.huaweicloud.com/forum/thread-02127175572007355023-1-1.html6.【Linux】gdb_进程概念-转载https://bbs.huaweicloud.com/forum/thread-0257175571963347026-1-1.html7.详解Redis之事务-转载https://bbs.huaweicloud.com/forum/thread-0251175571892832022-1-1.html8.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html9.鸿蒙NEXT开发案例:颜文字搜索器https://bbs.huaweicloud.com/forum/thread-0225175848016900053-1-1.html10.鸿蒙NEXT开发案例:经纬度距离计算https://bbs.huaweicloud.com/forum/thread-02127175847897096052-1-1.html11.鸿蒙NEXT开发案例:世界时间表https://bbs.huaweicloud.com/forum/thread-0220175848120824046-1-1.html12.鸿蒙NEXT开发案例:保质期计算https://bbs.huaweicloud.com/forum/thread-0257175848211239048-1-1.html13.鸿蒙NEXT开发案例:九宫格随机https://bbs.huaweicloud.com/forum/thread-0257175848540835049-1-1.html14.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html15.【MySQL】 表的操作-转载https://bbs.huaweicloud.com/forum/thread-0220174982575490008-1-1.html
-
Docker 是一种开源的容器化技术,它可以帮助开发人员和运维人员以更高效、更轻松的方式管理应用程序和服务。通过容器技术,我们可以将应用与其所有的依赖包一起打包,使得应用可以在任何环境中快速、可靠地运行。本文将展示如何在 Docker 容器中部署 MySQL、Tomcat 和 Redis 服务,帮助你快速构建一个多服务的应用环境。1. 准备工作在开始 Docker 部署之前,请确保已经安装了 Docker。可以通过以下命令检查 Docker 是否安装成功:bashCopy Codedocker --version如果没有安装 Docker,可以参考官方文档进行安装:Docker 官方安装文档2. 部署 MySQL 服务2.1. 拉取 MySQL 镜像首先,我们需要拉取 MySQL 镜像。使用 Docker Hub 提供的官方 MySQL 镜像:bashCopy Codedocker pull mysql:latest2.2. 启动 MySQL 容器接下来,通过以下命令启动一个 MySQL 容器:bashCopy Codedocker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -d mysql:latest--name mysql-container:指定容器名称为 mysql-container。-e MYSQL_ROOT_PASSWORD=root:设置 MySQL 的 root 用户密码为 root。-d:以后台模式运行容器。mysql:latest:使用 mysql 的最新版本镜像。2.3. 连接到 MySQL 容器要进入 MySQL 容器,可以使用以下命令:bashCopy Codedocker exec -it mysql-container mysql -uroot -p输入密码 root 即可进入 MySQL 命令行。2.4. 设置数据库在 MySQL 中创建一个数据库和一个用户(可选):sqlCopy CodeCREATE DATABASE mydb; CREATE USER 'myuser'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%'; FLUSH PRIVILEGES;3. 部署 Tomcat 服务3.1. 拉取 Tomcat 镜像我们可以使用官方的 Tomcat 镜像:bashCopy Codedocker pull tomcat:latest3.2. 启动 Tomcat 容器启动 Tomcat 容器,指定要暴露的端口:bashCopy Codedocker run --name tomcat-container -d -p 8080:8080 tomcat:latest--name tomcat-container:指定容器名称为 tomcat-container。-d:后台运行容器。-p 8080:8080:将容器内的 8080 端口映射到主机的 8080 端口。Tomcat 启动后,可以通过浏览器访问 http://localhost:8080 来查看 Tomcat 默认的欢迎页面。3.3. 部署 Web 应用将自己的 WAR 文件部署到 Tomcat 中的 webapps 目录中,方法如下:bashCopy Codedocker cp your-app.war tomcat-container:/usr/local/tomcat/webapps/将 your-app.war 替换为你自己的应用包。重新启动 Tomcat 容器以加载新部署的应用:bashCopy Codedocker restart tomcat-container此时,你的应用可以通过 http://localhost:8080/your-app 来访问。4. 部署 Redis 服务4.1. 拉取 Redis 镜像我们可以使用官方的 Redis 镜像:bashCopy Codedocker pull redis:latest4.2. 启动 Redis 容器启动 Redis 容器并将端口映射到主机:bashCopy Codedocker run --name redis-container -d -p 6379:6379 redis:latest--name redis-container:指定容器名称为 redis-container。-d:后台运行容器。-p 6379:6379:将容器内的 6379 端口映射到主机的 6379 端口。4.3. 连接到 Redis 容器要连接到 Redis 容器,可以使用以下命令:bashCopy Codedocker exec -it redis-container redis-cli5. 测试应用是否正常运行测试 MySQL:可以通过以下命令测试 MySQL 服务是否正常运行:bashCopy Codedocker exec -it mysql-container mysql -uroot -p -e "SHOW DATABASES;" 这会列出当前 MySQL 实例中的所有数据库。测试 Tomcat:通过访问 http://localhost:8080,可以检查 Tomcat 是否成功启动。测试 Redis:可以通过以下命令测试 Redis 是否正常运行:bashCopy Codedocker exec -it redis-container redis-cli ping如果返回 PONG,则表示 Redis 正常运行。6. 总结通过 Docker 容器化技术,我们能够轻松地部署 MySQL、Tomcat 和 Redis 服务。Docker 提供了简单的命令来启动、配置和管理这些服务,使得开发和部署过程更加高效和便捷。通过容器化的方式,你可以确保应用在任何环境中都能保持一致性和可移植性。这种方法对于开发、测试以及生产环境的部署都非常有用,并且可以通过 Docker Compose 进一步简化多个服务的管理。希望这篇文章能帮助你更好地理解如何使用 Docker 部署和管理 MySQL、Tomcat 和 Redis 服务。
-
修改 Docker 容器的 http_proxy 和 https_proxy 可以通过几种方式实现。以下是一些常用的方法:在运行容器时设置环境变量:当你启动一个新的容器时,可以使用 -e 选项设置这些环境变量:docker run -e HTTP_PROXY=http://proxy.example.com:8080 -e HTTPS_PROXY=http://proxy.example.com:8080 your_image1对于已经运行的容器:a. 使用 docker exec 命令:docker exec -it your_container_name /bin/bashexport HTTP_PROXY=http://proxy.example.com:8080export HTTPS_PROXY=http://proxy.example.com:8080123注意,这种方法只在当前会话中有效,容器重启后就会失效。b. 修改容器的 /etc/environment 文件:docker exec -it your_container_name /bin/bashecho "HTTP_PROXY=http://proxy.example.com:8080" >> /etc/environmentecho "HTTPS_PROXY=http://proxy.example.com:8080" >> /etc/environment123这种方法在容器重启后仍然有效。在 Dockerfile 中设置:如果你正在构建自己的镜像,可以在 Dockerfile 中设置这些环境变量:ENV HTTP_PROXY http://proxy.example.com:8080ENV HTTPS_PROXY http://proxy.example.com:808012使用 Docker Compose:如果你使用 Docker Compose,可以在 docker-compose.yml 文件中设置环境变量:version: '3'services: your_service: image: your_image environment: - HTTP_PROXY=http://proxy.example.com:8080 - HTTPS_PROXY=http://proxy.example.com:8080修改 Docker 守护进程的配置:你可以为 Docker 守护进程设置全局代理,这会影响所有容器。编辑 /etc/systemd/system/docker.service.d/http-proxy.conf 文件(如果不存在就创建它):[Service]Environment="HTTP_PROXY=http://proxy.example.com:8080"Environment="HTTPS_PROXY=http://proxy.example.com:8080"123然后重启 Docker 服务:sudo systemctl daemon-reloadsudo systemctl restart docker12注意事项:确保使用正确的代理地址和端口。某些应用程序可能使用小写的环境变量名(http_proxy, https_proxy),你可能需要同时设置大写和小写版本。如果你的代理需要认证,格式应该是:http://username:password@proxy.example.com:8080———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/jsyzliuyu/article/details/142873507
-
entrypoint.sh 文件通常用于 Docker 容器中,作为容器启动时执行的默认脚本。这个文件定义了容器启动时需要执行的一系列命令或操作。通过自定义 entrypoint.sh,开发者可以控制容器如何初始化、启动应用程序、设置环境变量等。下面是一些关于 entrypoint.sh 的关键点和用法示例:关键点启动应用程序:entrypoint.sh 中通常会包含启动容器中主要应用程序的命令。环境配置:可以在脚本中设置环境变量,确保应用程序在正确的环境中运行。权限管理:根据需要,脚本中可能包含更改文件或目录权限的命令。前置/后置操作:在启动应用程序之前或之后,可以执行一些前置或后置操作,比如数据库迁移、静态资源编译等。错误处理:添加错误处理逻辑,确保在出现问题时能够正确记录日志或进行其他处理。示例以下是一个简单的 entrypoint.sh 示例,它展示了如何设置环境变量、执行一个前置操作(如数据库迁移),然后启动应用程序:#!/bin/sh # 设置环境变量 export DATABASE_URL="postgres://user:password@db/dbname" # 前置操作:数据库迁移 echo "Running database migrations..." ./manage.py migrate # 启动应用程序 echo "Starting application..." exec gunicorn myapp.wsgi:application --bind 0.0.0.0:8000使用方法创建 entrypoint.sh 文件:在你的项目根目录或 Docker 上下文中创建一个名为 entrypoint.sh 的文件,并将上述脚本内容粘贴进去。修改权限:确保 entrypoint.sh 文件具有可执行权限。你可以使用 chmod +x entrypoint.sh 命令来设置。在 Dockerfile 中引用:在你的 Dockerfile 中,使用 COPY 命令将 entrypoint.sh 文件复制到镜像中,并使用 ENTRYPOINT 指令指定它为容器启动时执行的命令。例如:# ... 其他 Dockerfile 指令 ... COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 构建和运行容器:使用 docker build 命令构建镜像,然后使用 docker run 命令启动容器。此时,容器将按照 entrypoint.sh 中定义的逻辑启动和运行。通过自定义 entrypoint.sh,你可以灵活控制 Docker 容器的启动过程,确保应用程序在最佳状态下运行。
-
开发者空间的ubuntu系统如何安装docker?试了好几种网上的方案,都报错
-
使用Docker部署postgresqlpostgresql数据库在Docker中的镜像的名称为postgres,可以从DockerHub中pull下来,如果pull不下来那么很大概率是网络问题导致的,这时候你可能需要在网上找一些能用的镜像源,以成功拉取postgres镜像。有了postgres的镜像之后,你就可以在本地的Docker创建一个postgres的容器并运行。我们有两种方式来创建容器:直接使用命令行来创建postgres的容器并运行;使用docker-compose来创建postgres的容器并运行;这里先介绍使用命令行的方式来创建postgres容器的方式:docker run -d \--name postgres-exprdb \-p 5432:5432 \-e POSTGRES_PASSWORD=123456 \-e POSTGRES_USER=aderversa \-e POSTGRES_DB=testdb \-v ~/postgresql/data:/var/lib/postgresql/data \postgres12345678-e是用来设置postgres容器中环境变量的值的,有些特殊的环境变量将会影响到启动后的postgresql的一些参数,比如postgresql数据库的密码、用户等等。具体一些环境变量的含义可以查看dockerhub中有关于环境变量的介绍,本文的最后也会介绍一些环境变量的含义。-p将PostgreSQL的5432端口暴露到宿主机的5432端口,方便我们在外部访问容器内的PostgreSQL服务。-v将容器内的/var/lib/postgresql/data文件夹挂载到宿主机的~/postgresql/data文件夹下,这样数据库中的数据就不会因为我们删除了容器而丢失。你需要自己定义好这个数据文件夹该挂载到自己主机的什么地方上,这里我给出的值仅做参考。--name postgres-exprdb指定创建的PostgreSQL容器的名字。-d表示该容器在后台运行,并打印创建容器的ID到控制台。postgres是我们所使用的镜像。运行上述命令,使用docker ps查看容器状态:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb1f5d4521cd0 postgres "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:5432->5432/tcp postgres-exprdb12可以看见,容器已经在后台运行了。之后,我们可以使用别的什么工具去访问已经创建好的testdb数据库,用定义好的特权用户aderversa,以及指定好的密码123456。IP已知,端口已知,用户名和密码都有了,那么你就可以用你能想象到的方式去连接这个PostgreSQL数据库啦。使用docker-compose来部署相比于在命令行中写冗长的命令,我更喜欢将容器的配置写到docker-compose.yaml文件中,然后一行:docker compose -f docker-compose.yaml -p package_name up -d1-f指定要要操作的文件。-p指定项目的名称。up是创建并启动容器的命令。-d表示容器在后台启动。比如,我编写了一个docker-compose.yaml文件:version: "3.8"services: database_expr: image: postgres:latest container_name: postgres-expr restart: on-failure:3 ports: - 5432:5432 volumes: - ./db:/var/lib/postgresql/data healthcheck: test: [ "CMD", "pg_isready" ] interval: 10s timeout: 5s retries: 5 environment: - POSTGRES_PASSWORD=123456 - POSTGRES_USER=aderversa - POSTGRES_DB=testdb1234567891011121314151617181920直接对其进行操作就可以创建好容器并启动,用户不需要关心里面有什么配置。甚至如果你觉得使用docker compose的命令行来启动不够抽象,那么你可以将它编写入shell脚本中,用户直接运行脚本,只要用户安装了Docker环境,就可以安装PostgreSQL成功,他甚至不需要关心Docker命令应该如何使用。进入postgres容器中执行SQL使用命令:docker ps1查找出刚才创建的PostgreSQL容器的ID:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdcf5e3c0ff7f postgres:latest "docker-entrypoint.s…" 13 hours ago Up 13 hours (healthy) 0.0.0.0:5432->5432/tcp postgres-expr12获得container_id = dcf5e3c0ff7f,接着我们使用以下命令进入容器的bash中,方便在操作容器:docker exec -it dcf5e3c0ff7f /bin/bash1注意,如果是在Windows下执行这条命令的时候,使用Git Bash来执行可能会因为终端的一些问题执行失败,此时需要更换一下执行命令的终端,比如:PowerShell。进入到容器中是这个样子的:> docker exec -it dcf5e3c0ff7f /bin/bashroot@dcf5e3c0ff7f:/# 12第一行是在PowerShell中执行的,而第二行则是PostgreSQL容器中运行的bash进程。接着我们就可以使用:psql [OPTION]... [DBNAME [USERNAME]]1这里介绍连接数据库需要使用的OPTION选项,具体的你可以使用psql --help来查看:-h指定PostgreSQL数据库的IP地址。-p指定PostgreSQL数据库的端口号。-U指定登录到数据库的用户名,不指定默认就是root。-w从不提示输入密码,字面意思,不需要输入密码来进行访问数据库,默认是不需要输入密码的。-W强制密码输入。按照这个用法,我们可以用以下两种方式连接数据库:# 这里由于我们在创建容器的时候指定的特权用户是aderversa,因此root被挤占掉了# 用户名对于我这里来说是必须设置的。psql -p 127.0.0.1 -p 5432 -U aderversa testdb 123或者省事一点,直接使用:psql testdb aderversa1执行成功后我们就能够进入psql的命令行:psql (17.2 (Debian 17.2-1.pgdg120+1))Type "help" for help.testdb=#1234psql的使用这里我们并不知道如何使用这个命令行,它提示我们可以使用help来获得帮助,那么就执行一波help,得到了以下信息:You are using psql, the command-line interface to PostgreSQL.Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit123456这里它告诉我们:\copyright,可以PostgreSQL DDMS的一些条款,里面大概是说:不管你出于何种目的,该软件和其文档都是允许你使用、复制、修改和发布的,并且是不需要任何费用,不需要修改的同意…看起来是非常宽松的声明,毕竟PostgreSQL遵循的是BSD协议。\h显示SQL命令,比如CREATE TABLE ALTER TABLE…。\?显示psql的命令,这里面还是非常多命令的,大多都是用来查看数据库的状态的,比如存在什么表、数据库、视图之类的。这里介绍一些常用的、简单的命令:\l,列出所有数据库;\c[onnect],连接到数据库某个数据库,如果先前有连接到某个数据库那么这个操作就是更换连接的数据库;\dt,查看正在使用的数据库中存在哪些表(注意,默认创建的表似乎是不会列出来的);\g执行psql的上一个命令。\q退出psql。以上就是psql的基本用法了,你可以按照自己的在上面执行SQL语句,比如:create table user ( id int primary key );1注意SQL命令以;结尾就可以了。创建完成后可以使用:\dt1来查看你是否创建成功。接下来就是你发挥创造力的时候了,自己尝试着使用psql吧。补充postgres容器的环境变量POSTGRES_PASSWORD,必要的环境变量。这个环境变量将设置PostgreSQL容器中特权用户的密码。如果你要使用PostgreSQL镜像,让它以容器的形式的运行,那么这个环境变量就必须要设置,它一定不能够为空或者未定义。默认的特权用户将由POSTGRES_USER来定义。POSTGRES_USER,可选的环境变量。设置PostgreSQL容器中的特权用户名,需要与POSTGRES_PASSWORD一起使用,以此设置好特权用户的名字和密码。如果该环境变量未被指定,那么默认的特权用户名为postgres。POSTGRES_DB,可选的环境变量。定义容器首次运行创建的默认数据库的名字。如果该环境变量未被使用,那么该环境变量的值等于POSTGRES_USER的值。POSTGRES_INITDB_ARGS,可选的环境变量。大概最终是以这种方式被利用:postgres initdb ${POSTGRES_INITDB_ARGS}。POSTGRES_INITDB_WALDIR,可选的环境变量。定义PostgreSQL事务日志的位置。默认的事务日志的位置是PostgreSQL主数据文件夹(PGDATA指定)下的一个子文件夹。POSTGRES_HOST_AUTH_METHOD,可选的环境变量。(个人理解,似乎是与密码摘要相关的东西,这一般不需要我们关注,如果有兴趣可以去PostgreSQL: Documentation: 14: 21.5. Password Authentication了解一下)。PGDATA,可选的环境变量。定义PostgreSQL主数据文件夹的位置,默认是/var/lib/postgresql/data,如果有调整位置的需求那么可以按需求设置该变量的值。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/A_zyx0808/article/details/144519236
-
1 安装docker desktop 配置镜像源2 国内镜像源"registry-mirrors": [ "https://ccr.ccs.tencentyun.com", "https://docker.rainbond.cc", "https://elastic.m.daocloud.io", "https://elastic.m.daocloud.io", "https://docker.m.daocloud.io", "https://gcr.m.daocloud.io", "https://ghcr.m.daocloud.io", "https://k8s-gcr.m.daocloud.io", "https://k8s.m.daocloud.io", "https://mcr.m.daocloud.io", "https://nvcr.m.daocloud.io", "https://quay.m.daocloud.io" ]
-
华为云容器镜像docker登陆后push时仍然提示未登录 docker login -u cn-north-4@XXXXXXXXXX-p XXXXXXXXXXXX swr.cn-north-4.myhuaweicloud.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /home/crf/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credential-stores Login Succeeded sudo docker push swr.cn-north-4.myhuaweicloud.com/crf/mynginx:1.0 The push refers to repository [swr.cn-north-4.myhuaweicloud.com/xxxx/mynginx] 825fb68b6033: Preparing 7619c0ba3c92: Preparing 1c1f11fd65d6: Preparing 6b133b4de5e6: Preparing 3d07a4a7eb2a: Preparing 756474215d29: Waiting 8d853c8add5d: Waiting denied: You may not login yet
-
前言 在日常生产环境中,我们通常会使用Docker来做容器化管理,通过运行容器来执行任务。但是,随着业务量的不断扩大,容器的不断启动,往往会出现磁盘空间不足的情况。 1、查看当前磁盘使用情况 df -h 其中Use%过大的目录需要排查 2、进入目录,查看当前目录下的文件大小 du -sh * 发现containers目录、overlayer2目录、volumes目录占用空间比较大 containers目录 进入某个容器目录,发现里面是Docker的日志文件 查看同级目录下的所有-json.log du -ha /home/docker/containers/ | grep "json.log" | sort -rh volumes目录 进入volumes目录中,查看大小 du -sh * 进入某个volume,查看其中内容,发现是数据卷内容,可以看情况清理 overlayer2目录 查看其中目录占用空间大小 发现其中部分目录占用空间较大,进入里面看看都由哪些东西 merged 和 diff 占磁盘空间比较大,work 目录可以不用管。 这两个文件夹内容开始是一样的 ,merged会多一些由容器本身产出的写文件,进merged继续往下找 进入./csp目录,发现其中有很多的日志文件 我这里是sentinel的日志,个人项目视情况是否删除,或者通过配置限制文件个数和大小。 3、解决方法 1、docker 镜像占用磁盘 Docker 中查询磁盘占用情况命令: docker system df 可通过执行docker system prune 命令可用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像) 【慎用】 docker system prune -a 命令清理更干净、彻底,可以将没有容器使用的Docker镜像都删掉。 2、containers目录 Docker 容器的日志文件可能会增长并占用大量的磁盘空间。可以检查并删除不再需要的容器日志文件。 (1)临时方案:这个命令将删除 /home/docker/containers/ 目录下的容器日志文件。 sudo find /home/docker/containers/ -name "*-json.log" -type f -delete (2)稳定方案:设置容器服务的日志大小上线 方式一:每个容器都可以单独设置 logging: driver: "json-file" options: max-size: "256m" max-file: "3" 方式二:全局设置 方式三:contab定时执行清理脚本 echo "======== start clean docker containers logs ========" logs=$(find /home/docker/containers/ -name *-json.log) for log in $logs do echo "clean containers logs : $log" cat /dev/null > $log done echo "======== end clean docker containers logs ========" 3、volumes目录 可通过命令删除 find /var/lib/docker/volumes -type f -name "*.log" -delete 3、overlayer2目录 通过排查overlayer2下merged目录中的占用空间较大的目录排查是否需要删除 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/weixin_44012070/article/details/139067735
-
一、引言 1、Elasticsearch简介 Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。 1. 核心特性: 分布式:Elasticsearch是分布式的,可以在多个服务器上运行,并且能够自动将数据在服务器之间进行负载均衡。 可扩展性:Elasticsearch提供了可扩展的架构,无论是存储、节点还是查询吞吐量,都可以随着业务需求的变化而增加资源。它可以扩展到上百台服务器,处理PB级别的数据。 实时性:Elasticsearch能够实时地处理数据,提供了近实时的搜索和分析功能。 全文检索:Elasticsearch提供了全文检索功能,支持对大量数据进行复杂的搜索和分析。 分析性:Elasticsearch提供了强大的分析功能,包括聚合、统计和排序等。 多租户能力:Elasticsearch可以配置为多租户环境,允许不同的用户和应用共享相同的集群资源。 监控和警报:Elasticsearch提供了内置的监控和警报功能,使得用户可以实时了解系统的运行状态,并在出现异常时得到通知。 2. 数据支持: Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都能以支持快速搜索的方式高效地存储和索引它。 3. 技术实现: Elasticsearch使用Java开发,并基于Lucene作为其核心来实现所有索引和搜索的功能。但其目的是通过简单的RESTful API来隐藏Lucene的复杂性,通过面向文档从而让全文搜索变得简单。 Elasticsearch支持多种数据类型,包括字符串、数字、日期等。 Elasticsearch的水平可扩展性允许通过增加节点来扩展其处理能力。 在硬件故障或节点故障的情况下,Elasticsearch具有容错能力,能够保持数据的完整性和服务的可用性。 4. 应用场景: Elasticsearch在众多场景下都有广泛的应用,如企业搜索、日志和事件数据分析、安全监控等。 5. 集成方案: Elasticsearch与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。 2、为什么在k8s中部署elasticsearch 1. 自动化和编排 自动化部署和管理: Kubernetes 提供了自动化的部署、扩展和管理功能,可以简化 Elasticsearch 集群的配置、启动和监控。 自愈能力: Kubernetes 能够自动检测并重新调度失败的 Pod,确保 Elasticsearch 集群的高可用性和稳定性。 2. 可扩展性 水平扩展: Elasticsearch 的节点可以在 Kubernetes 中水平扩展,通过增加或减少节点数目来应对数据量和查询量的变化。 弹性资源分配: Kubernetes 允许为不同的 Elasticsearch 节点(如数据节点、主节点、协调节点)分配不同的资源配额,确保资源的合理利用和优化。 3. 高可用性 多副本管理: Kubernetes 能够通过其副本控制器和 StatefulSets 管理 Elasticsearch 的数据副本和分片,确保在节点失败时数据不会丢失,并且服务能迅速恢复。 跨可用区分布: Kubernetes 可以将 Elasticsearch 节点分布在不同的可用区(Availability Zones),提高容灾能力。 4. 容器化优势 一致的环境: 使用容器化的 Elasticsearch 可以确保在开发、测试和生产环境中运行的一致性,减少环境差异带来的问题。 依赖管理: 容器化可以简化依赖管理,确保 Elasticsearch 及其依赖组件能够在独立的环境中运行,不会相互干扰。 二、k8s基础 1、k8s简介 K8s,全称Kubernetes,是一个开源的容器编排系统,旨在自动化容器化应用程序的部署、扩展和管理。 1. 定义与概念: K8s是一个用于管理容器的开源平台,允许用户方便地部署、扩展和管理容器化应用程序。 它通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。 Kubernetes将应用程序打包成容器,并将这些容器部署到一个集群中,自动处理容器的生命周期管理、自动扩容等操作。 2. 主要特点: 自动化管理:自动化管理容器应用程序的部署、扩展、运维等一系列操作,减少了人工干预,提高了效率。 弹性伸缩:根据应用负载情况自动进行扩容或缩容,保证应用的性能和稳定性。 高可用性:当某个节点故障时,K8s会自动将应用迁移至其他健康节点,保证应用的正常运行。 自愈能力:能够监测应用状态并进行自动修复,如自动重启或迁移故障应用。 3. 架构与组件: K8s集群由多个节点(Node)组成,包括Master节点和Worker节点。 Master节点作为整个集群的控制中心,负责集群的管理和调度工作,包括API服务器、调度器、控制器管理器等核心组件。 Worker节点是集群的工作节点,负责运行Pod(容器组)并提供应用程序的运行环境。 2、Pods、Services、StatefulSet等基本概念 2.1 Pods Pods 是Kubernetes中最小的可部署计算单元。一个Pod可以包含一个或多个容器,这些容器共享网络命名空间和存储资源,并总是共同调度在同一个节点上。 单容器Pod: 最常见的情况,一个Pod包含一个容器。 多容器Pod: 包含多个需要紧密协作的容器,例如共享存储或网络的协同进程。 特点: 共享相同的存储卷和网络命名空间。 作为一个整体被调度到同一个节点上。 2.2 Services Services 是一种抽象,它定义了一组逻辑上相同的Pods,并且提供一个稳定的访问入口(IP地址和端口)。Services实现了负载均衡,并且允许Pod进行自动发现和通信。 类型: ClusterIP: 默认类型,仅在集群内部可访问。 NodePort: 在每个节点上开放一个静态端口,使得服务可以通过<NodeIP>:<NodePort>访问。 LoadBalancer: 使用云提供商的负载均衡器,公开服务到外部网络。 ExternalName: 将服务映射到外部名称,比如DNS名称。 功能: 提供Pod的负载均衡。 稳定的网络接口,不会因为Pod的创建和销毁而变化。 2.3 StatefulSets StatefulSets 专门用于管理有状态应用,确保Pod有固定的标识符和稳定的存储。适用于数据库、分布式文件系统等需要持久化存储的应用。 特点: 稳定的网络标识: 每个Pod有一个固定的DNS名,例如pod-0.service.namespace.svc.cluster.local。 有序部署和更新: Pod按顺序进行创建、删除和更新(例如从pod-0到pod-N)。 稳定的存储: 每个Pod可以有一个独立的PersistentVolume,与Pod的生命周期无关。 三、Elasticsearch集群架构 1、Elasticsearch集群的组成 一Elasticsearch集群主要由以下几个部分组成: 1. 节点(Node): 节点是Elasticsearch集群中的一个单独运行实例,每个节点都存储数据并参与集群的索引和搜索功能。 2. 主节点(Master Node): 负责集群范围内的管理任务,如创建或删除索引、跟踪集群中各个节点的状态,并选择主分片和副本分片的位置。 一个集群中只有一个主节点是活动的,但可以配置多个候选主节点以提高容错性。 3. 数据节点(Data Node): 负责存储数据和处理CRUD(创建、读取、更新、删除)操作以及搜索请求。数据节点需要较多的内存和存储资源。 4. 协调节点(Coordinating Node): 处理来自客户端的请求,将请求分发到合适的数据节点,并汇总结果后返回给客户端。 任何节点都可以作为协调节点,但可以专门配置一些节点只作为协调节点。 5. 主节点候选节点(Master-Eligible Node): 可以被选举为主节点的节点。通常,集群会配置多个候选主节点,以防止单点故障。 6. 专用节点(Dedicated Node): 可以配置专门的节点来处理特定任务,如专用的主节点、数据节点或协调节点,以优化集群性能。 2、Elasticsearch工作原理 1. 索引和分片(Shards): 数据在存储时被划分为多个分片。每个索引(类似于关系数据库中的表)可以被分成一个或多个主分片(Primary Shard),每个主分片可以有多个副本分片(Replica Shard)。 主分片负责处理数据写入,副本分片用于数据冗余和读取操作,以提高查询性能和数据安全性。 2. 数据分布: Elasticsearch使用一致性哈希算法将分片分布到集群中的各个节点上。主节点负责跟踪分片的位置,并在节点故障时重新分配分片。 3. 查询和搜索: 当客户端发送查询请求时,协调节点会解析请求并将其分发到相关的分片上。每个分片在本地执行查询,并返回结果给协调节点,协调节点汇总结果后返回给客户端。 查询可以并行执行,从而提高性能。 4. 数据写入: 当客户端发送数据写入请求时,协调节点将数据发送到相关的主分片。主分片处理写入后,将数据同步到所有副本分片。确保所有副本分片都成功写入数据后,协调节点才会向客户端确认写入成功。 3、集群高可用设计 本次部署的elasticsearch设计为5节点,一主多从的高可用方式,如果一个主节点意外宕掉,其他节点自主选举出新的Master节点接管任务,从而保证集群的高可用性 四、部署环境准备 1、准备k8s集群 这里我们使用的k8s集群版本为 1.23,也可以使用其他的版本,只是镜像导入命令不通,如果还未搭建k8s集群,请参考《在Centos中搭建 K8s 1.23 集群超详细讲解》这篇文章 2、准备StorageClass 因为我们要对Elasticsearch中的数据进行持久化,避免Pod漂移后数据丢失,保证数据的完整性与可用性 如果还未创建存储类,请参考《k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)》这篇文件。 五、部署Elasticsearch集群 1、编写部署Elasticsearch的YAML文件 apiVersion: v1 kind: Namespace metadata: name: es --- #创建ConfigMap用于挂载配置文件 apiVersion: v1 kind: ConfigMap metadata: name: sirc-elasticsearch-config namespace: es labels: app: elasticsearch data: #具体挂载的配置文件 elasticsearch.yml: |+ cluster.name: "es-cluster" network.host: 0.0.0.0 http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: "*" bootstrap.system_call_filter: false xpack.security.enabled: false index.number_of_shards: 5 index.number_of_replicas: 1 #创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: es spec: serviceName: "elasticsearch-cluster" #填写无头服务的名称 replicas: 5 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: initContainers: - name: fix-permissions image: busybox imagePullPolicy: IfNotPresent command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"] securityContext: privileged: true volumeMounts: - name: es-data mountPath: /usr/share/elasticsearch/data - name: increase-vm-max-map image: busybox imagePullPolicy: IfNotPresent command: ["sysctl", "-w", "vm.max_map_count=262144"] securityContext: privileged: true - name: increase-fd-ulimit image: busybox imagePullPolicy: IfNotPresent command: ["sh", "-c", "ulimit -n 65536"] securityContext: privileged: true containers: - name: elasticsearch image: elasticsearch:7.17.18 imagePullPolicy: Never resources: requests: memory: "1000Mi" cpu: "1000m" limits: memory: "2000Mi" cpu: "2000m" ports: - containerPort: 9200 name: elasticsearch env: - name: node.name valueFrom: fieldRef: fieldPath: metadata.name #metadata.name获取自己pod名称添加到变量MY_POD_NAME,status.hostIP获取自己ip等等可以自己去百度 - name: discovery.type value: zen - name: cluster.name value: elasticsearch - name: cluster.initial_master_nodes value: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4" - name: discovery.zen.minimum_master_nodes value: "3" - name: discovery.seed_hosts value: "elasticsearch-0.elasticsearch-cluster.es,elasticsearch-1.elasticsearch-cluster.es,elasticsearch-2.elasticsearch-cluster.es,elasticsearch-3.elasticsearch-cluster.es,elasticsearch-4.elasticsearch-cluster.es" - name: network.host value: "0.0.0.0" - name: "http.cors.allow-origin" value: "*" - name: "http.cors.enabled" value: "true" - name: "number_of_shards" value: "5" - name: "number_of_replicas" value: "1" - name: path.data value: /usr/share/elasticsearch/data volumeMounts: - name: es-data #挂载数据 mountPath: /usr/share/elasticsearch/data volumes: - name: elasticsearch-config configMap: #configMap挂载 name: sirc-elasticsearch-config volumeClaimTemplates: #这步自动创建pvc,并挂载动态pv - metadata: name: es-data spec: accessModes: ["ReadWriteMany"] storageClassName: nfs resources: requests: storage: 10Gi #创建Service --- apiVersion: v1 kind: Service metadata: name: elasticsearch-cluster #无头服务的名称,需要通过这个获取ip,与主机的对应关系 namespace: es labels: app: elasticsearch spec: ports: - port: 9200 name: elasticsearch clusterIP: None selector: app: elasticsearch --- apiVersion: v1 kind: Service metadata: name: elasticsearch #service服务的名称,向外暴露端口 namespace: es labels: app: elasticsearch spec: ports: - port: 9200 name: elasticsearch type: NodePort selector: app: elasticsearch --- apiVersion: v1 kind: Service metadata: name: my-nodeport-service-0 namespace: es spec: type: NodePort selector: statefulset.kubernetes.io/pod-name: elasticsearch-0 ports: - protocol: TCP port: 80 # Service 暴露的端口 targetPort: 9200 # Pod 中容器的端口 nodePort: 30000 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata: name: my-nodeport-service-1 namespace: es spec: type: NodePort selector: statefulset.kubernetes.io/pod-name: elasticsearch-1 ports: - protocol: TCP port: 80 # Service 暴露的端口 targetPort: 9200 # Pod 中容器的端口 nodePort: 30001 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata: name: my-nodeport-service-2 namespace: es spec: type: NodePort selector: statefulset.kubernetes.io/pod-name: elasticsearch-2 ports: - protocol: TCP port: 80 # Service 暴露的端口 targetPort: 9200 # Pod 中容器的端口 nodePort: 30002 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata: name: my-nodeport-service-3 namespace: es spec: type: NodePort selector: statefulset.kubernetes.io/pod-name: elasticsearch-3 ports: - protocol: TCP port: 80 # Service 暴露的端口 targetPort: 9200 # Pod 中容器的端口 nodePort: 30003 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata: name: my-nodeport-service-4 namespace: es spec: type: NodePort selector: statefulset.kubernetes.io/pod-name: elasticsearch-4 ports: - protocol: TCP port: 80 # Service 暴露的端口 targetPort: 9200 # Pod 中容器的端口 nodePort: 30004 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: apps/v1 kind: Deployment metadata: name: elasticsearchhead namespace: es spec: replicas: 1 selector: matchLabels: app: elasticsearchhead template: metadata: labels: app: elasticsearchhead spec: containers: - name: elasticsearchhead image: mobz/elasticsearch-head:5 ports: - containerPort: 9100 --- apiVersion: v1 kind: Service metadata: name: elasticsearchhead-service namespace: es spec: type: NodePort ports: - port: 9100 targetPort: 9100 nodePort: 30910 # 可根据需要选择合适的端口号 selector: app: elasticsearchhead 上述Kubernetes配置文件定义了Elasticsearch集群的部署,使用StatefulSet来管理其有状态的Pod。 配置说明 1. 命名空间 (Namespace) 创建一个命名空间es,用于组织和隔离Elasticsearch资源。 2. ConfigMap 创建一个ConfigMap,用于存储Elasticsearch的配置文件elasticsearch.yml。 3. StatefulSet StatefulSet 用于部署和管理有状态应用。 包含5个副本(replicas),每个副本都有唯一的标识符(如elasticsearch-0)。 使用初始化容器(initContainers)来处理权限、系统参数和文件描述符的设置。 定义了主容器elasticsearch,并指定了环境变量、资源请求和限制,以及挂载数据卷。 4. Services 创建了一个无头服务elasticsearch-cluster,用于Pod之间的内部通信。 创建了一个NodePort服务elasticsearch,暴露9200端口到集群外部。 为每个StatefulSet的Pod创建单独的NodePort服务,分别暴露在不同的端口(30000-30004),用于直接访问特定的Pod。 5. Elasticsearch Head 部署和服务 部署Elasticsearch Head插件,用于图形化管理和浏览Elasticsearch集群。 暴露Elasticsearch Head的9100端口,使用NodePort类型服务,端口号为30910。 2、部署 Elasticsearch 执行下面的命令 kubectl get pod -n es 3、查看Pod状态 执行下面的命令 kubectl get svc -n es 4、访问测试 查看svc的nodeport端口 在浏览器输入Node的IP加30910端口 在连接窗口输入 Node的IP加30001端口,点击连接 如果能显示下面的结果,则集群部署成功 💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Elasticsearch的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺 🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!! ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/weixin_53269650/article/details/139632433
-
概述 nvidia-docker 和 nvidia-container-runtime 是用于在 NVIDIA GPU 上运行 Docker 容器的两个相关工具。它们的作用是提供 Docker 容器与 GPU 加速硬件的集成支持,使容器中的应用程序能够充分利用 GPU 资源。 nvidia-docker 为了提高 Nvidia GPU 在 docker 中的易用性, Nvidia 通过对原生 docker 的封装提供了 nvidia-docker 工具 nvidia-docker 是一个 Docker 插件,用于在 Docker 容器中启用 NVIDIA GPU 支持。 该工具提供了一个命令行界面,允许在运行容器时通过简单的命令来指定容器是否应该访问主机上的 NVIDIA GPU 资源。 当在容器中运行需要 GPU 加速的应用程序时,可以使用 nvidia-docker 来确保容器能够访问 GPU。 # 示例命令 nvidia-docker run -it --rm nvidia/cuda:11.0-base nvidia-smi 上述命令使用 nvidia-docker 在容器中运行 NVIDIA 的 CUDA 基础镜像,并在容器中执行 nvidia-smi 命令以查看 GPU 信息 nvidia-container-runtime nvidia-container-runtime 是 NVIDIA 的容器运行时,它与 Docker 和其他容器运行时(如 containerd)集成,以便容器可以透明地访问 NVIDIA GPU 资源。 与 nvidia-docker 不同,nvidia-container-runtime 不是 Docker 插件,而是一种更通用的容器运行时,可与多个容器管理工具集成。 nvidia-docker 和 nvidia-container-runtime 都是用于使 Docker 容器能够访问 NVIDIA GPU 资源的工具。可以根据自己的需求选择其中一个来配置容器以利用 GPU 加速。 需要注意的是,最新的 NVIDIA Docker 支持通常建议使用 nvidia-container-runtime,因为它提供了更灵活和通用的 GPU 支持,而不仅仅是为 Docker 定制的解决方案。 # 示例命令 docker run --runtime=nvidia -it --rm nvidia/cuda:11.0-base nvidia-smi 上述命令使用 Docker 运行容器,通过 --runtime=nvidia 参数指定使用 nvidia-container-runtime 运行时,并在容器中执行 nvidia-smi 命令。 原生 docker 通过设备挂载和磁盘挂载的方式支持访问 GPU 资源 docker 本身并不原生支持 GPU,但使用 docker 的现有功能可以对 GPU 的使用进行支持 # 示例命令 docker run \ --device /dev/nvidia0:/dev/nvidia0 \ --device /dev/nvidiactl:/dev/nvidiactl \ --device /dev/nvidia-uvm:/dev/nvidia-uvm \ -v /usr/local/nvidia:/usr/local/nvidia \ -it --privileged nvidia/cuda 通过 --device 来指定挂载的 GPU 设备,通过 -v 来将宿主机上的 nvidia gpu 的命令行工具和相关的依赖库挂载到容器。这样,在容器中就可以看到和使用宿主机上的 GPU 设备了。 注意:这种方式对于 GPU 的可用性(哪些 GPU 是空闲的等)需要人为的判断,效率很低 nvidia-docker 详解 结构图及各组件说明 nvidia-docker 对于使用 GPU 资源的 docker 容器支持的层次关系: Nvidia-docker的原理图以及各个部分的作用解析: **libnvidia-container:**提供了一个库和简单的 CLI 工具,以实现在容器当中支持使用 GPU 设备的目标。 nvidia-container-toolkit: 是一个实现了 runC 的 prestart hook 接口的脚本,该脚本在 runC 创建一个容器之后,启动该容器之前调用,其主要作用就是修改与容器相关联的 config.json,注入一些在容器中使用 NVIDIA GPU 设备所需要的一些信息(比如:需要挂载哪些 GPU 设备到容器当中)。 nvidia-container-runtime: 主要用于将容器 runC spec 作为输入,然后将 nvidia-container-toolkit 脚本作为一个 prestart hook 加入到 runC spec 中,再用修改后的 runC spec 调 runc 的 Exec 接口运行容器。 所以在容器启动之前会调用 pre-start hook(nvidia-container-toolkit),这个 hook 会通过 nvidia-container-cli 文件,来调用libnvidia-container 库,最终映射挂载宿主机上的 GPU 设备、nvid 驱动的 so 文件、可执行文件到容器内部。 nvidia-container-runtime 才是真正的核心部分,它在原有的 docker 容器运行时 runc 的基础上增加一个 prestart hook,用于调用 libnvidia-container 库 RunC: RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事。 可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。也是 docker 默认的容器运行方式。 事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。而 OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。 直接使用 RunC 的命令行即可以完成创建一个容器,并提供了简单的交互能力。 容器创建过程 创建一个正常容器(不支持 GPU)的流程: docker --> dockerd --> containerd–> containerd-shim -->runc --> container-process 1 docker 客户端将创建容器的请求发送给 dockerd,当 dockerd 收到请求任务之后将请求发送给 containerd,containerd 经过查看校验启动 containerd-shim 或者自己来启动容器进程。 创建一个支持 GPU 的容器的流程: docker–> dockerd --> containerd --> containerd-shim–> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvidia-container --> runc – > container-process 1 基本流程和不支持 GPU 的容器差不多,只是把 docker 默认的运行时替换成了 NVIDIA 封装的 nvidia-container-runtime 这样当 nvidia-container-runtime 创建容器时,先执行 nvidia-container-runtime-hook,这个 hook 去检查容器是否需要使用GPU(通过环境变 NVIDIA_VISIBLE_DEVICES 来判断)。如果需要则调用 libnvidia-container 来暴露 GPU 给容器使用。否则走默认的 runc 逻辑。 NVIDIA Docker 整体工作架构 软硬件基础 硬件,服务器上安装了英伟达 GPU 宿主机,安装了操作系统和 Cuda Driver,以及 Docker 引擎 容器,包含容器 OS 用户空间,Cuda Toolkit,以及用户应用程序 注意: 宿主机上需要安装 cuda driver,容器内需要安装 cuda toolkit。容器内无需安装 cuda driver NVIDIA 提供了一些官方镜像,其中已经安装好了 cuda toolkit,但还是需要在宿主机安装 cuda driver。 API 结构 NVIDIA 提供了三层 API: CUDA Driver API: GPU 设备的抽象层,通过提供一系列接口来操作 GPU 设备,性能最好,但编程难度高,一般不会使用该方式开发应用程序 CUDA Runtime API: 对 CUDA Driver API 进行了一定的封装,调用该类 API 可简化编程过程,降低开发难度 CUDA Libraries: 是对 CUDA Runtime API 更高一层的封装,通常是一些成熟的高效函数库,开发者也可以自己封装一些函数库便于使用 应用程序可调用 CUDA Libraries 或者 CUDA Runtime API 来实现功能,当调用 CUDA Libraries 时,CUDA Libraries 会调用相应的 CUDA Runtime API,CUDA Runtime API 再调用 CUDA Driver API,CUDA Driver API 再操作 GPU 设备。 CUDA 的容器化 目标:让应用程序可以在容器内调用 CUDA API 来操作 GPU 因此需要实现: 在容器内应用程序可调用 CUDA Runtime API 和 CUDA Libraries 在容器内能使用 CUDA Driver 相关库。因为 CUDA Runtime API 其实就是 CUDA Driver API 的封装,底层还是要调用到 CUDA Driver API 在容器内可操作 GPU 设备 因此容器中访问 GPU 资源过程为: 要在容器内操作 GPU 设备,需要将 GPU 设备挂载到容器里 Docker 可通过 --device 挂载需要操作的设备,或者直接使用特权模式(不推荐)。 NVIDIA Docker 是通过注入一个 prestart 的 hook 到容器中,在容器自定义命令启动前就将GPU设备挂载到容器中。 至于要挂载哪些GPU,可通过 NVIDIA_VISIBLE_DEVICES 环境变量控制。 挂载 GPU 设备到容器后,还要在容器内可调用 CUDA API CUDA Runtime API 和 CUDA Libraries 通常跟应用程序一起打包到镜像里 CUDA Driver API 是在宿主机里,需要将其挂载到容器里才能被使用。 NVIDIA Docker 挂载 CUDA Driver 库文件到容器的方式和挂载 GPU 设备一样,都是在 runtime hook 里实现的。 注意: 该方案也有一些问题,即容器内的 CUDA Runtime 同宿主机的 CUDA driver 可能存在版本不兼容的问题。 CUDA Libraries 和 CUDA Runtime API 是和应用程序一起打包到镜像中的,而 Driver 库是在创建容器时从宿主机挂载到容器中的,需要保证 CUDA Driver 的版本不低于 CUDA Runtime 版本。 , NVIDIA Docker 2.0(nvidia-container-runtime) 实现机制 nvidia-docker2.0 是一个简单的包,它主要通过修改 docker 的配置文件 /etc/docker/daemon.json,将默认的 Runtime 修改为 nvidia-container-runtime,可实现将 GPU 设备,CUDA Driver 库挂载到容器中。 cat /etc/docker/daemon.json { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } Debug日志 修改 nvidia runc 的默认配置文件 /etc/nvidia-container-runtime/config.toml ,打开 hook 的 debug 日志选项,可以看到宿主机挂载 nvidia 驱动、设备到容器内部的详细过程。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/footless_bird/article/details/136291344
-
【docker】centos7配置docker镜像加速-转载鲲鹏发表于 13 小时前4查看国内从 DockerHub 拉取镜像有时会遇到困难,由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。 国内常见镜像仓库 docker官方地址仓库国外地址: https://download.docker.com/linux/centos/docker-ce.repo 阿里云 : http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 华为云: https://<your accelerate address>.mirror.swr.myhuaweicloud.com 腾讯云: https://mirror.ccs.tencentyun.com 科大镜像: https://docker.mirrors.ustc.edu.cn/ 七牛云加速器: https://reg-mirror.qiniu.com docker中国: https://registry.docker-cn.com 网易: http://hub-mirror.c.163.com daocloud: http://f1361db2.m.daocloud.io 【注意】云服务的话要根据自己购买的服务器获取自己服务器对应的镜像加速地址,这样可以比公开的镜像地址速度更快。推荐阿里云和华为云的。 确认操作系统版本 uname -r 查看信息(配置镜像加速前) docker info 没有看到 Registry Mirrors: https:// XXXXXXXXXXXXX 说明没有配置镜像加速。 创建文件夹 mkdir -pv /etc/docker 创建daemon.json cd /etc/docker/ touch daemon.json 编辑 daemon.json vim daemon.json 增加内容: {"registry-mirrors":["https://hub-mirror.c.163.com/"]} 重新启动服务 systemctl daemon-reload systemctl restart docker 再次查看信息(配置镜像加速后) docker info ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/wochunyang/article/details/134894410
-
1、环境win10 子系统wsl2 Ubuntu20.4 安装了docker ce 版本 Docker version 27.1.1, build 63125852、问题运行build_sdk_base.sh报错,错误内容如下如何解决
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签