Docker技術解析

1.Docker安裝

1.如果Ubuntu自帶的Docker版本太低,我們需要卸載舊版本并安裝新的

sudo apt-get remove docker docker-engine docker.io containerd runc

2.?備份原有軟件源

 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

3.選擇合適的鏡像源

 # 或者使用清華大學sudo sed -i 's/http:\/\/archive\.ubuntu\.com/http:\/\/mirrors\.tuna\.tsinghua\.edu\.cn/' /etc/apt/sources.list

4.更新包信息

 sudo apt updatesudo apt upgrade -y

5.安裝Docker
接下來,添加Docker官方GPG密鑰

sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

添加Docker官方軟件源

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

然后安裝Docker

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

6.配置和啟動Docker
檢查Docker版本并啟動Docker服務:

docker -v
sudo systemctl start docker

設置開機自啟

sudo systemctl enable docker

2.Docker命令解析

2.1 Docker常用命令

命令

說明

文檔地址

docker pull

拉取鏡像

docker pull

docker push

推送鏡像到DockerRegistry

docker push

docker images

查看本地鏡像

docker images

docker rmi

刪除本地鏡像

docker rmi

docker run

創建并運行容器(不能重復創建)

docker run

docker stop

停止指定容器

docker stop

docker start

啟動指定容器

docker start

docker restart

重新啟動容器

docker restart

docker rm

刪除指定容器

docs.docker.com

docker ps

查看容器

docker ps

docker logs

查看容器運行日志

docker logs

docker exec

進入容器

docker exec

docker save

保存鏡像到本地壓縮文件

docker save

docker load

加載本地壓縮文件到鏡像

docker load

docker inspect

查看容器詳細信息

docker inspect

用一副圖來表示這些命令的關系:

# Docker開機自啟
systemctl enable docker# Docker容器開機自啟
docker update --restart=always [容器名/容器id]

2.2 實踐樣例

以Nginx為例給演示上述命令:

# 第1步,去DockerHub查看nginx鏡像倉庫及相關信息# 第2步,拉取Nginx鏡像 (比較耗時)
docker pull nginx:1.20.2# 第3步,查看鏡像
docker images# 第4步,創建并允許Nginx容器
# 如果本地沒有相應鏡像,會直接從鏡像倉庫拉取鏡像
docker run -d --name nginx -p 80:80 nginx# 第5步,查看運行中容器
docker ps# 也可以加格式化方式訪問,格式會更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,訪問網頁,地址:http://虛擬機地址# 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,再次啟動nginx容器
docker start nginx# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第11步,查看容器詳細信息
docker inspect nginx# 第12步,進入容器,查看容器內目錄
docker exec -it nginx bash# 或者,可以進入MySQL
docker exec -it mysql mysql -uroot -p# 第13步,刪除容器
docker rm nginx# 發現無法刪除,因為容器運行中,強制刪除容器
docker rm -f nginx

解析docker run命令:

docker run -d \--name mysql \-p 3307:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql:8

1.? docker run :創建并運行一個容器

2. -d 是讓容器在后臺運行

3. --name mysql :給容器起個名字,必須唯一

4. -p 3307:3306 :設置端口映射,格式: -p 宿主機端口:容器內端口,示例中就是將宿主機的3307映射到容器內的3306端口。容器是隔離環境,外界不可訪問。但是可以將宿主機端口映射容器內到端口,當訪問宿主機指定端口時,就是在訪問容器內的端口了。

5. -e KEY=VALUE :是設置環境變量

6. mysql:8 :指定運行的鏡像的名字,版本

鏡像的概念:

鏡像中不僅包含了軟件本身,還包含了其運行所需要的環境、配置、系統級函數庫。因此它在運行時就有自己獨立的環境,就可以跨系統運行,也不需要手動再次配置環境了。這套獨立運行的隔離環境我們稱為容器。容器內部是一個完整的Linux 文件系統,容器運行的是鏡像中自帶的環境,不依賴宿主機的環境

鏡像命名規范:

3.數據卷

3.1 數據卷介紹

數據卷(volume)是一個虛擬目錄,是容器內目錄與宿主機目錄之間映射的橋梁。

以Nginx為例,我們知道Nginx中有兩個關鍵的目錄:

  • html:放置一些靜態資源

  • conf:放置配置文件

