docker 進階命令(基于Ubuntu)

數據卷 Volume: 目錄映射, 目錄掛載

匿名綁定:

匿名綁定的 volume 在容器刪除的時候, 數據卷也會被刪除, 匿名綁定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data
綁定卷時修改宿主機的目錄或文件, 容器內的數據也會同步修改, 反之亦然

# 查看所有 volume
docker volume ls# 用法: -v [容器內目錄]      僅僅指定容器內的目錄, 不指定宿主機的目錄, 默認會自動創建一個匿名卷
docker run -d -p 80:80 --rm --name nginx_volume01 -v /usr/share/nginx/html nginx# 查看卷詳情
docker inspect nginx_volume01              # 里面 Mounts 的關鍵詞就是 映射卷信息
docker volume ls

具名綁定:

具名綁定與匿名綁定是類似的, 只是具名綁定會指定一個名字, 具名綁定卷在容器刪除的時候, 數據卷不會刪除, 具名綁定是可以做到持久化的, 路徑一般是 /var/lib/docker/volumes/xxxxx/_data

# 用法: -v [卷別名]:[容器內目錄]  指定卷名和容器內的目錄, 創建后由docker統一管理
docker run -d -p 80:80 --rm --name nginx_volume02 -v nginx_test:/usr/share/nginx/html nginx# 查看卷詳情
docker inspect nginx_volume02
docker volume ls               # 會查到一個名字為 nginx_test 的卷# 重新創建新的容器并使用持久化掛載卷
## 先進行刪除
docker stop nginx_volume02
docker rm nginx_volume02## 重新創建新的容器并使用持久化掛載卷
docker run -d -p 80:80 --rm --name nginx_volume -v nginx_test:/usr/share/nginx/html nginx## 查看
docker inspect nginx_volume
docker volume ls

Bing Mount:

前面兩種方式都是docker內部自動管理這些卷的, 但是bing mount是手動管理這些卷的, 也就是手動指定宿主機的目錄和容器內的目錄

# 用法: -v [宿主機的目錄]:[容器內的目錄]  指定宿主機的目錄和容器內的目錄
# 可以映射多個目錄, 一個 -v 只能映射一個目錄, 多個目錄需要多個 -v
docker run -d -p 80:80 --rm --name nginx_volume03 -v /root/projects/www/nginx_test:/usr/share/nginx/html nginx# 查看卷詳情
docker inspect nginx_volume03
docker volume ls

volume 的常用命令

# 查看幫助
docker volume --help# 列出所有 volume
docker volume ls# 查看卷詳情
docker volume inspect [卷名]# 刪除一個 volume
docker volume rm [卷名]# 清理無用的 volume
docker volume prune

網絡配置 Network

  • 提供了多種模型, 可以定制化為每個容器制定不同的網絡
  • 自定義網絡模式, 劃分不同的子網以及網關, dns等配置
  • 網絡互通
    • 實現不同子網之間的網絡互通
    • 基于容器名(主機名)的方式在網絡內訪問

網絡模式

bridge 模式 (橋接模式), 默認使用

在主機中創建一個 docker0 的虛擬網橋(虛擬交換機), 在 docker0 創建一對虛擬網卡, 有一半在宿主機上 vethxxxx, 還是一半在容器內 eth0
在這里插入圖片描述

bridge 模式 容器互聯通信
# 啟動兩個容器, 用于測試兩個容器之前的通信
docker run -d -P --rm --name centos_network1 centos tail -f /dev/null
## tail -f /dev/null  是讓容器啟動時運行的命令, 為了讓容器一直運行, 不退出# 使用 --link 參數, 讓兩個容器之間建立連接
docker run -d -P --rm --name centos_network2 --link centos_network1 centos tail -f /dev/null# 測試兩個容器是否可以通信
docker exec -it centos_network2 ping centos_network1     # 由于 centos_network2     link     centos_network1, 所以可以通信
docker exec -it centos_network1 ping centos_network2     # 但是 centos_network1 不能 ping centos_network2, 因為 --link 參數是單向的# 參看容器的詳細信息
docker inspect centos_network1
docker inspect centos_network2

host 模式 (主機模式)

容器將不會獲得一個獨立的網絡命名空間, 而是和宿主機共享網絡命名空間, 容器將不會虛擬出自己的網卡以及配置自己的 IP 等, 那么基于該模式啟動的容器對應的ip實際就是與宿主機同一個子網, 同一個網段
192.168.113.1 --> 192.168.113.x
在這里插入圖片描述

none 模式

docker 會擁有自己的網絡空間, 不與宿主機共享, 在這個網絡模式下的容器, 不會被分配網卡 ip 路由等相關信息
特點: 完全隔離, 與外部任何機器都無網絡訪問, 只有自己的本地網絡lo網卡, 即127.0.0.1
在這里插入圖片描述

container 模式

新建的容器和已經存在的一個容器共享一個網絡命名空間, 新的容器不會創建自己的網卡以及配置自己的 IP, 而是和指定的容器共享 IP, 端口范圍等. 同樣, 新的容器也不能訪問已經存在的容器, 兩者除了網絡方面, 其他方面都是獨立的
在這里插入圖片描述

自定義網絡模式(推薦)

不使用docker自帶的網絡模式, 而是自己去定制化自己特有的網絡模式, 比如劃分不同的子網, 網關, dns等配置

  • 自定義網絡模式, 劃分不同的子網以及網關, dns等配置
  • 網絡互通
    • 實現不同子網之間的網絡互通
    • 基于容器名(主機名)的方式在網絡內訪問
自定義網絡創建
  • 查看主機的網絡
# 查看網絡的命令
ifconfig
# 或
ip addrdocker network [Command]
# 如:
docker network --help
docker network ls
  • 創建自定義網絡
# 創建自定義網絡
docker network create --help## 創建一個名為 wolfcode的網絡, 子網為 192.168.30.0/24, 網關為 192.168.30.1
docker network create --driver bridge --subnet 192.168.30.0/24 --gateway 192.168.30.1 wolfcode
# --driver bridge 指定網絡模式為 bridge 模式, docker默認就是 bridge 模式, 可以不寫
# --subnet 192.168.30.0/24 指定子網, 橋接模式可以自定義, 但注意子網盡量不要和宿主機的子網沖突(可以使用 ifconfig/ip addr 查看宿主機的子網)
# --gateway 192.168.30.1 指定網關, 網關的ip地址需要和子網在同一個網段
# wolfcode 自定義網絡名稱# 查看網絡是否在里面
docker network ls# ifconfig 或 ip addr 也可以查看網絡
ifconfig
# 或
ip addr
  • 自定義網絡啟動容器
