Docker安裝 鏡像管理 性能優化 大全
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。容器完全使用沙箱機制,相互之間不會有任何介面。
-
快速,一致地交付你的應用:Docker容器可以確保從開發環境到生產環境的一致性,簡化軟體交付過程。 -
響應式部署和擴展:Docker的輕量級和快速啟動特性使得基於容器的應用可以在短時間內被自動擴展或縮減。 -
在同一硬體上運行更多的工作負載:Docker是資源友好的,可以讓你在同一套硬體上運行更多的應用。
目錄:
- Docker安裝
- Linux上安裝Docker
- Windows上安裝Docker
- macOS上安裝Docker
- 驗證安裝
- Docker鏡像管理
- 查找鏡像
- 拉取鏡像
- 查看本地鏡像
- 刪除鏡像
- 構建鏡像
- Docker容器管理
- 運行容器
- 查看運行中的容器
- 停止容器
- 啟動已停止的容器
- 刪除容器
- 容器日誌
- Docker網路管理
- 查看網路
- 創建網路
- 運行容器時指定網路
- 連接容器到網路
- 斷開容器與網路的連接
- 刪除網路
- Docker卷和數據管理
- 創建卷
- 運行容器時掛載卷
- 查看卷
- 刪除卷
- Docker Compose使用
- 安裝Docker Compose
- 使用Compose文件定義服務
- 啟動服務
- 停止服務
- 製作Dockerfile
- 示例:Python Flask 應用
- 製作java jar文件Dockerfile
- Docker Swarm集群管理
- Swarm集群
- Swarm集群
- Swarm節點
- 部署服務到Swarm
- Swarm服務
- 安全管理
- 官方鏡像
- 掃描鏡像中的漏洞
- 最小化容器許可權
- 管理容器的網路訪問
- 安全存儲敏感數據
- Docker性能優化
- 優化容器啟動時間
- 資源限制
- 日誌管理
- Docker文件系統和存儲優化
- Overlay2 文件系統
- 多階段構建
- Docker安全加固
- 使用非root用戶運行容器
- 利用Docker秘密管理敏感信息
- Docker監控和日誌管理
- 使用Prometheus和Grafana進行監控
- 配置日誌驅動
- Docker CI/CD集成
- 示例:使用Docker在GitLab CI/CD中構建和推送鏡像
- Docker常見問題解答
文章目錄
Docker安裝
Docker支持多種平台,包括Ubuntu、Debian、CentOS等Linux發行版,以及Windows和macOS。
Linux上安裝Docker
以Ubuntu為例,首先更新應用包索引:
1 2 |
sudo apt-get update |
然後安裝Docker:
1 2 |
sudo apt-get install docker-ce docker-ce-cli containerd.io |
Windows上安裝Docker
在Windows上,可以通過安裝Docker Desktop來使用Docker。訪問Docker官網下載Docker Desktop安裝程序,然後按照嚮導完成安裝。
1 2 |
https://www.docker.com/products/docker-desktop/ |
macOS上安裝Docker
在macOS上,同樣可以通過安裝Docker Desktop來使用Docker。訪問Docker官網下載Docker Desktop安裝程序,然後按照嚮導完成安裝。
驗證安裝
安裝完成後,可以通過運行hello-world鏡像來驗證Docker是否正確安裝:
1 2 |
docker run hello-world |
如果安裝正確,你將看到一條消息,說明你的Docker正在運行,並且能夠從Docker Hub拉取鏡像。
或者使用docker version
命令看下docker版本,能看到版本說明也是安裝成功:
Docker鏡像管理
Docker鏡像是一個輕量級、可執行的獨立軟體包,包含運行應用所需的所有內容:代碼、運行時、庫、環境變數和配置文件。
查找鏡像
在Docker Hub上查找鏡像:
1 2 |
docker search ubuntu |
這個命令會列出Docker Hub中與ubuntu
相關的鏡像。
拉取鏡像
從Docker Hub拉取一個鏡像到本地:
1 2 |
docker pull ubuntu:18.04 |
這個命令會從Docker Hub拉取Ubuntu 18.04的官方鏡像。
查看本地鏡像
查看當前系統上的Docker鏡像列表:
1 2 |
docker images |
截圖中是我之前拉的SRS鏡像。
刪除鏡像
刪除一個本地鏡像:
1 2 |
docker rmi ubuntu:18.04 |
這個命令會刪除本地的Ubuntu 18.04鏡像。
構建鏡像
使用Dockerfile構建新的鏡像:
1 2 |
docker build -t my-ubuntu . |
這個命令會根據當前目錄下的Dockerfile來構建一個名為my-ubuntu
的鏡像。
Docker容器管理
容器是獨立運行的一個或一組應用,以及它們的運行環境。通過Docker容器,開發者可以打包應用與環境,並在任何支持Docker的平台上無縫部署。
運行容器
從鏡像啟動一個新容器:
1 2 |
docker run -it --name my-container ubuntu:18.04 /bin/bash |
這個命令會從ubuntu:18.04
鏡像啟動一個名為my-container
的容器,並啟動一個互動式的bash會話。
查看運行中的容器
查看當前正在運行的容器:
1 2 |
docker ps |
停止容器
停止一個運行中的容器:
1 2 |
docker stop my-container |
啟動已停止的容器
啟動一個已停止的容器:
1 2 |
docker start my-container |
刪除容器
刪除一個容器:
1 2 |
docker rm my-container |
注意:只有停止狀態的容器才能被刪除。
容器日誌
查看容器的輸出日誌:
1 2 |
docker logs my-container |
這個命令會顯示容器的標準輸出。
Docker網路管理
Docker網路允許容器間通信,以及容器與外部世界通信。Docker提供了多種網路模式,包括bridge、host、none和overlay等。
查看網路
列出所有Docker網路:
1 2 |
docker network ls |
創建網路
創建一個新的網路:
1 2 |
docker network create --driver bridge my-bridge-network |
這個命令創建了一個名為my-bridge-network
的bridge網路。
運行容器時指定網路
在特定網路中運行容器:
1 2 |
docker run -d --name my-container --network my-bridge-network nginx |
這個命令在my-bridge-network
網路中啟動了一個名為my-container
的容器,並運行nginx服務。
連接容器到網路
將已存在的容器連接到網路:
1 2 |
docker network connect my-bridge-network my-container |
斷開容器與網路的連接
從網路中斷開容器:
1 2 |
docker network disconnect my-bridge-network my-container |
刪除網路
刪除一個網路:
1 2 |
docker network rm my-bridge-network |
Docker卷和數據管理
Docker卷用於持久化和共享容器的數據。通過使用卷,可以將數據生命周期從容器生命周期中解耦出來。
創建卷
創建一個新的卷:
1 2 |
docker volume create my-volume |
運行容器時掛載卷
在容器中使用卷:
1 2 |
docker run -d --name my-container -v my-volume:/data nginx |
這個命令啟動了一個nginx容器,將my-volume
卷掛載到容器的/data
目錄。
查看卷
列出所有卷:
1 2 |
docker volume ls |
刪除卷
刪除一個卷:
1 2 |
docker volume rm my-volume |
Docker Compose使用
Docker Compose是一個用於定義和運行多容器Docker應用的工具。通過Compose,你可以使用YAML文件來配置應用的服務。
安裝Docker Compose
請根據官方文檔指引安裝Docker Compose。
使用Compose文件定義服務
創建一個docker-compose.yml
文件,定義服務:
1 2 3 4 5 6 7 8 9 10 11 |
<span style="color: #d19a66; line-height: 26px;">version:</span> <span style="color: #98c379; line-height: 26px;">'3'</span> <span style="color: #d19a66; line-height: 26px;">services:</span> <span style="color: #d19a66; line-height: 26px;">web:</span> <span style="color: #d19a66; line-height: 26px;">image:</span> <span style="color: #98c379; line-height: 26px;">nginx</span> <span style="color: #d19a66; line-height: 26px;">ports:</span> <span style="color: #61aeee; line-height: 26px;">-</span> <span style="color: #98c379; line-height: 26px;">"80:80"</span> <span style="color: #d19a66; line-height: 26px;">db:</span> <span style="color: #d19a66; line-height: 26px;">image:</span> <span style="color: #98c379; line-height: 26px;">postgres</span> <span style="color: #d19a66; line-height: 26px;">environment:</span> <span style="color: #d19a66; line-height: 26px;">POSTGRES_PASSWORD:</span> <span style="color: #98c379; line-height: 26px;">example</span> |
啟動服務
通過Docker Compose啟動服務:
1 2 |
docker-compose up |
停止服務
停止由Docker Compose啟動的服務:
1 2 |
docker-compose down |
製作Dockerfile
製作一個Dockerfile
通常涉及定義從哪個基礎鏡像開始、如何構建你的應用、以及當容器啟動時需要執行什麼命令等步驟。下面是一個簡單的示例,展示了如何為一個Python Flask應用創建一個Dockerfile
。
示例:Python Flask 應用
假設你有一個簡單的Flask應用,結構如下:
1 2 3 4 |
/your-app - app.py - requirements.txt |
其中,app.py
是Flask應用的主文件,requirements.txt
列出了所有的Python依賴。
app.py
1 2 |
<span style="color: #c678dd; line-height: 26px;">from</span> flask <span style="color: #c678dd; line-height: 26px;">import</span> Flask app = Flask(__name__) |
@app.route('/')
def hello_world():
return 'Hello, Docker!'
1 |
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
1 |
requirements.txt
1 2 |
flask |
Dockerfile
接下來,創建一個Dockerfile
來容器化這個Flask應用。
1 2 |
<span style="color: #5c6370; font-style: italic; line-height: 26px;"># 使用官方Python運行時作為父鏡像</span> <span style="color: #c678dd; line-height: 26px;">FROM</span> python:<span style="color: #d19a66; line-height: 26px;">3.8</span>-slim |
# 設置工作目錄
WORKDIR /app
1 |
# 將當前目錄內容複製到位於/app中的容器中
COPY . /app
1 |
# 安裝requirements.txt中指定的任何所需包
RUN pip install --no-cache-dir -r requirements.txt
1 |
# 使埠80可用於該容器外的環境
EXPOSE 80
1 |
# 定義環境變數
ENV NAME World
1 |
# 在容器啟動時運行app.py
CMD ["python", "app.py"]
1 |
這個Dockerfile
執行了以下步驟:
-
從官方Python 3.8 slim鏡像開始構建。 -
將工作目錄設置為容器內的 /app
。 -
複製當前目錄下的所有文件到容器內的 /app
目錄。 -
使用 pip
安裝requirements.txt
文件中列出的所有依賴。 -
將容器的埠80設置為對外開放。 -
設置一個環境變數 NAME
,值為World
。 -
定義容器啟動時執行的默認命令為 python app.py
。
構建和運行Docker鏡像
在包含Dockerfile
的目錄中運行以下命令來構建鏡像:
1 2 |
docker build -t my-flask-app . |
構建完成後,運行你的容器:
1 2 |
docker run -p 4000:80 my-flask-app |
這會將容器的80埠映射到宿主機的4000埠。現在,你可以通過訪問http://localhost:4000
來訪問你的Flask應用。
這只是一個基本的Dockerfile
示例。根據你的應用需求,你可能需要調整和優化你的Dockerfile
,例如使用多階段構建來減小鏡像大小,或者添加更多的配置和優化步驟。
製作java jar文件Dockerfile
製作一個用於Java應用(打包成jar文件)的Dockerfile
通常需要考慮基礎鏡像、構建環境、運行環境和啟動命令等因素。以下是一個示例,展示如何為一個簡單的Spring Boot應用創建一個Dockerfile
。
假設
-
你的Spring Boot應用已經被打包成一個名為 app.jar
的jar文件。 -
你想要在容器內運行這個jar文件。
Dockerfile
1 2 |
<span style="color: #5c6370; font-style: italic; line-height: 26px;"># 使用官方OpenJDK運行時作為父鏡像</span> <span style="color: #c678dd; line-height: 26px;">FROM</span> openjdk:<span style="color: #d19a66; line-height: 26px;">11</span>-jre-slim |
# 設置工作目錄為/app
WORKDIR /app
1 |
# 將jar文件複製到容器的/app目錄下
COPY target/app.jar /app/app.jar
1 |
# 暴露應用運行的埠
EXPOSE 8080
1 |
# 定義容器啟動時執行的命令
CMD ["java", "-jar", "/app/app.jar"]
1 |
這個Dockerfile
執行了以下步驟:
-
基礎鏡像:從官方OpenJDK 11 slim版本的鏡像開始構建。這個鏡像包含了運行Java應用所需的JRE環境。 -
工作目錄:將容器內的工作目錄設置為 /app
。 -
複製jar文件:將構建好的jar文件(假設位於你的項目的 target
目錄下)複製到容器的/app
目錄下。請根據你的實際構建路徑修改COPY
命令中的源路徑。 -
暴露埠:將容器的埠8080設置為對外開放,這假設你的Spring Boot應用默認監聽在8080埠上。如果你的應用監聽的是其他埠,請相應地修改此處。 -
啟動命令:定義了容器啟動時執行的命令,使用 java -jar
來運行jar文件。
構建和運行Docker鏡像
在包含Dockerfile
的目錄中運行以下命令來構建鏡像:
1 2 |
docker build -t my-spring-boot-app . |
構建完成後,運行你的容器:
1 2 |
docker run -p 8080:8080 my-spring-boot-app |
這會將容器的8080埠映射到宿主機的8080埠。現在,你可以通過訪問http://localhost:8080
來訪問你的Spring Boot應用。
請注意,這個示例假設你的Spring Boot應用已經被構建並打包成jar文件。在實際的項目中,你可能會使用Maven或Gradle作為構建工具,並且可能會在Dockerfile中包含構建步驟,或者使用多階段構建來優化最終鏡像的大小。
Docker Swarm集群管理
Docker Swarm是Docker的原生集群管理工具,它允許你將多個Docker主機組成一個集群,在集群中部署和管理容器。
Swarm集群
在主節點上初始化Swarm集群:
1 2 |
docker swarm init --advertise-addr <MANAGER-IP> |
這個命令會初始化一個Swarm集群,並將當前節點設置為管理節點。
Swarm集群
在工作節點上加入Swarm集群:
1 2 |
docker swarm join --token <SWARM-JOIN-TOKEN> <MANAGER-IP>:2377 |
使用管理節點提供的加入令牌來加入集群。
Swarm節點
在管理節點上查看集群的節點信息:
1 2 |
docker node ls |
部署服務到Swarm
在Swarm集群中部署服務:
1 2 |
docker service create --replicas 3 --name my-web nginx |
這個命令會在Swarm集群中創建一個名為my-web
的服務,並部署3個nginx容器實例。
Swarm服務
列出所有Swarm服務:
1 2 |
docker service ls |
查看特定服務的詳細信息:
1 2 |
docker service ps my-web |
縮放服務的副本數量:
1 2 |
docker service scale my-web=5 |
更新服務:
1 2 |
docker service update --image nginx:latest my-web |
安全管理
Docker安全包括鏡像安全、容器運行時安全、網路安全等方面。
官方鏡像
儘可能使用官方鏡像,減少安全風險。
掃描鏡像中的漏洞
使用Docker Hub或其他第三方工具掃描鏡像中的安全漏洞。
最小化容器許可權
使用最小許可權原則運行容器,例如,避免使用--privileged
標誌。
管理容器的網路訪問
根據需要配置容器的網路訪問策略,避免不必要的外部訪問。
安全存儲敏感數據
使用Docker secrets或其他加密工具安全地存儲和管理敏感數據。
Docker性能優化
優化Docker的性能,包括容器性能優化、資源分配、日誌管理等。
優化容器啟動時間
盡量減少容器鏡像的大小,使用Alpine Linux等輕量級基礎鏡像。
資源限制
合理分配容器的CPU和內存資源,避免資源爭搶導致的性能下降。
1 2 |
docker run -d --name my-container --memory=512m --cpus=1 nginx |
日誌管理
合理配置容器日誌的大小和滾動策略,避免日誌文件過大影響性能。
Docker文件系統和存儲優化
Overlay2 文件系統
Overlay2是Docker推薦的存儲驅動,因為它提供了良好的性能和兼容性。Overlay2通過創建一個層疊的文件系統,將容器和鏡像的變更層放在頂層,而共享的只讀層保持不變。
多階段構建
利用Dockerfile的多階段構建可以減小最終鏡像的大小,提高構建效率。例如,您可以在一個階段中編譯您的應用,然後在另一個階段中僅複製編譯後的二進位文件到一個新的輕量級基礎鏡像中。
1 2 3 4 5 |
<span style="color: #5c6370; font-style: italic; line-height: 26px;"># 第一階段:編譯</span> <span style="color: #c678dd; line-height: 26px;">FROM</span> golang:<span style="color: #d19a66; line-height: 26px;">1.16</span> AS builder <span style="color: #c678dd; line-height: 26px;">WORKDIR</span><span style="line-height: 26px;"> /app</span> <span style="color: #c678dd; line-height: 26px;">COPY</span><span style="line-height: 26px;"> . .</span> <span style="color: #c678dd; line-height: 26px;">RUN</span><span style="line-height: 26px;"> go build -o myapp .</span> |
# 第二階段:運行
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
1 |
Docker安全加固
使用非root用戶運行容器
默認情況下,容器以root用戶運行,這可能帶來潛在的安全風險。通過在Dockerfile中指定非root用戶,可以增加容器的安全性。
1 2 3 4 |
<span style="color: #c678dd; line-height: 26px;">FROM</span> nginx <span style="color: #c678dd; line-height: 26px;">RUN</span><span style="line-height: 26px;"> adduser -D myuser</span> <span style="color: #c678dd; line-height: 26px;">USER</span> myuser |
利用Docker秘密管理敏感信息
對於需要在容器中使用的敏感信息(如資料庫密碼),應避免直接在Dockerfile或環境變數中硬編碼,而是使用Docker秘密(Docker Secrets)來安全地管理這些數據。
Docker監控和日誌管理
使用Prometheus和Grafana進行監控
Prometheus是一個開源監控解決方案,可以與Docker容器化環境很好地集成。通過導出容器和Docker守護進程的度量標準,Prometheus可以收集並存儲這些數據,而Grafana可以用來可視化這些數據。
配置日誌驅動
Docker支持多種日誌驅動程序,可以將容器的日誌發送到不同的目的地,如本地文件、json-file或遠程日誌伺服器。通過合理配置日誌驅動,可以有效管理容器日誌。
1 2 |
docker run -d --name my-container --<span style="color: #e6c07b; line-height: 26px;">log</span>-driver=syslog --<span style="color: #e6c07b; line-height: 26px;">log</span>-opt syslog-address=udp://192.168.0.42:514 nginx |
Docker CI/CD集成
Docker可以與Jenkins、GitLab CI/CD等持續集成和持續部署工具無縫集成。通過在CI/CD管道中使用Docker,可以自動化構建、測試和部署容器化應用。
示例:使用Docker在GitLab CI/CD中構建和推送鏡像
1 2 3 4 5 6 |
<span style="color: #d19a66; line-height: 26px;">build_image:</span> <span style="color: #d19a66; line-height: 26px;">stage:</span> <span style="color: #98c379; line-height: 26px;">build</span> <span style="color: #d19a66; line-height: 26px;">script:</span> <span style="color: #61aeee; line-height: 26px;">-</span> <span style="color: #98c379; line-height: 26px;">docker</span> <span style="color: #98c379; line-height: 26px;">build</span> <span style="color: #98c379; line-height: 26px;">-t</span> <span style="color: #98c379; line-height: 26px;">myapp:$CI_COMMIT_SHA</span> <span style="color: #98c379; line-height: 26px;">.</span> <span style="color: #61aeee; line-height: 26px;">-</span> <span style="color: #98c379; line-height: 26px;">docker</span> <span style="color: #98c379; line-height: 26px;">push</span> <span style="color: #98c379; line-height: 26px;">myapp:$CI_COMMIT_SHA</span> |
Docker常見問題解答
Q: 如何刪除所有停止的容器?
A: 使用docker container prune
命令。
Q: 如何刪除懸空(dangling)鏡像?
A: 使用docker image prune
命令。
Q: Docker容器與虛擬機有何不同?
A: Docker容器是輕量級的,共享宿主機的內核,而虛擬機包括完整的操作系統和虛擬硬體,因此更重。
Q: 如何備份Docker容器中的數據?
A: 可以通過創建數據卷的快照來備份數據,或者使用docker cp
命令將數據從容器複製到宿主機。
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » Docker安裝 鏡像管理 性能優化 大全