DevOps持续集成-Jenkins(3)

文章目录

DevOps

DevOps概述

软件开发最初是由两个团队共同组成:(没有采用DevOps之前)

  • 开发团队:从头开始设计和整体系统的构建(编写代码)。需要系统不停的迭代更新。
  • 运维团队:将开发团队的代码进行测试通过后再部署上线。确保系统稳定运行。

没有采用DevOps的缺点:

  • 这看似两个目标不同的团队需要协同完成一个软件的开发。在开发团队指定好计划并完成编写代码后,需要把代码交给运维团队。运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。这时开发团队需要经常等待运维团队的反馈。这无疑会延长整个软件开发的周期。

采用DevOps的优点?

  • DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。说白了就是DevOps有利于快速完成项目,不会浪费时间)

整体的软件开发流程:

  • PLAN:开发团队根据客户的目标制定开发计划
  • CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
  • BUILD:编码完成后,需要将代码构建并且运行。
  • TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
  • DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
  • OPERATE:运维团队将代码部署到生产环境中。
  • MONITOR:项目部署上线后,需要持续的监控产品。
  • INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心即持续集成、持续部署。

为了保证整体流程可以高效的完成,各个阶段都有比较常见的工具,如下图:

Jenkins实战3:实战1和实战2的加强版(新增SonarQube和Harbor)⭐

环境准备⭐
  • 该Jenkins实战3建立在完成Jenkins实战1和Jenkins实战2的内容的基础上!
项目架构图
对比Jenkins实战1和实战2,新增内容有哪些?
  • 新增内容有如下:
    • 1:Jenkins整合SonarQube实现代码质量检测。
    • 2:将Jenkins制作好的镜像推送到Harbor仓库。
SonarQube教程
采用Docker安装SonarQube (在Jenkins所在的服务器上安装)⭐

注意:由于新版的SonarQube不再支持MySQL,而是支持PostgreSQL。那么安装SonarQube时需要先安装PostgreSQL。

  • 1:安装Postgres数据库:
shell 复制代码
docker pull postgres
  • 2:安装SonarQube:(版本是8.9.9社区版)
shell 复制代码
docker pull sonarqube:8.9.9-community
  • 3:新建sonarqube目录:
shell 复制代码
mkdir -p /usr/local/docker/sonarqube_docker
  • 4:跳转到sonarqube目录:
shell 复制代码
cd /usr/local/docker/sonarqube_docker
  • 5:编写sonarqube的docker-compose文件:
shell 复制代码
vi docker-compose.yml

内容如下:

yaml 复制代码
version: "3.1"
services:
  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
  sonarqube:
    image: sonarqube:8.9.9-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
networks:
  sonarnet:
    driver: bridge
  • 6:修改/etc/sysctl.conf文件:
shell 复制代码
vi /etc/sysctl.conf

在该配置文件中,添加下面的内容:(直接复制下面的内容到配置文件中,保存退出即可!)

sh 复制代码
vm.max_map_count=262144
  • 7:让刚刚修改的配置生效:
shell 复制代码
[root@centos7-jenkins sonarqube_docker]# sysctl -p
vm.max_map_count = 262144
  • 8:执行docker-compose文件:
shell 复制代码
docker-compose up -d
访问SonarQube可视化界面⭐
  • 访问地址:sonarqube的ip+9000端口。

  • SonarQube的账号和密码都是admin !

首次登陆SonarQube需要修改密码
  • 我的SonarQube密码修改成admin123456
安装SonarQube中文插件 ⭐




SonarQube的简单使用⭐
下载sonar-scanner(并上传到Jenkins所在的服务器上)

sonar-scanner官网下载地址

  • 查看sonar-scanner-cli是否上传成功:
shell 复制代码
[root@centos7-jenkins ~]# ls
apache-maven-3.8.6-bin.tar.gz  jenkins anaconda-ks.cfg  jdk-8u333-linux-x64.tar.gz     sonar-scanner-cli-4.6.2.2472-linux.zip
安装sonar-scanner
  • 1:由于sonar-scanner-cli是zip格式的压缩文件,而Linux下载解压这种格式文件需要安装一个工具:
shell 复制代码
yum -y install unzip
  • 2:使用unzip解压刚刚上传的sonar-scanner包:
    • 注意:我们下载的sonar-scanner名字可能会不一样,所以这里需要更改!!
shell 复制代码
unzip sonar-scanner-cli-4.6.2.2472-linux.zip
  • 3:修改sonar-scanner解压出来的文件夹名字:
shell 复制代码
mv sonar-scanner-4.6.2.2472-linux sonar-scanner
SonarQube案例1:使用sonar-scanner进行代码质量检测⭐
  • 1:跳转Jenkins宿主机数据卷目录:
shell 复制代码
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data
  • 2:把解压出来的sonar-scanner目录移动到Jenkins宿主机数据卷目录中:
shell 复制代码
[root@centos7-jenkins data]# mv /root/sonar-scanner ./
  • 3:在Jenkins宿主机数据卷目录下执行下面命令,修改sonar-scanner配置:
shell 复制代码
[root@centos7-jenkins data]# vi sonar-scanner/conf/sonar-scanner.properties

我们的配置文件内容如下:(记得下面的ip 192.168.184.80要换成你SonarQube的IP。)

properties 复制代码
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://192.168.184.80:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
  • 4:查看sonar-scanner工具: (所在位置为Jenkins宿主机数据卷的sonar-scanner文件夹中的bin目录下):
    • 跳转到sonar-scanner工具目录下:
shell 复制代码
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/

可以看到下面的sonar-scanner就是我们需要的代码质量检测工具:

shell 复制代码
[root@centos7-jenkins bin]# ls
sonar-scanner  sonar-scanner-debug
  • 5:跳转到我们的Jenkins从gitlab上拉取的mytest项目目录中(该gitlab上的项目也就是我们创建的名为mytest的项目):
    • Jenkins的项目目录也就是在/usr/local/docker/jenkins_docker/data/workspace下。
shell 复制代码
[root@centos7-jenkins ~]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest
  • 6:获取SonarQube的Token:
    • 可以看到我们生成的token是:fa58b2f8903333918bfa22cf0bc07f3ac0e92435



  • 7:查看当前所在目录:
shell 复制代码
[root@centos7-jenkins mytest]# pwd
/usr/local/docker/jenkins_docker/data/workspace/mytest
  • 8:利用sonar-scanner工具对Jenkins拉取的gitlab项目名为"mytest"的项目进行代码质量检测:⭐
    • /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner:上面所说的sonar-scanner工具所在的路径。(如果前面按照我们这样配置,则不需要更改!)
    • -Dsonar.source=./ :需要检测的代码所在的目录(由于上面我们已经切换到代码所在目录中,所在只需要指定./即可,如果前面按照我们这样操作,则不需要更改!)
    • -Dsonar.projectname=linux-mytest:随便指定一个名称作为sonar-scanner的项目名。
    • -Dsonar.login=fa58b2f8903333918bfa22cf0bc07f3ac0e92435:把刚刚复制的token粘贴上去(需要根据自己生成的token进行更改⭐)
    • -Dsonar.projectKey=linux-mytest :随便指定一个名称。
    • -Dsonar.java.binaries=./target/ :指定我们gitlab上的项目生成的二进制文件(也就是class类文件)所在目录,说白了也就是指定gitlab上的项目的target文件夹路径。
