
IT咨詢顧問的關鍵抓手-DeepSeek+企業架構-快速的熟悉和洞察一個新的行業
鏡像不僅包含應用本身,還包含應用運行所需要的環境、配置、系統函數庫。Docker會在運行鏡像時創建一個隔離環境,稱為容器。
鏡像倉庫:存儲和管理鏡像的平臺,Docker官方維護了一個公共倉庫:Docker Hub。
命令說明文檔地址:docs.docker.com
docker pull
拉取鏡像
docker push
推送鏡像到DockerRegistry
docker images
查看本地鏡像
docker rmi
刪除本地鏡像
docker run
創建并運行容器(不能重復創建)
docker stop
停止指定容器
docker start
啟動指定容器
docker restart
重新啟動容器
docker rm
刪除指定容器
docker ps
查看容器
docker logs
查看容器運行日志
docker exec
進入容器
docker save
保存鏡像到本地壓縮文件
docker load
加載本地壓縮文件到鏡像
docker inspect
查看容器詳細信息
容器是隔離環境,容器內程序的文件、配置、運行時產生的容器都在容器內部,我們要讀寫容器內的文件非常不方便。因此,容器提供程序的運行環境,但是程序運行產生的數據、程序運行依賴的配置都應該與容器解耦,由此引出數據卷。數據卷(volume)是一個虛擬目錄,是容器內目錄與宿主機目錄之間映射的橋梁。
我們創建了兩個數據卷:
Nginx容器內部的/etc/nginx/conf.d
目錄和/usr/share/nginx/html
目錄分別與兩個數據卷關聯。
而數據卷conf
和html
分別指向了宿主機的/etc/nginx
目錄和/usr/share/nginx/html
目錄
這樣以來,容器內的/etc/nginx/conf.d
和/usr/share/nginx/html
目錄就與宿主機的/etc/nginx
和/usr/share/nginx/html
目錄關聯起來,我們稱為掛載。此時,我們操作宿主機的/usr/share/nginx/html
就是在操作容器內的/usr/share/nginx/html
目錄。只要我們將靜態資源放入宿主機對應目錄,就可以被Nginx代理了。
/var/lib/docker/volumes/<volume_name>/_data
。命令說明文檔地址:docs.docker.com
docker volume create
創建數據卷
docker volume ls
查看所有數據卷
docker volume rm
刪除指定數據卷
docker volume inspect
查看某個數據卷的詳情
docker volume prune
清除數據卷
注意:容器與數據卷的掛載要在創建容器時配置,對于創建好的容器,是不能設置數據卷的。而且創建容器的過程中,數據卷會自動創建。案例演示
可以發現,數據卷的目錄結構較深,如果我們去操作數據卷目錄會不太方便。在很多情況下,我們會直接將容器目錄與宿主機指定目錄掛載。掛載語法與數據卷類似:
注意:本地目錄或文件必須以/
或.
開頭,如果直接以名字開頭,會被識別為數據卷名而非本地目錄名。
之前說過,鏡像之所以能讓我們快速跨操作系統部署應用而忽略其運行環境、配置,就是因為鏡像中包含了程序運行需要的系統函數庫、環境、配置、依賴。因此自定義鏡像本質就是依次準備好程序運行的基礎環境、依賴、應用本身、運行配置等文件,并且打包而成。所以鏡像就是一堆文件的集合。但需要注意的是,鏡像文件不是隨意堆放的,而是按照操作的步驟分層疊加而成,每一層形成的文件都會單獨打包并標記一個唯一id,稱為Layer(層)。這樣,如果我們構建時用到的某些層其他人已經制作過,就可以直接拷貝使用這些層,而不用重復制作。例如,第一步中需要的Linux運行環境,通用性就很強,所以Docker官方就制作了這樣的只包含Linux運行環境的鏡像。我們在制作鏡像時,就無需重復制作,直接使用Docker官方提供的CentOS或Ubuntu鏡像作為基礎鏡像。然后再搭建其它層即可,這樣逐層搭建,最終整個項目的鏡像結構如圖所示:
由于制作鏡像的過程中,需要逐層處理和打包,比較復雜,所以Docker就提供了自動打包鏡像的功能。我們只需要將打包的過程,每一層要做的事情用固定的語法寫下來,交給Docker去執行即可。參考語法常用的語法如下:
FROM
指定基礎鏡像ENV
設置環境變量,可在后面指令使用COPY
拷貝本地文件到鏡像的指定目錄RUN
執行Linux的shell命令,一般是安裝過程的命令EXPOSE
指定容器運行時監聽的端口,是給鏡像使用者看的EXPOSE 8080
ENTRYPOINT
鏡像中應用的啟動命令,容器運行時調用ENTRYPOINT java -jar xx.jar
一般一個項目往往要訪問很多中間件,如mysql,redis,如何讓容器之間能夠相互訪問?默認情況下,所有容器都是以bridge方式連接到Docker的一個虛擬網橋上,但是,容器的網絡IP其實是一個虛擬的IP,其值并不固定與某一個容器綁定,如果我們在開發時寫死某個IP,而在部署時很可能容器的IP會發生變化,連接會失敗。所以,我們必須借助于docker的網絡功能來解決這個問題
命令說明文檔地址:docs.docker.com
docker network create
創建一個網絡
docker network ls
查看所有網絡
docker network rm
刪除指定網絡
docker network prune
清除未使用的網絡
docker network connect
使指定容器連接加入某網絡
docker network disconnect
使指定容器連接離開某網絡
docker network inspect
查看網絡詳細信息
? 在自定義網絡中,可以給容器起多個別名,默認的別名是容器名本身
? 在同一個自定義網絡中的容器,可以通過別名互相訪問
一般一個項目需要包含多個容器,手動每個部署非常麻煩,而Docker Compose就可以幫助我們實現多個相互關聯的Docker容器的快速部署。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器。幫助我們實現多個相互關聯的Docker容器的快速部署。
image-20250103162108274
docker-compose文件中可以定義多個相互關聯的應用容器,每一個應用容器被稱為一個服務(service)。由于service就是在定義某個應用的運行時參數,因此與docker run
參數非常相似。簡單對比如下:
image-20250103162303838
docker run 參數
docker compose 指令
--name
container_name容器名稱-p
ports端口映射-e
environment環境變量-v
volumes數據卷配置--network
networks網絡-f
指定compose文件的路徑和名稱-p
指定project名稱。project就是當前compose文件中設置的多個service的集合,是邏輯概念up
創建并啟動所有service容器down
停止并移除所有容器、網絡ps
列出所有啟動的容器logs
查看指定容器的日志stop
停止容器start
啟動容器restart
重啟容器top
查看運行的進程exec
在指定的運行中容器中執行命令原文轉載自:https://mp.weixin.qq.com/s/t3Obk8qozFutKgG8d2mTiw
IT咨詢顧問的關鍵抓手-DeepSeek+企業架構-快速的熟悉和洞察一個新的行業
基于Ollama與AnythingLLM的DeepSeek-R1本地RAG應用實踐
模型引擎的技術債務?一個Deepseek三種API引發的連鎖反應
Windows 上快速部署.NET Core Web 項目
.NET開發者看過來!DeepSeek SDK 集成
LangChain4j實戰-Java AI應用開源框架之LangChain4j和Spring AI
生產級滿血版Deepseek-r1 671B部署實例
生產級滿血版Deepseek-r1 671B部署后續問題、調優以及壓測
【LLM落地應用實戰】LLM + TextIn文檔解析技術實測