如果我們要讓Nginx代理我們的靜態資源,最好是放到html目錄;如果我們要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遺憾的是,容器運行的Nginx所有的文件都在容器內部。所以我們必須利用數據卷將兩個目錄與宿主機目錄關聯,方便我們操作。

在上圖中:

  • 我們創建了兩個數據卷:confhtml

  • Nginx容器內部的conf目錄和html目錄分別與兩個數據卷關聯。

  • 而數據卷conf和html分別指向了宿主機的/var/lib/docker/volumes/conf/_data目錄和/var/lib/docker/volumes/html/_data目錄

這樣以來,容器內的confhtml目錄就 與宿主機的confhtml目錄關聯起來,我們稱為掛載

此時,我們操作宿主機的/var/lib/docker/volumes/html/_data就是在操作容器內的/usr/share/nginx/html目錄。只要我們將靜態資源放入宿主機對應目錄,就可以被Nginx代理了。

注:/var/lib/docker/volumes這個目錄就是默認的存放所有容器數據卷的目錄,其下再根據數據卷名稱創建新目錄,格式為/數據卷名/_data

為什么不讓容器目錄直接指向宿主機目錄呢

  • 因為直接指向宿主機目錄就與宿主機強耦合了,如果切換了環境,宿主機目錄就可能發生改變了。由于容器一旦創建,目錄掛載就無法修改,這樣容器就無法正常工作了。

  • 但是容器指向數據卷,一個邏輯名稱,而數據卷再指向宿主機目錄,就不存在強耦合。如果宿主機目錄發生改變,只要改變數據卷與宿主機目錄之間的映射關系即可。不過,我們通過由于數據卷目錄比較深,不好尋找,通常我們也允許讓容器直接與宿主機目錄掛載而不使用數據卷

3.2 數據卷命令

命令

說明

文檔地址

docker volume create

創建數據卷

docker volume create

docker volume ls

查看所有數據卷

docs.docker.com

docker volume rm

刪除指定數據卷

docs.docker.com

docker volume inspect

查看某個數據卷的詳情

docs.docker.com

docker volume prune

清除數據卷

docker volume prune

注意:容器與數據卷的掛載要在創建容器時配置,對于創建好的容器,是不能設置數據卷的。而且創建容器的過程中,數據卷會自動創建。

演示一下nginx的html目錄掛載:

# 1.首先創建容器并指定數據卷,注意通過 -v 參數來指定數據卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx:1.20.2# 2.然后查看數據卷
docker volume ls# 3.查看數據卷詳情
docker volume inspect html# 4.查看/var/lib/docker/volumes/html/_data目錄
ll /var/lib/docker/volumes/html/_data# 5.進入該目錄,并隨意修改index.html內容
cd /var/lib/docker/volumes/html/_data
vi index.html# 6.打開頁面,查看效果# 7.進入容器內部,查看/usr/share/nginx/html目錄內的文件是否變化
docker exec -it nginx bash

-v 數據卷:容器內目錄 用此形式可以完成數據卷掛載(數據卷不存在會自動創建)。宿主機目錄固定:/var/lib/docker/volumes/數據卷名字/_data

掛載本地目錄或文件:

可以發現,數據卷的目錄結構較深,如果我們去操作數據卷目錄會不太方便。在很多情況下,我們會直接將容器目錄與宿主機指定目錄掛載。掛載語法與數據卷類似:

# 掛載本地目錄
-v 本地目錄:容器內目錄# 掛載本地文件
-v 本地文件:容器內文件

注意:本地目錄或文件必須以 /./開頭,如果直接以名字開頭,會被識別為數據卷名而非本地目錄名。

-v mysql:/var/lib/mysql # 會被識別為一個數據卷叫mysql,運行時會自動創建這個數據卷-v ./mysql:/var/lib/mysql # 會被識別為當前目錄下的mysql目錄,運行時如果不存在會創建目錄

刪除并重新創建mysql容器,并完成本地目錄掛載:

  • 掛載/root/mysql/data到容器內的/var/lib/mysql目錄

  • 掛載/root/mysql/init到容器內的/docker-entrypoint-initdb.d目錄(初始化的SQL腳本目錄)

  • 掛載/root/mysql/conf到容器內的/etc/mysql/conf.d目錄(這個是MySQL配置文件目錄)

docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8

4. 自定義鏡像

前面我們一直在使用別人準備好的鏡像,那如果我要部署一個Java項目,把它打包為一個鏡像該怎么做呢? 那接下來,我們就來介紹一下如何自定義鏡像。

4.1 鏡像結構

鏡像之所以能讓我們快速跨操作系統部署應用而忽略其運行環境、配置,就是因為鏡像中包含了程序運行需要的系統函數庫、環境、配置、依賴。因此,自定義鏡像本質就是依次準備好程序運行的基礎環境、依賴、應用本身、運行配置等文件,并且打包而成。

我們要從0部署一個Java應用,大概流程是這樣:

  • 準備一個linux服務(CentOS或者Ubuntu均可)

  • 安裝并配置JDK

  • 上傳Jar包

  • 運行jar包

那因此,我們打包鏡像也是分成這么幾步:

  • 準備Linux運行環境(java項目并不需要完整的操作系統,僅僅是基礎運行環境即可)

  • 安裝并配置JDK

  • 拷貝jar包

  • 配置啟動腳本

上述步驟中的每一次操作其實都是在生產一些文件(系統運行環境、函數庫、配置最終都是磁盤文件),所以鏡像就是一堆文件的集合

但需要注意的是,鏡像文件不是隨意堆放的,而是按照操作的步驟分層疊加而成,每一層形成的文件都會單獨打包并標記一個唯一id,稱為Layer)。這樣,如果我們構建時用到的某些層其他人已經制作過,就可以直接拷貝使用這些層,而不用重復制作。

例如,第一步中需要的Linux運行環境,通用性就很強,所以Docker官方就制作了這樣的只包含Linux運行環境的鏡像。我們在制作java鏡像時,就無需重復制作,直接使用Docker官方提供的CentOS或Ubuntu鏡像作為基礎鏡像。然后再搭建其它層即可,這樣逐層搭建,最終整個Java項目的鏡像結構如圖所示:

4.2 Dockerfile

由于制作鏡像的過程中,需要逐層處理和打包,比較復雜,所以Docker就提供了自動打包鏡像的功能。我們只需要將打包的過程,每一層要做的事情用固定的語法寫下來,交給Docker去執行即可。而這種記錄鏡像結構的文件就稱為Dockerfile

說明

示例

指定基礎鏡像

FROM centos:7

設置環境變量,可在后面指令使用

ENV key value

拷貝本地文件到鏡像的指定目錄

COPY ./xx.jar /tmp/app.jar

執行Linux的shell命令,一般是安裝過程的命令

RUN yum install gcc

指定容器運行時監聽的端口,是給鏡像使用者看的

EXPOSE 8080

鏡像中應用的啟動命令,容器運行時調用

ENTRYPOINT java -jar xx.jar

例如,要基于 centos:7 鏡像來構建一個Java應用,其Dockerfile內容如下:

# 使用 CentOS 7 作為基礎鏡像
FROM centos:7# 添加 JDK 到鏡像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz# 設置環境變量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH# 創建應用目錄
RUN mkdir -p /app
WORKDIR /app# 復制應用 JAR 文件到容器
COPY app.jar app.jar# 暴露端口
EXPOSE 8080# 運行命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

Dockerfile文件編寫好了之后,就可以使用如下命令來構建鏡像了。

docker build -t 鏡像名 .
  • -t :是給鏡像起名,格式依然是repository:tag的格式,不指定tag時,默認為latest

  • . :是指定Dockerfile所在目錄,如果就在當前目錄,則指定為"."

5. 網絡

首先,我們查看下MySQL容器的詳細信息,重點關注其中的網絡IP地址:

# 1.用基本命令,尋找Networks.bridge.IPAddress屬性
docker inspect mysql# 也可以使用format過濾結果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql# 得到IP地址如下:
172.17.0.2# 2.然后通過命令進入dd容器
docker exec -it dd bash# 3.在容器內,通過ping命令測試網絡
ping 172.17.0.2# 結果
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms

發現可以互聯,沒有問題。

但是,容器的網絡IP其實是一個虛擬的IP,其值并不固定與某一個容器綁定,如果我們在開發時寫死某個IP,而在部署時很可能MySQL容器的IP會發生變化,連接會失敗。

常見命令有:

命令

說明

docker network create