# 啟動一個 nginx 容器, 指定網絡為 wolfcode
docker run -d -p 3001:80 --rm --name nginx_network1 --net wolfcode nginx
## --net wolfcode 指定網絡模式為使用自定義的 wolfcode 網絡
## 啟動容器時指定網絡 --net# 查看容器網絡詳情
docker inspect nginx_network1# 進入容器內部看網絡相關的信息
docker exec -it nginx_network1 /bin/bash
ip addr 
## 有些容器沒有 ip addr 命令, 可以使用參看 hosts 文件的方式查看容器內部的主機名對應的ip地址是否與自定義網絡配置一致
cat /etc/hosts
容器互聯通信
# 啟動兩個 centos 容器, 指定網絡為 wolfcode, 測試容器之間是否可以相互通信
docker run -d -P --rm --name centos_network1 --net wolfcode centos tail -f /dev/null
docker run -d -P --rm --name centos_network2 --net wolfcode centos tail -f /dev/null
## -P 隨機端口映射
## --net wolfcode 指定網絡模式為使用自定義的 wolfcode 網絡
## centos 是鏡像名稱
## tail -f /dev/null 是為了讓容器一直運行, 否則容器會自動停止# 查看容器的網絡詳情
docker inspect centos_network1
docker inspect centos_network2# 進入容器內部看網絡相關的信息
docker exec -it centos_network1 /bin/bash
cat /etc/hosts
## 192.168.30.2	centos_network1# 也可以使用 ifconfig 或 ip addr 查看網絡信息
ifconfig
# 或
ip addr# 在 centos_network1 容器內部 ping centos_network2, 測試容器之間是否可以基于主機名相互通信
ping centos_network2# 也可以直接使用docker exec -it 使用容器執行ping命令
docker exec -it centos_network1 ping centos_network2
## ping centos_network2  是ping centos_network2 的主機名, 而不是ip地址, 測試容器之間是否可以基于主機名進行通信

不同網絡下容器互相通信

在這里插入圖片描述

測試: 默認的bridge網絡容器和自定義的wolfcode網絡容器通信問題

# 使用不同的兩個網絡模式啟動兩個容器, 測試容器之間是否可以相互通信
# 啟動一個 centos 容器, 默認網絡為 bridge
docker run -d -P --rm --name centos_network1 centos tail -f /dev/null# 啟動一個 centos 容器, 自定義網絡為 wolfcode
docker run -d -P --rm --name centos_network2 --net wolfcode centos tail -f /dev/null# 查看容器的網絡詳情
docker inspect centos_network1
docker inspect centos_network2# 嘗試 centos_network2 去 ping centos_network1, 測試容器之間是否可以相互通信
docker exec -it centos_network1 ping centos_network2
## 或
docker exec -it centos_network1 ping 192.168.30.2
## 結果: 兩種方式都無法ping通, 因為兩個容器不在同一個網絡下, 無法相互通信

解決方案: docker network connect

# 將 centos_network1 容器連接到 wolfcode 網絡下
docker network connect wolfcode centos_network1# 查看容器的網絡詳情
docker inspect centos_network1
docker inspect centos_network2# 嘗試 centos_network2 去 ping centos_network1, 測試容器之間是否可以相互通信
docker exec -it centos_network1 ping centos_network2
## 或
docker exec -it centos_network1 ping 192.168.30.2
## 結果: 可以ping通, 因為兩個容器在同一個網絡下, 可以相互通信

Dockerfile

Dockerfile 常見的命令

dockerfile 官方文檔

FROM: 指定基礎鏡像

在 Dockerfile 中,FROM 是指定基礎鏡像的指令,也是所有 Dockerfile 的開頭命令。該命令用于設置構建鏡像所依賴的基礎鏡像

細節和用法說明
  1. 功能

    • 指定當前鏡像所基于的基礎鏡像。
    • 基礎鏡像必需是 Docker Hub 上的公開鏡像或自定義鏡像倉庫中的鏡像。
    • Dockerfile 中每個階段的多階段構建可以有多個 FROM,但每個階段只能有一個 FROM
  2. 語法

    • 基礎語法:
      FROM <鏡像名>[:<版本標識>] [AS <階段名稱>]
      
  3. 示例

    • 指定 CentOS 7 為基礎鏡像:

      FROM centos:7
      
    • 指定 Ubuntu 最新版本為基礎鏡像(latest 是默認標簽):

      FROM ubuntu
      
    • 使用多階段構建(命名階段):

      FROM node:16 AS builder
      RUN npm install
      

MAINTAINER: 指定鏡像的作者

MAINTAINER 是 Dockerfile 中的舊指令,用于聲明鏡像創建者的信息(比如姓名和郵箱)。不過這個指令已經被棄用,建議使用 LABEL 指令來代替。

細節和用法說明
  1. 功能

    • 指定鏡像的維護者,方便鏡像的使用者進行聯系或了解鏡像作者信息。
    • 建議使用 LABEL maintainer="作者信息" 來替代。
  2. 語法

    MAINTAINER <作者信息>
    
  3. 示例

    • 使用 MAINTAINER 指令指定作者名與郵箱:

      MAINTAINER wolfcode <wolfcode@wolfcode.cn>
      
    • 替代寫法(推薦):

      LABEL maintainer="wolfcode <wolfcode@wolfcode.cn>"
      

LABEL: 指定鏡像的標簽元數據

LABEL 指令用于為鏡像添加描述性元數據,如版本、作者、描述信息等。

細節和用法說明
  1. 功能

    • LABEL 為鏡像添加鍵值對類型的元數據。
    • 可以為鏡像添加多條 LABEL 信息,也可以在一條 LABEL 指令中定義多個鍵值對。
  2. 語法

    • 單條 LABEL 語法:

      LABEL <key>=<value>
      
    • 多條 LABEL

      LABEL <key1>=<value1> <key2>=<value2>
      
    • 推薦換行書寫:

      LABEL key1=value1 \key2=value2 \key3=value3
      
  3. 示例

    • 添加版本和描述信息:

      LABEL version="1.0"
      LABEL description="This is a test Dockerfile"
      
    • 使用換行格式:

      LABEL version="1.0" \description="This is a test" \maintainer="Name <name@example.com>"
      

