使用 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上面,我們可以不斷的學習,實戰,總結,優化思維,逐步進階
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這里
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~
