使用 Docker 容器化封裝應用程式的好處:
- Docker 環境
Docker 引擎統一了基礎設施環境,包括硬體配置,作業系統的版本,執行時環境的異構
- Docker 映象
Docker 引擎統一了程式打包(裝箱)的方式,例如 java 程式,go 程式,python 程式等等
- Docker 容器
Docker 引擎統一了程式部署(執行)方式,例如 java 的部署執行方式為 java -jar...
,或者 python 的部署執行 python manage.py runserver
,go 的部署執行 go run ...
現在使用 Docker 容器,統一使用 docker run …
使用 Docker 容器化封裝應用程式的壞處:
- Docker 是單機使用的,無法有效叢集
- 隨著容器數量的上升,管理的成本也越來越高
- 沒有有效的容災或者自愈機制
- 沒有預設編排模板,無法實現快速,大規模容器排程
- 沒有同意的配置管理中心
- 沒有容器生命週期的管理工具
- 沒有圖形化運維工具 等等
Docker 如何叢集部署,不使用 k8s 的話:
docker compose 是單機部署的,使用叢集部署我們可以使用 docker stack
例如 docker compose 部署單機是這個樣子的:
docker-compose up -d xxx.yml
使用 docker stack 的時候,我們可以這樣:
docker stack depoly xxx.yml
我們們來看看 docker stack
是什麼?
Docker 在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題
Docker引擎在1.12 版本整合了Docker Swarm, 內建新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
說白了,docker stack
可以完成docker
本身做不到的事情,就是他可以完成容器編排,但是這裡我們就會有這麼一個疑問?有了 docker compose
為什麼還要有docker stack
?
什麼是docker swarm?
Docker swarm 是 Docker 的本機群集
它將 Docker主機池轉變為單個虛擬Docker主機
Docker swarm 提供標準的 Docker API,任何已經與 Docker 守護程式通訊的工具都可以使用Swarm透明地擴充套件到多個主機
Docker Stack 與 Docker Compose的區別
- docker stack 是swarm mode的一部分, 即使是單機使用, 也需要一個 swarm 節點
- docker stack 強化了service的概念
服務可理解為釋出到生產環境時某組容器的預期狀態 ,以及強化了( 複製集、 容器重啟策略、回滾策略、服務更新策略 )等生產特性
- docker stack 不支援 build 指令 ,而 docker compose 不支援 deploy 指令
- docker stack幾乎能做 docker-compose 所有的事情,後續統一還是使用 kubernetes 更香
總得來說,docker stack 適用於生產環境的編排工具,而 docker-compose 更適合被定義為單機容器編排的工具
如何使用 docker stack?
# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
命令 | 描述 |
---|---|
docker stack deploy | 部署新 stack 或更新現有 stack |
docker stack ls | 顯示 stack 列表 |
docker stack ps | 列出 stack 中的任務 |
docker stack rm | 移除一個或多個 stack |
docker stack services | 列出 stack 中的服務 |
例如我們們在隨便在網上就可以找一個例子,
DockerFile 裡面寫使用 docker stack
時,就可以寫成 deploy:
來進行指定
什麼是 Docker ?
是一個容器化平臺以容器的形式將應用程式及其所有依賴項打包,確保應用程式在任何環境中無縫執行
Docker 裡面有 docker 映象,docker 容器 和 docker 倉庫
- docker 映象
是docker容器的原始碼,Docker映象用於建立容器
- docker 容器
它不依賴於任何特定的基礎架構,它們可以在任何計算機,任何基礎架構和任何雲中執行
- docker 倉庫
用來儲存映象的,可以看做是一個程式碼控制中心
Docker容器常見的幾種狀態
- 執行中
- 暫停
- 重新啟動中
- 已退出
Docker與虛擬機器有何不同?
docker 不是虛擬化方法,他是一個工具,用於容器化系統上的容器管理或應用程式部署
它依賴與實際實現基於容器的虛擬化或作業系統及虛擬化的其他工具,Docker主要專注於在應用程式容器內自動部署應用程式
Docker 的網路型別有哪些模式?
- bridge 模式
docker預設的網路配置,可以設定IP,但是要與docker host主機的虛擬網路在同一網段
- none 模式
不會給容器進行任何網路配置
- host 模式
直接使用 docker 宿主機的網路
- container 模式
與已經存在的容器共有同一個IP地址
- network 模式
自定義網路,我們們可以使用 docker network create
來新建一個網路
Docker 資料如何持久化?
我們們可以使用 掛載卷,就是在建立容器的時候使用 -v
引數,進行繫結掛載,匿名掛載,或者具名掛載 ,我們們就可以將宿主機的目錄或者檔案掛載到容器中
繫結掛載
就是明確將自己宿主機的目錄或者檔案,對應到容器中指定的目錄或檔案,會有這樣的特點:
- 資料卷是目錄或檔案,不能是沒有格式化的磁碟(塊裝置)
- 掛載的檔案和目錄會隨原始檔和目錄變化而變化
- 容器可以讀寫掛載卷中的資料
- 卷中的資料可以永久儲存,即使使用它的容器已經被銷燬
匿名 / 具名掛載
就是 -v
後面帶的引數若只寫容器中的路徑(匿名掛載)或者寫了一個代號,指定容器中的路徑(具名路徑)
預設為掛載到容器的工作目錄,/var/lib/docker/volumes
下面
Docker 容器內部的機制是什麼樣的?
每個容器都是在自己的名命空間中執行,但使用與所有其他容器完全相同的核心
發生隔離是因為核心知道分配給程式的名稱空間,並且在API呼叫期間確保程式只能訪問其自己的名稱空間中的資源
如何臨時退出一個正在互動的容器的終端,而不終止它?
使用ctrl+ q + p
即可
如何停止 / 刪除所有正在執行的容器?
docker kill $(docker ps -aq)
docker rm $(docker ps -aq)
如何刪除所有本機所有的映象?
docker rmi $(docker images -aq)
Dockerfile 中常見的指令有哪些?
- FROM
構建映象基於哪個映象
- MAINTAINER
映象維護者姓名或郵箱地址
- RUN
構建映象時執行的指令
- CMD
執行容器時執行的shell環境
- VOLUME
指定容器掛載點到宿主機自動生成的目錄或其他容器
- USER
為RUN、CMD、和 ENTRYPOINT 執行命令指定執行使用者
- WORKDIR
為 RUN、CMD、ENTRYPOINT、COPY 和 ADD 設定工作目錄,就是切換目錄
- HEALTHCHECH
健康檢查
- ARG
構建時指定的一些引數
- EXPOSE
宣告容器的服務埠(僅僅是宣告)
- ENV
設定容器環境變數
- ADD
拷貝檔案或目錄到容器中,如果是URL或壓縮包便會自動下載或自動解壓
- COPY
拷貝檔案或目錄到容器中,跟ADD類似,但不具備自動下載或解壓的功能
- ENTRYPOINT
執行容器時執行的shell命令
關於 Docker 的學習資料其實都在 docker hub上面,我們可以不斷的學習,實戰,總結,優化思維,逐步進階
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~
本作品採用《CC 協議》,轉載必須註明作者和本文連結