ENV: 在容器中設置環境變量

ENV 指令用于在容器構建過程中設置環境變量。設置的變量可以在運行時通過 $NAME 引用,也會影響到所有后續的指令。

細節和用法說明
  1. 功能

    • 在容器中設置環境變量,讓變量可以在整個容器內被引用或用作配置參數。
    • 允許在執行指令時引用環境變量,例如設置 PATH
  2. 語法

    • 設置單個環境變量:

      ENV <key> <value>
      
    • 設置多個環境變量:

      ENV key1=value1 key2=value2 ...
      
  3. 示例

    • 設置 JAVA_HOME 和更新 PATH

      ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
      ENV PATH $PATH:$JAVA_HOME/bin
      
    • 一次性設置多個變量:

      ENV JAVA_HOME=/usr/lib/java PATH=$PATH:$JAVA_HOME/bin
      
    • 在運行時可通過 echo 查看:

      docker run --rm my-image bash -c "echo $JAVA_HOME"
      

RUN: 容器中執行 Shell 命令

RUN 指令用于在鏡像構建過程中執行命令。每個 RUN 都會創建一個新的鏡像層。

細節和用法說明
  1. 功能

    • 在鏡像構建過程中執行命令,例如安裝依賴、修改配置文件等。
    • 可以通過 shell 或 exec 形式運行指令。
  2. 語法

    • Shell 形式(默認):

      RUN <command>
      
    • Exec 形式(推薦,當需要精確控制參數時):

      RUN ["<executable>", "<param1>", "<param2>", ...]
      
  3. 示例

    • 使用 yum 安裝 vim

      RUN yum install -y vim
      
    • 執行多個命令:

      RUN mkdir -p /app && cd /app && touch test.txt
      
    • 使用 Exec 形式:

      RUN ["apt-get", "install", "-y", "curl"]
      

ADD: 復制并自動解壓文件

ADD 指令用于將宿主機的文件復制到容器中,同時支持自動解壓(比如 zip)。ADD 可以從 URL 下載資源。

細節和用法說明
  1. 功能

    • 將本地或遠程文件添加到鏡像中。
    • 如果源為壓縮文件(如 .tar.gz),會自動解壓到目標路徑。
  2. 語法

    ADD <src> <dest>
    
  3. 示例

    • 單文件復制:
      ADD ./data.txt /app/
      
    • 自動解壓 zip 文件:
      ADD ./data.zip /app/
      

COPY: 純粹復制文件(不會解壓)

COPY 是用于將主機上的文件和目錄復制到鏡像中,與 ADD 類似,但不支持 URL 或解壓功能。

細節和用法說明
  1. 功能

    • 將本地文件復制到鏡像中,簡單且純粹,不提供額外解壓功能。
  2. 語法

    COPY <src> <dest>
    
  3. 示例

    COPY ./data.txt /app/
    

WORKDIR: 指定工作目錄

WORKDIR 用于設置容器中的工作目錄。如果路徑不存在,會自動創建。

細節和用法說明
  1. 功能

    • 指定接下來指令的工作目錄(如 COPYRUN 等)。
  2. 語法

    WORKDIR /path/to/dir
    
  3. 示例

    WORKDIR /app
    RUN touch file.txt
    

VOLUME:

在 Dockerfile 中,VOLUME 指令用于聲明一個或多個可以掛載數據的掛載點(Mount Point),這些掛載點對應于容器中的目錄。通過使用 VOLUME,你可以確保這些目錄中的數據可以被獨立保存,即使容器被移除,數據仍然可以持久化。

細節和用法說明
  1. 功能

    • 它在容器運行時定義了一個掛載點。注意,VOLUME 指令本身并不會把宿主機的路徑掛載到容器中,而是告訴 Docker,這些指定的路徑應該被掛載為匿名卷。
    • VOLUME 聲明的目錄默認會生成一個 Docker 卷,并將其掛載到容器中指定的路徑。
    • 后續在 docker run 階段,你可以通過 -v--mount 參數,將自定義的宿主機目錄掛載到這些掛載點來覆蓋 Docker 默認生成的卷。
  2. 語法

    • 單路徑聲明:VOLUME <路徑>
    • 多路徑聲明(以空格分隔):VOLUME <路徑1> <路徑2> ...
    • JSON 數組形式聲明:VOLUME ["<路徑1>", "<路徑2>", ...]
    # 單路徑聲明
    VOLUME /data# 多路徑聲明
    VOLUME /data1 /data2# 使用 JSON 數組形式
    VOLUME ["/data", "/data2"]
    
  3. 運行時掛載

    • 當你在 Dockerfile 中使用 VOLUME 后,如果運行容器時沒有特別指定掛載點(未使用 -v--mount 參數),Docker 會自動為這些路徑創建匿名卷(Anonymous Volumes)。這些卷存儲的數據會被獨立保存,并不依賴容器的生命周期。
    • 如果運行容器時使用 -v <主機目錄>:<容器目錄>--mount,你可以將宿主機目錄掛載到 VOLUME 聲明的路徑中。
  4. 注意事項

    • 鏡像構建階段不能往 VOLUME 聲明的路徑寫入文件

      • 在 Dockerfile 中,一旦路徑被 VOLUME 聲明后,在后續的構建中,無法再對這些路徑寫入文件,因為這些路徑的數據源已經被抽象為外部卷。
    • 使用默認匿名卷可能會增加清理復雜性

      • 如果你不明確指定掛載路徑,Docker 會創建匿名卷,并可能隨著容器增多而占用存儲空間。因此,推薦在 docker run 階段明確指定宿主機路徑或命名卷,避免創建難以管理的匿名卷。
  5. 簡單示例分析

Dockerfile

FROM ubuntu:latest
VOLUME /data
CMD ["echo", "Data Volume Example!"]

構建鏡像

docker build -t volume-example .

默認情況下運行容器

docker run --name my-container volume-example
  • 此時 Docker 會為 /data 路徑自動創建匿名卷進行掛載。
  • 可以通過以下命令查看卷:
    docker inspect my-container
    

自定義掛載:

docker run --name custom-container -v /my/local/path:/data volume-example
  • 此時 /my/local/path(宿主機目錄)會掛載到容器中的 /data 路徑。

EXPOSE: 指定容器暴露的端口

在 Dockerfile 中,EXPOSE 指令用于聲明容器對外暴露的端口,以便外部與容器進行網絡通信。EXPOSE 聲明的端口并不會自動映射到宿主機,需要運行時通過 -p 標志手動指定映射規則。

