我现在docker-compose的yml大概是这样的: version: "3.9" services: server-pc: container_name: test-server-pc image: "test-server-pc:2.4.2" environment: - TZ=Asia/Shanghai restart: always networks: - 'cnit-net-main' ports: - '8080:8080' volumes: - "/cnit-serv/test/server-pc/apl-log:/apl-log" - "/cnit-serv/test/server-pc/apl-configs:/apl-configs" - "/cnit-serv/test/server-pc/apl-wx-pay-cert:/apl-wx-pay-cert" - "/cnit-serv/test/server-pc/apl-public:/apl-public" - "/cnit-serv/test/server-pc/apl-static:/apl-static" - "/cnit-serv/test/server-pc/apl-ftl-templates:/apl-ftl-templates" - "/cnit-serv/test/server-pc/apl-upload:/apl-upload" - "/cnit-serv/test/server-pc/apl-webapp:/apl-webapp" privileged: true nginx: container_name: cnit-nginx image: "nginx" environment: - TZ=Asia/Shanghai restart: always networks: - 'cnit-net-main' ports: - '80:80' - '443:443' volumes: - "/cnit-serv/nginx/www/html:/usr/share/nginx/html" - "/cnit-serv/nginx/config/certs/:/etc/nginx/certs" - "/cnit-serv/nginx/config/nginx.conf:/etc/nginx/nginx.conf" - "/cnit-serv/nginx/config/conf.d:/etc/nginx/conf.d" - "/cnit-serv/nginx/logs:/var/log/nginx" - "/cnit-serv/test/front-pc/ver-2-4-2/dist:/srv/test/pc-admin" - "/cnit-serv/test/front-hp:/srv/test/www" privileged: true depends_on: - "server-pc" networks: cnit-net-main: external: true 简单来说呢,就是启动一个后台服务和一个前台服务。 我正常重启的流程是,发布新的代码后,修改"test-server-pc:2.4.2"和"front-pc/ver-2-4-2"的版本号,之后停止服务,重新启动。 重新启动的命令是: cd /cnit-serv/test/docker-compose/ docker compose down docker compose up -d 那我现在有一个问题就是,我只改了前台,我的后台并没有改动,所以我只想把前台从"/cnit-serv/test/front-pc/ver-2-4-2/dist:/srv/test/pc-admin"变成"/cnit-serv/test/front-pc/ver-2-4-3/dist:/srv/test/pc-admin", 那我该怎么在不停止后台服务的情况下,重启前台呢?
docker中的redis容器IP地址一直都是127.0.0.1,无法改变? 背景:把Springboot项目部署到docker了,然后在运行项目时, Caused by: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: /127.0.0.1:6379 尝试:1、修改了redis.conf"0c77096b52b4e182b803527e2a006d4.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241005/079c0583f23a2462dc9216d0e79adf7f.png) 2、修改项目的配置文件"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241005/82a6a7140a4fe92e95e5ef27af89b25e.png)"cbfb10cf7845a6fc1fadd68b68a02bb.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241005/79df04bff4dac6ca87348d3e6481d96e.png) 3、这是redis容器,name为myredis,而且mysql和myredis都connect到了heima网络里面了"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241005/dae926e8dba21f9b9019040b5ea76f7b.png) 在修改配置后,我都有重启各个容器,但仍然无效 问题已经解决 问题是在Java程序这一端 public class RedissonConfig { @Value("${spring.redis.host}") private String redisHost; @Bean public RedissonClient redissonClient(){ //配置 Config config=new Config(); //之前在这里把redis的ip写死了 config.useSingleServer().setAddress("redis://"+redisHost+":"+"6379"); //创建RedissonClient对象 return Redisson.create(config); }
opendkim使用命令systemctl restart opendkim后,使用systemctl status opendkim查看后 [root@92d7446911bd etc]# systemctl status -l opendkim ● opendkim.service - DomainKeys Identified Mail (DKIM) Milter Loaded: loaded (/usr/lib/systemd/system/opendkim.service; enabled; vendor preset: disabled) Active: inactive (dead) since Tue 2024-01-02 05:59:19 UTC; 11min ago Docs: man:opendkim(8) man:opendkim.conf(5) man:opendkim-genkey(8) man:opendkim-genzone(8) man:opendkim-testadsp(8) man:opendkim-testkey http://www.opendkim.org/docs.html Process: 579 ExecStart=/usr/sbin/opendkim $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 579 (code=exited, status=0/SUCCESS) Jan 02 05:59:19 92d7446911bd systemd[1]: Started DomainKeys Identified Mail (DKIM) Milter. 。发先opendkim状态时dead状态。不管我试多少次,就是还是这个样子 使用postfix发送邮件后 Jan 2 06:29:50 92d7446911bd postfix/smtpd[693]: warning: connect to Milter service inet:localhost:8891: Connection refused 提示也是这样的。 我也查了很多资料,但基本都是说没启动,但我使用了systemctl stop/start/restart opendkim我都试过了,还是这样。 跪求大神们,帮帮忙。
SpringCloud微服务运维最佳实践,如何动态定义各种启动参数? «笔者是一名Java服务端程序员,学习微服务后,在部署时发现过程复杂,且做的重复工作非常多,因此学习基本运维。目标是,使用Kubernetes和容器技术进行微服务编排和部署。» 本文只讨论服务容器化,不涉及K8s和Jenkins相关内容。 问题概述 在服务容器化时,一些参数必须动态传入,以适应不同的部署环境。变化的参数包括: * 部署环境(开发环境、测试环境、预发环境、生成环境) * 服务版本(0.0.1、1.0.2、1.0.1-beta) * 服务发现(部署时将服务注册到注册中心如Nacos) 我的Java项目(Example)由多个微服务构成:如Example-core,Example-auth,Example-gateway等。以Example-auth这个微服务作为切入点,打包为Docker容器的代码为: # 使用官方的OpenJDK 17作为基础镜像 FROM openjdk:17 # 镜像环境变量: # 开发环境:dev # 测试环境:test # 预发环境:staging # 生产环境:prod, 默认生产环境 ARG ENVIRONMENT=prod # Jar包的版本,默认0.0.1-SNAPSHOT ARG JAR_VERSION=0.0.1-SNAPSHOT # 注册中心服务地址 ARG SERVER_NAME=www.nacos-server.cn # 维护者 MAINTAINER xlxing@bupt.edu.cn # 拷贝文件到Docker容器中 COPY target/auth-${JAR_VERSION}.jar /app/auth-${JAR_VERSION}.jar # 暴露服务端口 EXPOSE 8999 # 容器启动项 ENTRYPOINT ["java", "-jar", "/app/auth-${JAR_VERSION}.jar", "--spring.profiles.active=${ENVIRONMENT}", "--spring.cloud.nacos.discovery.ip=${SERVER_NAME}"] 在构建容器时可以动态传入参数(jar包版本为1.1.0,环境是dev,服务发现地址www.my-auth.cn,构建的容器命名为myapp/example:auth-dev-1.1.0): docker build --build-arg JAR_VERSION=1.1.0 ENVIRONMENT=dev SERVER_NAME=www.my-auth.cn -t myapp/example:auth-dev-1.1.0 . 该内容产生了以下两个具体问题: 1. 如何动态获取JAR_VERSION 在构建项目时,仍然需要手动传入项目版本,实际上该信息存在于项目中,如该微服务auth的pom.xml文件: auth 0.0.1-SNAPSHOT auth 权限微服务 理想情况是:后端程序员来定义项目的版本,而流水线只需要依赖项目即可。 但是在当前情况下:当auth项目的version变更时,构建Docker镜像的指令也需要同步变化。该问题可以总结为,构建容器时如何从项目中获取JAR_VERSION? docker build --build-arg JAR_VERSION=1.1.0 ENVIRONMENT=dev SERVER_NAME=www.my-auth.cn -t myapp/example:auth-dev-1.1.0 . 2. 如何自动获取宿主机的SERVER_NAME 微服务启动时,将该服务注册到Nacos上,声明自己的服务地址。当部署到具体的服务器上时,该地址才被绑定,如auth服务可以部署在server-a上,也可以部署到server-b上。如何在运行时 确定服务地址而不是构建时 。 补充内容: auth服务的配置文件 spring: application: name: auth # Nacos配置 cloud: nacos: server-addr: www.nacos-server.cn # 服务发现 discovery: cluster-name: BEIJING # 设置为非临时实例 ephemeral: true # 设置命名空间 namespace: e35500e1-2441-4001-b60f-3f7d55bxxxxx # 配置中心 config: file-extension: yaml # 文件后缀名 namespace: e35500e1-2441-4001-b60f-3f7d55bxxxxx group: DEFAULT_GROUP dubbo: # 将Dubbo注册到Nacos中,这样可供消费者直接使用 application: name: dubbo-auth protocol: name: dubbo port: -1 registry: address: nacos://www.nacos-server.cn?namespace=228df068-54b7-405e-9e32-72c759d79ed9 group: DEV_DUBBO_GROUP 拓展问题:使用K8s和容器在分布式环境下部署微服务项目最佳实践? 其中涉及到很多配置相关的问题,缺乏一个系统性的文章探讨如何部署和运维。 一些尝试: 1. 我有两台服务器A和B,我在部署前已经计划将auth服务部署到B上,因此构建时参数SERVER_NAME=B,构建好的容器无法直接在其他服务器上启动。 一条可行的方法是,在构建容器时不指定SERVER_NAME,在"docker run"时动态传入参数。 "ARG SERVER_NAME=www.nacos-server.cn" 改为"ENV SERVER_NAME=www.nacos-server.cn" 2. JAR_VERSION目前是手动更改。 *** 第一个问题: 我们在构建开发流水线的时候,会写一个脚本(比如Jenkins)。类似于这样的一个过程: 1. 从pom.xml中获取version值,记为VERSION 2. 使用脚本更改Dockerfile中的JAR_VERSION,此时Dockerfile中的JAR_VERSION=${VERSION} 3. 生成新的Docker Image,例如 "docker build -t myapp/auth:${VERSION} ." 总的来说,我们无法直接在Dockerfile中获取pom.xml中的VERSION,但是可以在流水线脚本中往Dockerfile中插入静态值。 第二个问题: 我们可以将流水线部署分为两个部分,构建 和部署 你的回复没有解决部署 时的环境变量问题,SERVER_NAME是与所属的服务器相关的,在使用K8s时构建的配置文件如k8s-prod.yaml中,env也是一些动态参数。使用环境变量只是解决了可以在运行时变更参数的作用。 比如k8s架构有3个子节点k8s-node01、k8s-node02、k8s-node03,在部署的时候将auth这个微服务部署到哪一个节点,对运维工程师来说是透明的。 此时想到了一个笨重的方法:在k8s-node01、k8s-node02、k8s-node03的系统中提前准备好环境变量MY_IPV4,然后在"docker run"的时候参数除了在k8s的yaml文件中定义,也可以从服务器的环境变量中获取。例如,gateway将auth服务路由到"lb://auth",而"lb://auth"信息是从注册中心拿到的,如"http://111.229.38.208:8999"。 在传统的微服务部署中,我可以基本使用nacos作为注册中心使用。K8s中的注册中心原理是DNS服务器。我现在尝试将传统微服务半自动化部署迁移到k8s部署上来,对于服务注册与发现可能有一些理解不充分。希望前辈指正。 主要问题是:传统部署微服务时,微服务启动时总是将自身(自身所在节点的ip)注册到Nacos,如何使得微服务部署是无状态的。 spring: application: name: gateway cloud: # SpringCloudGateway配置 gateway: default-filters: # http请求的Header中增加 k, v - AddRequestHeader=gateway-env, gateway-dev # 前端个请求uri会拼接一个版本前缀发送到特定的服务 routes: - id: auth uri: lb://auth filters: # 服务版本前缀 - PrefixPath=/api/v1 predicates: - Path=/auth/** - id: multimedia uri: lb://multimedia filters: - PrefixPath=/api/v1 predicates: - Path=/multimedia/** - id: core uri: lb://core filters: - PrefixPath=/api/v1 predicates: - Path=/core/** # Gateway不使用Servlet而是WebFlux main: web-application-type: reactive # 微服务分布式鉴权专用Redis # Gateway和Auth共享一个权限管理Redis数据库 data: redis: client-type: lettuce database: 0 host: www.xingxiaolin.cn port: 6379 lettuce: pool: enabled: true max-active: 8 max-idle: 8
请问运行在容器内的Jenkins如何配置可以调用docker命令?宿主机是Windows系统。 首先排除制作一个带有docker的Jenkins的镜像,这个办法有点老套。 尝试了一下docker in docker,但是貌似这个方案是基于Linux的。 在Windows上docker本身已经运行于wsl这类的虚拟机中了,如何再映射卷呢? 尝试过docker in docker,但是-v /var/run/docker.sock:/var/run/docker.sock这种命令在Windows的docker无法使用。
gke 没有统一的对外 ip 怎么设置白名单? gke k8s 的每个 node 都有独立的公网 ip,这导致一个问题, 我在 gcp 开了一个虚拟安装了一个 redis 并设置了访问密码,但是为了安全,我还要设置一个 ip 白名单 但是我的后端程序在 gke,gke k8s 的每个 node 都有独立的公网 ip。这导致一个问题,我不知道怎么为 redis 绑定 ip 白名单了。因为我的服务会被 k8s 调度到任何一个 node,每个 node 的公网 ip 又不一样! «为什么不走内网?运维告诉我,谷歌 gke 访问 gcp 只能公网ip 访问,也不知道真的假的?»
在云服务器上部署了一个后台管理系统,现在想只能让公司内部可以访问,外部人员访问时该网站就跟不存在一样的那样,请问该如何设置?如果过程很冗长,麻烦提供一些关键词给我搜索。我在百度搜索诸如如何让部署在云服务器的网站只能公司内部访问这种,出来的全部都是如何在云服务器部署网站的东西,实在是让人难受。
通过 docker 命令创建了一个 volumn 的卷,然后执行 "docker volume inspect todo-db" [ { "CreatedAt": "2024-01-03T17:09:01Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/todo-db/_data", "Name": "todo-db", "Options": null, "Scope": "local" } ] 文档说 Mountpoint 是 volumn 在磁盘上的实际位置。 上面的输出是在 window 系统下输出的,那么这个实际位置究竟在哪里?