創建一個網絡

docker network ls

查看所有網絡

docker network rm

刪除指定網絡

docker network prune

清除未使用的網絡

docker network connect

使指定容器連接加入某網絡

docker network disconnect

使指定容器連接離開某網絡

docker network inspect

查看網絡詳細信息

自定義網絡:

# 1.首先通過命令創建一個網絡
docker network create itheima# 2.然后查看網絡
docker network ls# 結果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   itheima     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了itheima以外,其它都是默認的網絡# 3.讓 myapp 和 mysql 都加入該網絡
# 3.1.mysql容器,加入 itheima 網絡
docker network connect itheima mysql# 3.2.myapp容器,也就是我們的java項目, 加入 itheima 網絡
docker network connect itheima myapp# 4.進入dd容器,嘗試利用別名訪問db
# 4.1.進入容器
docker exec -it myapp bash# 4.2.用容器名訪問
ping mysql# 結果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

現在無需記住IP地址也可以實現容器互聯了。

6.Docker項目部署

我們將一個SpringBoot測試項目打包為鏡像并部署

1.項目配置文件

2.項目打成jar包

3.編寫Dockerfile文件

# 第一階段:使用 Maven 鏡像構建項目
FROM maven:3.8.4-openjdk-17 AS builder# 設置工作目錄
WORKDIR /app# 復制項目的 pom.xml 和 src 目錄到容器中
COPY pom.xml .
COPY src ./src# 使用 Maven 構建項目并跳過測試
RUN mvn clean package -DskipTests# 第二階段:使用 Ubuntu 鏡像運行應用
FROM ubuntu:20.04# 安裝必要的工具(如 curl 用于健康檢查等)
RUN apt-get update && apt-get install -y \curl \&& rm -rf /var/lib/apt/lists/*# 設置工作目錄
WORKDIR /app# 從 builder 階段復制構建好的 JAR 文件到當前階段
COPY --from=builder /app/target/*.jar app.jar# 暴露端口 8080
EXPOSE 8080# 容器啟動時執行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

4.服務器配置JDK環境并將jar包和Dockerfile文件上傳到服務器項目路徑下

5.構建鏡像

docker build -t test:1.0 .

6.部署容器

docker run -d 
--name test-server
-p 8080:8080
test:1.0

通過 docker logs -f 容器名,就可以查看容器的運行日志。

這樣后端服務,就已經啟動起來了。

7.DockerCompose

家可以看到,我們部署一個簡單的java項目,其中包含3個容器:

  • MySQL

  • Nginx

  • Java項目

而稍微復雜的項目,其中還會有各種各樣的其它中間件,需要部署的東西遠不止3個。如果還像之前那樣手動的逐一部署,就太麻煩了。而Docker Compose就可以幫助我們實現多個相互關聯的Docker容器的快速部署。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器。

基本語法:

docker-compose文件中可以定義多個相互關聯的應用容器,每一個應用容器被稱為一個服務(service)。由于service就是在定義某個應用的運行時參數,因此與docker run參數非常相似。

舉例來說,用docker run部署MySQL的命令如下:

docker run -d \
--name nginx-tlias \
-p 80:80 \
-v /usr/local/app/html:/usr/share/nginx/html \
-v /usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf \  
--network itheima \
nginx:1.20.2

如果用docker-compose.yml文件來定義,就是這樣:

services:mysql:image: "nginx:1.20.2"container_name: nginx-tliasports:- "80:80"volumes:- "/usr/local/app/html:/usr/share/nginx/html"- "/usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf"networks:- itheima
networks:itheima:name: itheima

對比如下:

docker run 參數

docker compose 指令

說明

--name

container_name

容器名稱

-p

ports

端口映射

-e

environment

環境變量

-v

volumes

數據卷配置

--network

networks

網絡

services:mysql:image: mysql:8container_name: mysqlports:- "3307:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"- "/usr/local/app/mysql/data:/var/lib/mysql"- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"networks:- tlias-nettlias:build: context: .dockerfile: Dockerfilecontainer_name: tlias-serverports:- "8080:8080"networks:- tlias-netdepends_on:- mysqlnginx:image: nginx:1.20.2container_name: nginxports:- "80:80"volumes:- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"- "/usr/local/app/nginx/html:/usr/share/nginx/html"depends_on:- tliasnetworks:- tlias-net
networks:tlias-net:name: itheima

基礎命令:
編寫好docker-compose.yml文件,就可以部署項目了。語法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可選參數,比較常見的有:

類型

參數或指令

說明

Options

-f

指定compose文件的路徑和名稱

-p

指定project名稱。project就是當前compose文件中設置的多個service的集合,是邏輯概念

Commands

up

創建并啟動所有service容器

down

停止并移除所有容器、網絡

ps

列出所有啟動的容器

logs

查看指定容器的日志

stop

停止容器

start

啟動容器

restart

重啟容器

top

查看運行的進程

exec

在指定的運行中容器中執行命令

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96720.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP套接字的使用

Java中使?TCP協議通信,使用ServerSocket來建立鏈接,使用Socket進行通信.ServerSocketServerSocket是創建TCP服務端Socket的api,主要方法:方法簽名說明ServerSocket(int port)創建一個服務端流套接字Socket,并綁定指定端口Socket accpet()開始監聽指定端口,有客戶端鏈接后,返回…

linux執行systemctl enable xxxxx 報 Failed to execute operation: Bad message

linux執行systemctl enable redis.service 報 Failed to execute operation: Bad message 如果在執行 systemctl enable 命令時遇到 "Failed to execute operation: Bad message" 錯誤,可能是由于以下幾個原因導致的。你可以按照以下步驟進行排查和解決&a…

終端之外:解鎖Linux命令行的魔法與力量

Linux命令行的核心理念 在記憶具體的指令之前,先理解它的哲學: 一切皆文件 :硬件設施,進程,目錄…在Linux中幾乎所有資源都被抽象為文件,這意味著你可以通過同樣的指令(如 ench ,cat&#xff…

CSS 動畫實戰:實現電商中“加入購物車”的拋物線效果

引言 在電商網站中,“加入購物車”動畫 是提升用戶體驗的經典交互之一。一個小小的商品圖標從頁面飄向購物車,不僅直觀地反饋了操作結果,還能增加趣味性與沉浸感。 實現這一效果的方式有很多,比如 JavaScript 計算路徑 動畫&…

深度學習之損失函數

深度神經網絡由多層網絡連接而成,網絡連接處防止線性直接相關,采用非線性函數進行逐層隔離,真正實現每層參數的獨立性,也就是只對本層提取到的特征緊密相關。因為如果是線性函數直接相連就成了一層中間網絡了,只不過參…

Oracle OCP認證考試題目詳解082系列第32題

考察知識點:Oracle profiles(配置文件) 英語題目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:單節點與副本集的最佳實踐

Docker 部署 MongoDB:單節點與復制集的企業級最佳實踐引言:容器化有狀態服務的范式轉變第一部分:基礎概念與生產環境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount:生產環境抉擇1.3 獲取與驗證官方鏡像官方鏡像默認…

公司本地服務器上搭建部署的辦公系統web項目網站,怎么讓外網訪問?有無公網IP下的2種通用方法教程

本地物理服務器計算機搭建部署應用包括網站等,然后在局域網內的訪問外,還需要提供外地的連接訪問,這是比較常見的跨網通信需求。如在家或在外訪問公司內部辦公系統網站,這就涉及內網IP和公網IP的轉換,或域名的解析使用…

整體設計 之 緒 思維導圖引擎 之 引 認知系統 之 引 認知系統 之 序 認知元架構 之6 拼句 之1 (豆包助手 之8)

摘要(AI生成)認知演進 中 交流句子所包含的 信息描述框架 < i , j > ( m , n )本體論基礎&#xff08;數學約束&#xff09;&#xff1a; n n元&#xff08;維度&#xff09;n次&#xff08;層次&#xff09;n個&#xff08;方程&#xff09;n場&#xff08;場景&am…

微軟的兩個調試器debugpy和python

在生成launch.json文件時&#xff0c;新版本的python擴展解釋器類型是debugpy&#xff0c;而不是就版本的type:python&#xff0c;那么兩者的區別在哪&#xff1f;1. 歷史演變背景&#xff08;1&#xff09;舊版&#xff08;Python擴展 < 2021.09&#xff09;使用 "typ…

【連載2】C# MVC 自定義錯誤頁設計:404/500 處理與 SEO 優化

在開發ASP.NET MVC 應用時&#xff0c;自定義錯誤頁是提升用戶體驗和 SEO 表現的重要環節。默認的錯誤頁不僅不美觀&#xff0c;還可能泄露技術細節&#xff0c;影響用戶體驗和搜索引擎排名。 實現自定義錯誤頁的完整代碼 配置 Web.config 自定義錯誤頁 在 ASP.NET 中&#…

mcp解讀——概述及整體架構

概念介紹 什么是模型上下文協議 &#xff08;MCP&#xff09; MCP&#xff08;模型上下文協議&#xff09;是一種用于將 AI 應用程序連接到外部系統的開源標準。 使用 MCP&#xff0c;Claude 或 ChatGPT 等人工智能應用程序可以連接到數據源&#xff08;例如本地文件、數據庫&a…

AI 賦能云端運維:基于 MCP 協議深度集成 Codebuddy CLI 與騰訊云 Lighthouse 的實戰全解

摘要 在云計算技術飛速演進的今天&#xff0c;服務器的管理與運維正經歷著從傳統手動操作、腳本自動化到智能化、對話式交互的深刻變革。本文將系統性地、全流程地展示如何將騰訊云 Lighthouse 輕量應用服務器與尖端的 AI 編程助手 Codebuddy CLI 進行深度集成。我們將從服務器…

【Proteus仿真】【51單片機】教室燈光控制器設計

文章目錄一、功能簡介二、軟件設計三、實驗現象聯系作者一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使用LCD1602液晶、DS1302時鐘模塊、人體紅外感應模塊、開關LED指示燈、繼電器、PCF8591 ADC模塊、光敏傳感器、按鍵模塊等。 主要功能&#xff1a; 系統運…

成為一個年薪30W+的FPGA工程師是一種什么體驗?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是現場可編程門陣列&#xff0c;通過硬件描述語言設計電路&#xff0c;可實現并行計算&#xff0c;廣泛應用于通信、人工智能、工業控制等領域。FPGA工程師的工作包括RTL設計、仿真驗證、時序分析等。盡管并非所有公…

ZooKeeper Java客戶端與分布式應用實戰

1. ZooKeeper Java客戶端實戰 ZooKeeper應用開發主要通過Java客戶端API連接和操作ZooKeeper集群&#xff0c;有官方和第三方兩種客戶端選擇。 1.1 ZooKeeper原生Java客戶端 依賴引入 <dependency><groupId>org.apache.zookeeper</groupId><artifactId>…

0303 【軟考高項】項目管理概述 - 組織系統(項目型組織、職能型組織、矩陣型組織)

0303 【軟考高項】項目管理概述 - 組織系統&#xff08;項目型組織、職能型組織、矩陣型組織&#xff09; 目錄0303 【軟考高項】項目管理概述 - 組織系統&#xff08;項目型組織、職能型組織、矩陣型組織&#xff09;一、基本概念二、職能型組織二、項目型組織三、矩陣型組織3…

計算機視覺與模式識別前沿一覽:2025年8月arXiv 熱點研究趨勢解析

本推文分析了arXiv中Computer Vision and Patteren Recognition(計算機視覺與模式識別)領域2025年8月發布的近50篇論文的研究熱點&#xff0c;旨在幫助讀者快速了解近期領域內的前沿技術與研究方向。arXiv是全球最具影響力的開放電子預印本平臺之一&#xff0c;由美國國家科學基…

vim復制本地到linux服務器上,換行縮進過大,不對的問題

所搜的試了:setlocal shiftwidth? :setlocal tabstop? :setlocal expandtab? :setlocal softtabstop?" 設置為 4 個空格縮進 :setlocal shiftwidth4" 通常你會希望 tabstop 和 softtabstop 也保持一致 :setlocal tabstop4 :setlocal softtabstop4嘗試完不起作用&…

【小程序】微信小程序九宮格抽獎動畫(完整版)

這是一個微信小程序九宮格抽獎頁面的完整代碼&#xff0c;包括 WXML、WXSS、JS 和 JSON。 效果 九宮格抽獎功能說明&#xff1a; 靜態頁面布局&#xff1a; 3x3 九宮格&#xff0c;中間是“立即抽獎”按鈕&#xff0c;周圍是獎品金額。抽獎動畫&#xff1a; 點擊“立即抽獎”…