細節和用法說明
  1. 功能

    • 定義運行容器時的監聽端口(僅聲明作用,未做實際端口映射)。
    • 容器啟動后,通過運行參數與宿主機的端口進行映射。
  2. 語法

    EXPOSE <端口號>
    EXPOSE <端口號>/<協議>  # 可選協議為 TCP 或 UDP,默認為 TCP
    
  3. 示例

    • 聲明容器監聽的 8080 端口(TCP 協議):

      EXPOSE 8080
      
    • 聲明容器同時監聽 TCP 和 UDP 協議的 8080 端口:

      EXPOSE 8080/tcp
      EXPOSE 8080/udp
      
  4. 運行時端口映射

    • 手動將容器暴露的端口與宿主機端口綁定:
      docker run -p 8080:8080 my-image
      
      上述命令會將宿主機的 8080 端口映射到容器監聽的 8080 端口。

CMD: 指定容器啟動時執行的默認命令

CMD 指令用于在容器啟動時指定默認執行的命令。如果使用 docker run 時傳入其他命令,CMD 指定的命令將被覆蓋。

細節和用法說明
  1. 功能

    • 為容器啟動執行一個默認的命令和參數。
    • 如果 Dockerfile 中有多個 CMD 指令,只有最后一個生效
    • CMD 是運行時命令,而非構建鏡像時的命令。
  2. 語法

    • Shell 形式:

      CMD <command>
      
    • Exec(數組)形式(推薦):

      CMD ["executable", "參數1", "參數2", ...]
      
    • ENTRYPOINT 聯合使用:

      CMD ["參數1", "參數2", ...]
      
  3. 示例

    • 使用 Shell 形式:

      CMD ls -al
      
    • 使用 Exec(數組)形式:

      CMD ["ls", "-al"]
      # 或者
      CMD ["sh", "-c", "ls -al"]
      
    • 輸出信息:

      CMD echo "hello, docker"
      

ENTRYPOINT: 執行容器的入口點命令

ENTRYPOINT 指令用于定義容器啟動時的主程序(不可覆蓋)。如果運行時希望加入額外參數,可以與 CMD 配合使用。

細節和用法說明
  1. 功能

    • 用于定義容器啟動時的固定命令,并以其作為入口點。
    • 可以和 CMD 聯合使用,固定的部分由 ENTRYPOINT 定義,動態參數由 CMD 定義。
  2. 語法

    • Exec(數組)形式(推薦):

      ENTRYPOINT ["executable", "參數1", "參數2", ...]
      
    • Shell 形式:

      ENTRYPOINT <command>
      
  3. 示例

    • 固定使用 echo 執行輸出命令:

      ENTRYPOINT ["echo", "Hello"]
      # 或者
      ENTRYPOINT ["sh", "-c", "echo Hello"]
      
    • 配合 CMD 使用:

      ENTRYPOINT ["python3"]
      CMD ["app.py"]
      
      • 啟動容器時將最終運行:python3 app.py

USER: 指定容器內的用戶

USER 指令用于指定容器內后續指令的執行用戶,默認用戶為 root

細節和用法說明
  1. 功能

    • 更改構建和運行容器時的用戶和用戶組。
    • 以非 root 用戶運行容器可以提升安全性。
  2. 語法

    USER <用戶名>[:<用戶組>]
    
  3. 示例

    • 切換為 nobody 用戶:

      USER nobody
      
    • 設置用戶和用戶組:

      USER stu:group1
      

ARG: 構建參數

ARG 指令用于聲明鏡像構建時可用的變量,這些變量僅在構建過程中有效,不會包含在最終鏡像中。

細節和用法說明
  1. 功能

    • 定義 Dockerfile 構建過程中的參數,可用于動態化構建。
  2. 語法

    ARG <參數名>[=<默認值>]
    
  3. 示例

    • 定義默認值:
      ARG VERSION=1.0
      RUN echo $VERSION
      
    • 構建鏡像時通過 --build-arg 修改值:
      docker build -t --build-arg VERSION=2.0 my_images:1.0 .
      

SHELL: 自定義容器中的 shell

SHELL 用于指定構建過程中運行指令的 shell,默認情況下使用 /bin/sh -c

細節和用法說明
  1. 功能

    • 更改默認的 shell。例如,使用 PowerShell 而非 /bin/sh
  2. 語法

    SHELL ["executable", "參數1", "參數2", ...]
    
  3. 示例

    • 更改為 Bash:

      SHELL ["/bin/bash", "-c"]
      
    • 使用 Windows PowerShell:

      SHELL ["powershell", "-command"]
      

STOPSIGNAL: 自定義容器停止信號

STOPSIGNAL 用于指定容器在停止時 Docker 向其發送的信號。

細節和用法說明
  1. 功能

    • 定義停止容器時應發送的信號(默認是 SIGTERM)。
    • 可用信號參考:Linux Signals。
  2. 語法

    STOPSIGNAL <信號值>
    
  3. 示例

    • 設置為 SIGKILL:

      STOPSIGNAL SIGKILL
      
    • 設置為自定義信號:

      STOPSIGNAL 9
      

HEALTHCHECK: 容器健康檢查

HEALTHCHECK 指令用于定義容器內某個服務或應用的健康檢查機制,確保容器的狀態可以被 Docker 監控。當容器運行時,Docker 會根據 HEALTHCHECK 的結果判斷容器的健康狀態,并標記為 healthy(健康)、unhealthy(不健康)、或 starting(檢查未完成)。

細節和用法說明
  1. 功能

    • 定義容器運行時的健康檢查邏輯,例如通過 HTTP 請求或執行命令的結果判斷服務狀態。
    • 健康檢查會影響容器的狀態,當服務出現異常時,容器的狀態會變為 unhealthy
  2. 語法

    # 配置健康檢查
    HEALTHCHECK [選項] CMD <命令>
    # 禁用健康檢查
    HEALTHCHECK NONE
    
    • 選項
      • --interval=<時間>:設置檢查的時間間隔,默認為 30s
      • --timeout=<時間>:設置檢查命令的超時時間,默認為 30s
      • --start-period=<時間>:設置健康檢查開始前的寬限期,允許容器啟動所需時間。
      • --retries=<次數>:設置健康檢查重試次數,默認為 3
  3. 命令返回規則

    • 返回值為 0:健康(healthy)。
    • 返回值為非 0:不健康(unhealthy)。
    • 超時或未響應:不健康(unhealthy)。
  4. 示例

    • 使用 curl 檢查 HTTP 服務是否正常:

      HEALTHCHECK --interval=5m --timeout=3s --start-period=30s --retries=3 \CMD curl -f http://localhost:8080/ || exit 1
      
      • 每隔 5 分鐘檢查一次容器內的 HTTP 服務(超時為 3 秒,啟動寬限期 30 秒,重試 3 次)。
      • 如果服務未響應或返回錯誤狀態碼(非 2xx),容器會被標記為 unhealthy
    • 檢查 MySQL 服務是否就緒:

      HEALTHCHECK CMD mysqladmin ping -h localhost || exit 1
      
    • 禁用健康檢查:

      HEALTHCHECK NONE
      