shell 复制代码
[root@centos7-jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=linux-mytest -Dsonar.login=fa58b2f8903333918bfa22cf0bc07f3ac0e92435 -Dsonar.projectKey=linux-mytest -Dsonar.java.binaries=./target/
Jenkins整合SonarQube进行代码质量检测⭐
在Jenkins下载SonarQube Scanner插件⭐
在Jenkins配置SonarQube(系统配置)⭐



在Jenkins配置SonarQube(全局配置)⭐
  • 配置提示:
    • 1:SONAR_RUNNER_HOME的值:/var/jenkins_home/sonar-scanner


架构图第4步案例:给Jenkins的mytest任务配置SonarQube自动进行代码质量检测(重点⭐)
  • 配置提示:

    • Execute SonarQube Scanner下面的Analysis properties配置:
    properties 复制代码
    sonar.projectname=${JOB_NAME}
    sonar.projectKey=${JOB_NAME}
    sonar.source=./
    sonar.java.binaries=target
  • 1:由于我们刚刚案例执行过了一次,所以要在Jenkins宿主机上先删除一个目录:

shell 复制代码
[root@centos7-jenkins ~]# rm -rf /usr/local/docker/jenkins_docker/data/workspace/mytest/.scannerwork/
  • 2:开始配置:




  • 3:测试构建(可以看到我们的SonarQube已经整合到Jenkins中了):


Harbor v2.4.2教程
下载安装Harbor⭐
  • 1:先下载好Harbor,然后通过xftp传到服务器上(这里我们还是放在Jenkins所在的服务器上,节约成本):

Harbor v2.4.2下载链接

  • 2:查看是否上传成功:(可以看到上传成功了)
shell 复制代码
[root@centos7-jenkins ~]# ls | grep harbor
harbor-offline-installer-v2.4.2.tgz
  • 3:将Harbor解压到/usr/local下:
shell 复制代码
tar -zxvf harbor-offline-installer-v2.4.2.tgz -C /usr/local
shell 复制代码
cd /usr/local/harbor/
  • 4:将harbor.yaml的模板文件复制一份:
    • Harbor启动时只会加载harbor.yml,而不会加载harbor.yml.tmpl
shell 复制代码
cp harbor.yml.tmpl harbor.yml
  • 5:修改harbor.yml:
shell 复制代码
vim harbor.yml


  • 6:执行Harbor的install脚本文件:(在这之前必须要安装了Docker和Docker Compose。)
    • 当前所在的路径:
shell 复制代码
[root@centos7-jenkins harbor]# pwd
/usr/local/harbor

开始执行:(然后会加载一大堆的东西,需要等一下)

shell 复制代码
[root@centos7-jenkins harbor]# ./install.sh
访问Harbor⭐
  • 访问链接:
    • harbor的ip地址:80端口

创建一个新的Harbor项目


将本地镜像mytest推送到Harbor仓库中⭐
  • 如何将本地镜像推送到Harbor仓库中,最重要的一点就是要将镜像进行改名,格式如下:(只有这样格式的镜像才能够被push到Harbor仓库)
    • 格式为:Harbor地址/Harbor项目名/镜像名:版本
修改daemon.json文件(添加insecure-registries配置⭐)
  • 1:进入编辑器:
shell 复制代码
vi /etc/docker/daemon.json

内容如下:

  • 只添加insecure-registries配置,对应的值为你当前的Harbor地址!!
json 复制代码
{
  "registry-mirrors": [
    "https://u01jo9qv.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "insecure-registries": ["192.168.184.80:80"]   
}
  • 2:重启Docker服务:
shell 复制代码
systemctl restart docker
给mytest镜像改名,使其可以push到Harbor镜像仓库中⭐
  • 1:改名之前,先查看一下mytest镜像:
shell 复制代码
[root@centos7-jenkins harbor]# docker images
REPOSITORY                      TAG               IMAGE ID       CREATED        SIZE
mytest                          v1.0.0            fc62ecfe296d   10 hours ago   661MB
  • 2:给mytest镜像进行改名:(注意:下面的镜像的IP地址一定要改成你当前Harbor的地址)
    • mytest:v1.0.0:旧镜像名称
    • 192.168.184.80:80/repo/mytest:v1.0.0:新镜像名称
shell 复制代码
docker tag mytest:v1.0.0 192.168.184.80:80/repo/mytest:v1.0.0
  • 3:再次查看mytest镜像:(可以看到旧镜像和新镜像的IMAGE ID都是一样的,可以说明这两个其实就是同一个镜像。只是名字不同罢了)
shell 复制代码
[root@centos7-jenkins harbor]# docker images
REPOSITORY                      TAG               IMAGE ID       CREATED        SIZE
mytest                          v1.0.0            fc62ecfe296d   11 hours ago   661MB
192.168.184.80:80/repo/mytest   v1.0.0            fc62ecfe296d   11 hours ago   661MB
开始推送到Harbor仓库⭐
  • 1:首先Docker要先登录Harbor仓库:(docker login):
    • 格式为:docker login -u 用户名 -p 密码 Harbor地址
    • 注意:我们Harbor默认的账号是admin,密码是Harbor12345,所以我们可以用这个账号密码去登录
    • 还有下面的Harbor地址别忘了改成你自己的Harbor地址。
shell 复制代码
docker login -u admin -p Harbor12345 192.168.184.80:80
  • 2:开始push:
shell 复制代码
[root@centos7-jenkins harbor]# docker push 192.168.184.80:80/repo/mytest:v1.0.0
The push refers to repository [192.168.184.80:80/repo/mytest]
5f70bf18a086: Pushed 
34589845b783: Pushed 
35c20f26d188: Pushed 
c3fe59dd9556: Pushed 
6ed1a81ba5b6: Pushed 
a3483ce177ce: Pushed 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Pushed 
v1.0.0: digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d size: 2418
  • 3:查看是否成功Push到Harbor仓库:
测试拉取Harbor镜像
  • 1:先删除原来的mytest镜像:
shell 复制代码
[root@centos7-jenkins harbor]# docker images 
REPOSITORY                      TAG               IMAGE ID       CREATED        SIZE
192.168.184.80:80/repo/mytest   v1.0.0            fc62ecfe296d   25 hours ago   661MB
mytest                          v1.0.0            fc62ecfe296d   25 hours ago   661MB
shell 复制代码
[root@centos7-jenkins harbor]# docker rmi -f fc62ecfe296d
Untagged: 192.168.184.80:80/repo/mytest:v1.0.0
Untagged: 192.168.184.80:80/repo/mytest@sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d
Untagged: mytest:v1.0.0
Deleted: sha256:fc62ecfe296d996c03ac5ef9a0c073f5772aacf382e7f8215d18052d18707982
  • 2:拉取刚刚上传到Harbor仓库的mytest镜像:(注意:这个Harbor镜像被我们设置为公开类型,如果不是公开类型,则不能这样拉取!)
    • 80端口别忘了写。
shell 复制代码
[root@centos7-jenkins harbor]# docker pull 192.168.184.80:80/repo/mytest:v1.0.0
v1.0.0: Pulling from repo/mytest
7448db3b31eb: Already exists 
c36604fa7939: Already exists 
29e8ef0e3340: Already exists 
a0c934d2565d: Already exists 
a360a17c9cab: Already exists 
cfcc996af805: Already exists 
2cf014724202: Already exists 
4bc402a00dfe: Already exists 
bce9a3522658: Already exists 
4f4fb700ef54: Already exists 
Digest: sha256:b9504aee3cc90755bb237d9f91795b75f816558330657ffae4fd3ff92fdaee7d
Status: Downloaded newer image for 192.168.184.80:80/repo/mytest:v1.0.0
192.168.184.80:80/repo/mytest:v1.0.0
Jenkins整合Harbor⭐
让Jenkins容器内部可以使用Docker⭐

默认情况下,Jenkins容器内部是使用不了Docker的,我们这次就是为了解决这种情况。

解决方法有两个:(我们使用的是第二种)

第一种:在Jenkins容器内部安装一个Docker。(缺点是会占用很多的资源,浪费容器空间,不推荐使用)。

第二种:Jenkins容器内部使用宿主机的Docker,也就是说Jenkins容器和宿主机共同使用同一个Docker。(推荐!)

  • 1:切换目录到/var/run/:
shell 复制代码
[root@centos7-jenkins harbor]# cd /var/run/
  • 2:修改docker.sock文件的所属组:
shell 复制代码
[root@centos7-jenkins run]# chown root:root docker.sock
  • 3:修改docker.sock文件的权限:
shell 复制代码
[root@centos7-jenkins run]# chmod o+rw docker.sock
  • 4:切换到Jenkins的docker-compose.yml文件的所在目录上:
shell 复制代码
[root@centos7-jenkins ~]# cd /root/jenkins/
  • 5:如果启动了Jenkins的docker-compose文件,则执行下面的down命令:
shell 复制代码
[root@centos7-jenkins jenkins]# docker-compose down
  • 6:删除这个docker-compose文件:
shell 复制代码
[root@centos7-jenkins jenkins]# rm -rf docker-compose.yml
  • 7:重新编辑Jenkins的docker-compose.yml文件:(其实就是在原来的Jenkins的docker-compose文件多添加了一些volume罢了,所以干脆删除了重新编辑。)
shell 复制代码
[root@centos7-jenkins jenkins]# vi docker-compose.yml

新文件内容如下:

yaml 复制代码
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.359
    container_name: jenkins
    ports:
      - 9200:8080
      - 50000:50000
    volumes:
      - /usr/local/docker/jenkins_docker/data/:/var/jenkins_home/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json
  • 8:启动Jenkins的docker-compose:
shell 复制代码
docker-compose up -d
  • 9:进入Jenkins容器内部,测试现在是否可以使用Docker:(现在我们的Jenkins容器就可以使用Docker了)
shell 复制代码
[root@centos7-jenkins jenkins]# docker exec -it jenkins bash
shell 复制代码
[root@centos7-jenkins jenkins容器]# docker version
架构图第5步案例:Jenkins制作自定义镜像并上传到Harbor⭐
  • 1:修改我们的springboot项目:


  • 2:配置Jenkins:

    • 提示,Execute shell的内容:
      • 修改点1:下面的IP地址要改成你的Harbor的IP地址。
      • 修改点2:harbor账号密码要是和我的不一样则也需要更改。
    properties 复制代码
    mv target/*.jar docker/
    docker build -t mytest:$tag docker/
    docker login -u admin -p Harbor12345 192.168.184.80:80
    docker tag mytest:$tag 192.168.184.80:80/repo/mytest:$tag
    docker push 192.168.184.80:80/repo/mytest:$tag





架构图第6-7步案例:通知目标服务器可以从Harbor上拉取镜像,并运行容器⭐
  • 1:在所有目标服务器上都放一份shell脚本文件:(原理是:Jenkins通知目标服务器去执行shell脚本文件,从而让目标服务器在Harbor上面拉取指定镜像。)
    • 原来的架构图上是把Dockerfile传到目标服务器,让目标服务器通过docker build构建镜像(缺点是当目标服务器有多台,那每一台目标服务器都需要build构建一次,n台服务器就是n次,这样十分浪费服务器资源)。
    • 现在的架构图是把镜像在Jenkins容器内构建,然后把镜像push到Harbor上,Jenkins通知所有目标服务器(不管有多少台),然后目标服务器就会执行下面的shell脚本,会从Harbor拉取指定镜像,这样一来,不管有多少台目标服务器都只是build构建一次,节省了很多资源。
shell 复制代码
vi /root/deploy.sh

内容如下:

sh 复制代码
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

imageName=$harbor_addr/$harbor_repo/$project:$version

containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
fi

tag=`docker images | grep ${project} | awk '{print $2}'`

if [[ "$tag" =~ "$version" ]] ; then
    docker rmi -f $imageName
fi

docker login -u admin -p Harbor12345 $harbor_addr

docker pull $imageName

docker run -d -p $host_port:$container_port --name $project $imageName

echo "SUCCESS"
  • 2:给deploy.sh权限:
shell 复制代码
chmod a+x /root/deploy.sh
  • 3:测试运行deploy.sh:(要更改对应的值)
    • shell脚本参数传值解释:
      • 配置文件的$1为:192.168.184.80:80 (harbor_addr。harbor的地址)
      • 配置文件的$2为:repo(harbor_repo。harbor的项目名)
      • 配置文件的$3为:mytest(project。拉取的镜像名)
      • 配置文件的$4为:v3.0.0(version。拉取的镜像版本)
      • 配置文件的$5为:8082(host_port。宿主机端口)
      • 配置文件的$6为:8082(container_port。容器的端口)
shell 复制代码
cd /root
shell 复制代码
[root@centos7-jenkins ~]# ./deploy.sh 192.168.184.80:80 repo mytest v3.0.0 8082 8082
3fd32cbb9557
3fd32cbb9557
Untagged: 192.168.184.80:80/repo/mytest:v3.0.0
Untagged: 192.168.184.80:80/repo/mytest@sha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
v3.0.0: Pulling from repo/mytest
Digest: sha256:bd9556efbf06af2fba04b482e318111266a725cc2b10edf215e1190874df06b3
Status: Downloaded newer image for 192.168.184.80:80/repo/mytest:v3.0.0
192.168.184.80:80/repo/mytest:v3.0.0
2f73780159ee473a62e0d9e43874c8abcc7e173ac23ee0adfe162c442187e0f4
SUCCESS
  • 4:查看项目镜像容器是否启动:
shell 复制代码
[root@centos7-jenkins ~]# docker ps | grep mytest
3fd32cbb9557   192.168.184.80:80/repo/mytest:v3.0.0   "/bin/sh -c 'java -j..."   38 seconds ago   Up 37 seconds          0.0.0.0:8082->8082/tcp, :::8082->8082/tcp                                                  mytest
  • 5:测试访问项目:
  • 6:把所有目标服务器的deploy.sh都放到/usr/bin下:
shell 复制代码
[root@centos7-jenkins ~]# mv /root/deploy.sh /usr/bin/
  • 7:配置两个端口的字符串参数(宿主机端口和容器端口):



  • 8:配置Jenkins构建后操作:

    • 提示:

      • Exec command的内容:
      sh 复制代码
      deploy.sh 192.168.184.80:80 repo ${JOB_NAME} $tag $host_port $container_port

  • 9:测试构建:

相关推荐
学Linux的语莫3 小时前
kompose、docker转k8s
docker·容器·kubernetes
阿里云云原生3 小时前
探秘 AgentRun丨流量一大就瘫痪?如何解决 AI 模型调用之痛
云原生
是Yu欸4 小时前
从Ascend C算子开发视角看CANN的“软硬协同”
c语言·开发语言·云原生·昇腾·ascend·cann·开放社区
码界奇点5 小时前
基于微服务架构的企业身份与访问管理系统设计与实现
微服务·云原生·架构·车载系统·毕业设计·源代码管理
一点晖光7 小时前
docker配置npm环境变量出现问题
docker·容器·npm
一分半心动7 小时前
windows docker desktop 安装VibeVoice
运维·docker·容器
LucidX8 小时前
Docker核心操作实战
运维·docker·容器
隔壁阿布都8 小时前
Docker Compose中的网络管理
运维·docker·容器
DO_Community9 小时前
从零开始,用 n8n 设计可扩展的自动化工作流
运维·ai·自动化·devops
2301_767902649 小时前
Containerd 从入门到实战
运维·容器