構建鏡像

  • docker commit 方式
    必須基于現有的容器進行修改, 然后提交為新的鏡像
# 基礎結構
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]# OPTIONS 說明
## -a : 在commit時的作者
## -c : 使用dockerfile指令創建鏡像
## -m : 在commit時的說明文字
## -p : 在commit時暫停容器運行
# 如:
docker commit -m "提交的描述信息" -a "作者" 容器id/容器名 鏡像名:標簽# 首先, 啟動一個容器
docker run --rm -d -p 3001:80 --name nginx_commit nginx# 進入容器內部, 修改容器內容
docker exec -it nginx_commit /bin/bash
## 修改nginx的默認首頁內容
echo "hello, nginx commit" > /usr/share/nginx/html/index.html# 提交修改后的容器為新的鏡像
docker commit -m "simple test docker commit" -a "wolfcode" nginx_commit mynginx_commit:1.0# 查看鏡像
docker images# 啟動新的鏡像
docker run --rm -d -p 3002:80 mynginx_commit:1.0
## 訪問 http://localhost:3002/ 可以看到修改后的內容
  • docker build 方式
# 基礎結構
docker build -t [OPTIONS] 鏡像名:標簽 Dockerfile路徑/.
# 常用的 OPTIONS 說明
## --build-arg=[] : 設置鏡像創建時的變量# 如:
docker build -t mynginx:1.0 .# 查看鏡像
docker images

示例1:

# 首先加入當前鏡像的基礎鏡像
FROM python:3.10WORKDIR /appCOPY ./requirements.txt .
COPY ./simple_fastapi.py .RUN pip3 install -r requirements.txtEXPOSE 8040CMD ["python","simple_fastapi.py"]

構建鏡像:

docker build -t myfastapi:1.0 .

構建自己的docker倉庫Registry

阿里云容器鏡像服務個人倉庫

  • 阿里云容器鏡像服務
  • 阿里云容器鏡像服務幫助文檔
    可以自己先創建一個命名空間鏡像倉庫, 阿里云會自動給出 login pull push 的方法
    在這里插入圖片描述

使用 Nexus 鏡像倉庫

# 創建一個 nexus 持久化目錄
mkdir -p ~/docker_test/nexus
# 開放權限, 防止docker內的用戶沒有操作權限
chmod 777 ~/docker_test/nexus# 啟動 nexus 的容器
docker run -d --restart=always -p 3005:8081 \-p 3006:5000 \-p 3007:5001 --name nexus -v ~/docker_test/nexus:/nexus-data \-e http_proxy=http://10.0.xx.xx:7892 \-e https_proxy=http://10.0.xx.xx:7892 \sonatype/nexus3# 訪問 http://localhost:3005/ 可以看到 nexus 的界面
# pull/push 
# 待更...

使用 Harbor 鏡像倉庫

使用harbor必須要先安裝 docker 與 docker-compose

待更…

Docker Compose

容器編排: 管理多個容器的生命周期, 并保證它們之間的依賴關系
副本數控制: 容器有時候需要啟動多個副本集群, 保證高可用, 快速對容器集群進行彈性伸縮
配置共享: 容器集群中, 需要共享一些配置文件, 如數據庫配置, redis配置等
在這里插入圖片描述
官方文檔: docker-compose 官方文檔

Services 相關

見官方文檔

Networks 相關

見官方文檔

Volumes 相關

見官方文檔

Build 相關

docker-compose 可以利用 docker-compose.yml 文件中的 build 字段來構建鏡像(代替 docker build -t 命令), 構建鏡像的上下文默認為 docker-compose.yml 文件所在的目錄

詳情見上文compose官方文檔

services:service_1:image: example/webappbuild: ./webapp# 常用的方式# build上下文為當前目錄下的backend目錄, Dockerfile為backend目錄下的Dockerfileservice_2:image: example/databasebuild:context: ./backendservice_3:image: example/databasebuild:context: ./backenddockerfile: ../backend.Dockerfileservice_4:build: ~/custom

使用 docker-compose 的示例

首先寫一個 docker-compose.yml 文件

services:# 定義一個服務service_1:# 定義鏡像名image: "nginx"# # 定義容器名# container_name: "nginx_compose"# 定義端口映射ports:- "3010-3020:80"# 定義網絡networks:- wolfcode_net# 定義環境變量environment:- ENV_VAR_1=VALUE_1- ENV_VAR_2=VALUE_2# # 定義依賴# depends_on:#    - service_2# 定義重啟策略restart: "always"# 定義掛載目錄volumes:- type: volumesource: nginx_compose_testtarget: /usr/share/nginx/htmlnetworks:# 自動創建一個網絡  wolfcode_net wolfcode_net:name: wolfcode_netdriver: bridgeipam:driver: defaultconfig:- subnet: 192.188.0.0/16gateway: 192.188.0.1volumes:nginx_compose_test:name: nginx_compose_test

使用 docker-compose config 驗證配置文件格式是否正確

docker-compose 命令通常有一個前提, 就是執行命令時, 當前目錄必須在 docker-compose.yml 文件的目錄下

docker-compose config

使用 docker-compose up 啟動服務

docker-compose 命令通常有一個前提, 就是執行命令時, 當前目錄必須在 docker-compose.yml 文件的目錄下

更多命令見: docker-compose 命令 CLI

# 啟動與創建服務
# 當修改了docker-compose.yml的配置, docker-compose up -d 也可以用于更新服務
docker-compose up -d
## 僅僅創建服務, 不啟動
docker-compose create  # 根據當前目錄下的 docker-compose.yml 文件創建所有的服務, 但是不啟動
### 注意: create 后跟的是服務名, 而不是容器名, 下面的命令同理
docker-compose create 服務名  # 根據當前目錄下的 docker-compose.yml 文件創建指定的服務, 但是不啟動# 查看服務狀態
docker-compose ps
docker-compose ps -a
docker-compose images
docker-compose ls# 停止服務
docker-compose stop        # 停止服務, 但是不刪除容器
docker-compose stop 服務名  # 停止指定的服務, 但是不刪除容器# 啟動服務
docker-compose start        # 啟動服務
docker-compose start 服務名  # 啟動指定的服務# 刪除服務
docker-compose down --help
docker-compose down        # 刪除所有服務 容器 網絡, 但是不刪除掛載的目錄
docker-compose down -v     # 刪除所有服務 容器 網絡, 同時刪除掛載的目錄
docker-compose down 服務名  # 刪除指定的服務, 但是不刪除掛載的目錄

使用docker-compose 完成彈性伸縮

# 注意: scale 后跟的是服務名, 而不是容器名
# 該命令會自動停止現有的服務, 并啟動新的服務
docker-compose up -d --scale 服務名=副本數docker-compose up -d --scale service_1=3
docker-compose up -d --scale service_1=2
docker-compose up -d --scale service_1=5

使用 docker-compose logs 查看日志

# 查看服務日志
docker-compose logs
docker-compose logs -f
docker-compose logs -f 服務名

Docker Swarm

在這里插入圖片描述

在 Docker Swarm 集群中,不同節點需要通過內部的網絡協議進行通信,以實現集群管理、服務分發以及任務調度等功能。為了確保通信正常,您需要開放一系列特定的端口。這些端口包括 Swarm 自身的管理、集群節點間的網絡通信,以及應用服務所需要暴露的端口。

端口原因/必要性
2377/TCP用于 Swarm 集群管理(加入或離開節點)。
7946/TCP用于 Manager 節點間的狀態同步和心跳。
7946/UDP用于服務調度的 Gossip Protocol(群組通信協議)。
4789/UDP支持 Overlay 網絡,確保服務(例如容器之間)在不同節點上的網絡通信。
服務端口Manager 節點上運行的服務所需要暴露的端口(如 3000:80、80:80 等,由具體服務配置決定)。

端口開啟后, 需要重啟 docker 服務才能生效: sudo systemctl restart docker

swarm 基本概念

首先,Docker Swarm 是什么?
Docker Swarm 是一個用于管理和編排 Docker 容器的集群工具,它允許我們在多個主機上運行容器,就像運行在一臺機器上的容器一樣簡單,并集成了基本的負載均衡功能。

  • swarm : 集群的管理和編排
    docker swarm --help

  • node : 集群中的docker 節點, 類似于 k8s 的 node 節點, 分為 manager 和 worker

  • service : 服務(Services) 是指的是一組任務的集合, 服務定義了任務的屬性. 服務有兩種模式:

    • replicated services : 基于指定副本數量進行任務調度
    • global services : 每個節點都運行一個任務

    兩種模式通過docker service create 的 --mode 參數指定
    在這里插入圖片描述

  • task : Task 是 Swarm 中的最小的調度單位, 目前來說就是一個單一的容器, 類似于 k8s 的 pod 中的容器

集群搭建

準備3臺云服務器用于測試, 一個manager, 兩個worker node, 3臺服務器都安裝了 docker, 并開啟了上文中的端口

  1. 初始化集群
docker swarm --help# 初始化集群, 并將當前節點設置為 manager 節點
docker swarm init --advertise-addr <MANAGER-IP>  # <MANAGER-IP> 是當前節點的 IP 地址
# 如:
docker swarm init --advertise-addr 119.3.xxx.xxx# 運行完成后, 會返回一個 node token 命令, 用于 worker 節點加入集群
# 格式大概為:
# docker swarm join --token SWMTKN-1-5jz0q4z7jz0q4z7jz0q4z7jz0q4z7jz0q4z7jz0q4z7jz0q4z7jz0q4z7jz0q4z7j 119.3.xxx.xxx:2377# 在另外兩個 worker 節點上運行該命令即可加入集群
# 獲得worker節點加入集群的token(管理節點運行命令)
docker swarm join-token worker
# 獲得manager節點加入集群的token(管理節點運行命令)
docker swarm join-token manager

Warning: 不同的云服務器商私網ip(網卡eth0)之間是無法通信的, docker swarm 默認可能會把私網ip加入到 ingress網絡中, 即使worker節點可以正常加入到swarm, 管理節點也可能無法發送信息到worker節點的私網ip, 造成ingress自動負載轉發異常, 解決方式如下:

# docker swarm join  加入新參數 --advertise-addr 工作節點的公網ip  即可解決
docker swarm join --token xxxxxxxxxxxxxxxxxx --advertise-addr <WORKER-公網IP> <MANAGER-IP>:2377# 查看是否成功
## 工作節點:
docker info
### 內部有swarm 的信息## 查看 docker ingress 網絡的配置(管理節點運行)
docker network inspect ingress
### 里面 的"Peers": 內部的信息是否正確## 查看 docker ingress 網絡的配置(工作節點運行)
docker network inspect ingress
### 里面 的"Peers": 內部的信息是否正確

在這里插入圖片描述

  1. 查看集群狀態(管理節點運行)
docker node --help
docker node ls
docker node ps
docker node inspect <NODE-ID>  # <NODE-ID> 是節點的 ID

部署服務

  1. 創建并啟動服務
docker service --help
docker service create --help# 創建并啟動服務
# 默認啟用 Ingress 網絡, 顯式告訴 Swarm 將單獨的 3000 端口暴露給集群范圍, 啟用 Ingress 網絡,實現請求的集群范圍轉發。
docker service create --replicas 2 --publish 3000:80 --name nginx_swarm nginx
docker service create --replicas 2 -p 3000:80 --name nginx_swarm nginxdocker service create --replicas 2 -p 3000-3005:80 --name nginx_swarm nginx

1. Docker Swarm 的 --publish 及負載均衡機制

1.1 --publish 如何實現負載均衡?

Docker Swarm 的 --publish 參數用于將服務的容器端口暴露給外界訪問,并通過 Swarm 內部的負載均衡器實現流量的自動分發。

步驟講解:

  1. 創建服務并暴露端口:

    • 我們通過 docker service create 創建一個服務,例如運行一個 nginx 服務并暴露端口:
      docker service create --name my_service --replicas 5 --publish 8080:80 nginx
      
      • --name my_service :給服務命名。
      • --replicas 5:運行 5 個副本(即 5 個容器)。
      • --publish 8080:80:對外暴露端口 8080,將其映射到容器內的 80 端口(nginx 默認使用 80 端口)。
  2. 服務的分布與負載:

    • Swarm 會根據集群中的可用節點,把 5 個副本均勻分布到節點上(除非有節點資源不足等情況)。
    • 假設有 3 臺節點,服務可能會分布如下:
      • node-1:運行 2 個副本。
      • node-2:運行 2 個副本。
      • node-3:運行 1 個副本。
  3. 外部流量的進入:

    • 外部用戶通過訪問集群中任意節點的 IP 和暴露的 8080 端口訪問這個服務:
      http://<任意節點的IP>:8080
      
    • Docker Swarm 的負載均衡機制會將請求根據簡單的輪詢策略分發到服務的 5 個副本中。
  4. Ingress 網絡:

    • Swarm 使用一個特殊的分布式網絡,叫做 Ingress 網絡,來管理流量。
    • 即使請求進入了一個沒有直接運行副本的節點,該節點也會通過 Ingress 網絡將流量轉發到運行任務副本的節點。例如:

      流量進入了 node-2,而副本在 node-1 上運行,node-2 會自動將流量轉發到 node-1

特點:

  • 簡單而透明: Swarm 用戶完全不需要關心副本的具體位置,也不需額外配置負載均衡器。
  • 負載分配策略: Swarm 默認采用簡單的 輪詢(Round-Robin) 策略,將流量依次分配到服務的多個副本。

1.2 Swarm 的優缺點
  • 優點:

    • 極簡風格:僅需 --publish 一行命令,即可實現負載均衡。
    • 易用性強,適合中小型應用場景。
    • 內部的集群式端口暴露(Ingress 網絡)隱藏了復雜性。
  • 缺點:

    • Swarm 的負載均衡機制較為基礎,只能基于簡單的輪詢分配流量。
    • 無法根據副本的資源消耗(如 CPU、內存)做智能調度,不適合復雜場景。

2. Kubernetes 的負載均衡機制

Kubernetes(K8s)是 Docker Swarm 的強大競爭對手,它是現代化云原生架構中的核心工具。相比 Swarm,K8s 提供了更加復雜、靈活的負載均衡機制

2.1 Kubernetes 的負載均衡方法

在 K8s 中,負載均衡分為多個層次:

  1. 內部流量負載均衡:

    • K8s 提供了一種叫做 ClusterIP 的 “虛擬 IP” 機制,用來在服務(Service)和 Pod(容器)之間實現流量的分發。
    • Service 會根據 Pod 的實際狀態(健康檢查的結果)動態分發流量到健康 Pod。
  2. 外部流量負載均衡:

    • 在 Kubernetes 中,外部流量通常通過 NodePortLoadBalancer 類型的服務進入集群。
      • NodePort: 將一個節點的某個端口暴露給外界,用于接收流量。
      • LoadBalancer: 使用云供應商的負載均衡器(如 AWS、GCP 的 Load Balancer)分發流量到集群節點。
  3. 高級應用:Ingress Controller

    • K8s 支持使用 Ingress(基于 L7 網絡協議的負載均衡)管理 HTTP 請求,通過域名、URL 路徑等規則分發流量到不同服務。

2.2 Kubernetes 的優點
  • 支持多層次負載均衡,從內部 IP 轉發到外部代理(如 Nginx Ingress)。
  • 可以擴展自定義流量轉發規則,例如基于 HTTP Header 的分發。
  • 能力遠超 Swarm,但復雜度也更高。
  1. 查看集群服務狀態(管理節點運行)
docker service --help
docker service lsdocker service inspect <SERVICE-ID>  # <SERVICE-ID> 是服務的 ID
docker service inspect --pretty <SERVICE-ID>  # <SERVICE-ID> 是服務的 ID
# --pretty 參數可以簡化展示服務信息docker service logs -f <SERVICE-ID>  # <SERVICE-ID> 是服務的 IDdocker service ps <SERVICE-ID>  # <SERVICE-ID> 是服務的 ID# 刪除服務
docker service rm <SERVICE-ID>  # <SERVICE-ID> 是服務的 ID
## 驗證 docker service ls# 判斷某一個節點是否在集群中
## 1. 管理節點運行
docker node ls
docker node inspect <NODE-ID>  # <NODE-ID> 是節點的 ID## 2. 任何節點都可以通過以下命令查看
docker info   # 看看里面是否有swarm 相關的信息

彈性伸縮

1. 服務更新(調整實例的個數)

# 調整服務的副本數量
docker service update --replicas 5 <SERVICE-ID/NAME>  # <SERVICE-ID> 是服務的 ID

2. 調整集群的規模

# 離開swarm
## 各個節點運行
docker swarm leave --force# 加入swarm
## 獲得worker節點加入集群的token(管理節點運行命令)
### docker swarm join-token worker
## 獲得manager節點加入集群的token(管理節點運行命令)
### docker swarm join-token manager# 注意: --advertise-addr <WORKER-公網IP> 可以看情況加入, 原因正如上文所講, 保證worker節點能夠被manager節點找到
docker swarm join --token SWMTKN-1-4q1j0p9w6w3z9xv2v6z1q6w3z9xv2v6z1q6w3z-3j3z9xv2v6z1q6w3z9xv2v6z1q6w3z --advertise-addr <WORKER-公網IP> <MANAGER-IP>:<MANAGER-PORT>

Docker Machine

待更.

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

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

相關文章

從入門到精通:Postman 實用指南

Postman 是一款超棒的 API 開發工具&#xff0c;能用來測試、調試和管理 API&#xff0c;大大提升開發效率。下面就給大家詳細講講它的安裝、使用方法&#xff0c;再分享些實用技巧。 一、安裝 Postman 你能在 Postman 官網&#xff08;https://www.postman.com &#xff09;下…

將圖片base64編碼后,數據轉成圖片

將圖片數據進行base64編碼后&#xff0c;可以在瀏覽器上查看圖片&#xff0c;只需在前端加上data:image/png;base64,即可 在線工具&#xff1a; Base64轉圖片 - 加菲工具

【動態規劃】詳解 0-1背包問題

文章目錄 1. 問題引入2. 從 dfs 到動態規劃3. 動態規劃過程分析4. 二維 dp 的遍歷順序5. 從二維數組到一維數組6. 一維數組的遍歷次序7. 背包的遍歷順序8. 代碼總結9. 總結 1. 問題引入 0-1 背包是比較經典的動態規劃問題&#xff0c;這里以代碼隨想錄里面的例子來介紹下。總的…

LeetCode每日精進:20.有效的括號

題目鏈接&#xff1a;20.有效的括號 題目描述&#xff1a; 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以…

llama.cpp部署 DeepSeek-R1 模型

一、llama.cpp 介紹 使用純 C/C推理 Meta 的LLaMA模型&#xff08;及其他模型&#xff09;。主要目標llama.cpp是在各種硬件&#xff08;本地和云端&#xff09;上以最少的設置和最先進的性能實現 LLM 推理。純 C/C 實現&#xff0c;無任何依賴項Apple 芯片是一流的——通過 A…

Web后端 - Maven管理工具

一 Maven簡單介紹 Maven是apache旗下的一個開源項目&#xff0c;是一款用于管理和構建java項目的工具。 Maven的作用 二 Maven 安裝配置 依賴配置 依賴傳遞 依賴范圍 生命周期 注意事項&#xff1a;在同一套生命周期中&#xff0c;當運行后面的階段時&#xff0c;前面的階段都…

[LeetCode力扣hot100]-C++常用數據結構

0.Vector 1.Set-常用滑動窗口 set<char> ans;//根據類型定義&#xff0c;像vector ans.count()//檢查某個元素是否在set里&#xff0c;1在0不在 ans.insert();//插入元素 ans.erase()//刪除某個指定元素 2.棧 3.樹 樹是一種特殊的數據結構&#xff0c;力扣二叉樹相…

vite+vue3開發uni-app時低版本瀏覽器不支持es6語法的問題排坑筆記

重要提示&#xff1a;請首先完整閱讀完文章內容后再操作&#xff0c;以免不必要的時間浪費&#xff01;切記&#xff01;&#xff01;&#xff01;在使用vitevue3開發uni-app項目時&#xff0c;存在低版本瀏覽器不兼容es6語法的問題&#xff0c;如“?.” “??” 等。為了方便…

《計算機視覺》——角點檢測和特征提取sift

角點檢測 角點的定義&#xff1a; 從直觀上理解&#xff0c;角點是圖像中兩條或多條邊緣的交點&#xff0c;在圖像中表現為局部區域內的灰度變化較為劇烈的點。在數學和計算機視覺中&#xff0c;角點可以被定義為在兩個或多個方向上具有顯著變化的點。比如在一幅建筑物的圖像…

WWW 2025 | 中南、微軟提出端到端雙重動態推薦模型,釋放LLM在序列推薦中的潛力...

©PaperWeekly 原創 作者 | 殷珺 單位 | 中南大學碩士研究生 研究方向 | 大語言模型、推薦系統 論文題目&#xff1a; Unleash LLMs Potential for Sequential Recommendation by Coordinating Dual Dynamic Index Mechanism 論文鏈接&#xff1a; https://openreview.net…

c# 2025/2/17 周一

16. 《表達式&#xff0c;語句詳解4》 20 未完。。 表達式&#xff0c;語句詳解_4_嗶哩嗶哩_bilibili

數據結構與算法面試專題——堆排序

完全二叉樹 完全二叉樹中如果每棵子樹的最大值都在頂部就是大根堆 完全二叉樹中如果每棵子樹的最小值都在頂部就是小根堆 設計目標&#xff1a;完全二叉樹的設計目標是高效地利用存儲空間&#xff0c;同時便于進行層次遍歷和數組存儲。它的結構使得每個節點的子節點都可以通過簡…

iOS開發書籍推薦 - 《高性能 iOS應用開發》(附帶鏈接)

引言 在 iOS 開發的過程中&#xff0c;隨著應用功能的增加和用戶需求的提升&#xff0c;性能優化成為了不可忽視的一環。尤其是面對復雜的界面、龐大的數據處理以及不斷增加的后臺操作&#xff0c;如何確保應用的流暢性和響應速度&#xff0c;成為開發者的一大挑戰。《高性能 …

微信小程序的制作

制作微信小程序的過程大致可以分為幾個步驟&#xff1a;從環境搭建、項目創建&#xff0c;到開發、調試和發布。下面我會為你簡要介紹每個步驟。 1. 準備工作 在開始開發微信小程序之前&#xff0c;你需要確保你已經完成了以下幾個步驟&#xff1a; 注冊微信小程序賬號&…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能體系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 庫占據著重要的地位。作為一個與動態數據交換&#xff08;DDE&#xff09;緊密相關的庫文件&#xff0c;它為 LabVIEW 用戶提供了與其他…

gitte遠程倉庫修改后,本地沒有更新,本地與遠程倉庫不一致

問題 &#xff1a;gitte遠程倉庫修改后&#xff0c;本地沒有更新&#xff0c;本地與遠程倉庫不一致 現象&#xff1a; [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…

組合模式詳解(Java)

一、組合模式基本概念 1.1 定義與類型 組合模式是一種結構型設計模式,它通過將對象組織成樹形結構,來表示“部分-整體”的層次關系。這種模式使得客戶端可以一致地對待單個對象和組合對象,從而簡化了客戶端代碼的復雜性。組合模式的核心在于定義了一個抽象組件角色,這個角…

LabVIEW危化品倉庫的安全監測系統

本案例展示了基于LabVIEW平臺設計的危化品倉庫安全監測系統&#xff0c;結合ZigBee無線通信技術、485串口通訊技術和傳感器技術&#xff0c;實現了對危化品倉庫的實時無線監測。該系統不僅能提高安全性&#xff0c;還能大幅提升工作效率&#xff0c;確保危化品倉庫的安全運營。…

【私人筆記】Web前端

Vue專題 vue3 vue3 頁面路徑前面添加目錄 - 路由base設置 - vite設置base https://mbd.baidu.com/ma/s/XdDrePju 修改vite.config.js export default defineConfig({base: /your-directory/,// 其他配置... }); vue2 uniapp 【持續更新】uni-app學習筆記_uniapp快速復制一…

數倉搭建:DWB層(基礎數據層)

維度退化: 通過減少表的數量和提高數據的冗余來優化查詢性能。 在維度退化中&#xff0c;相關的維度數據被合并到一個寬表中&#xff0c;減少了查詢時需要進行的表連接操作。例如&#xff0c;在銷售數據倉庫中&#xff0c;客戶信息、產品信息和時間信息等維度可能會被合并到一…