什麼是容器編排?
- 由於大量的應用容器化,部署和管理繁多的服務變得越來越困難且需要耗費大量的資源,而 Docker Compose 正好能解決 Docker 單節點上以單引擎模式(Single-Engine Mode)進行多容器應用的部署和管理問題,這一過程就叫容器編排;
- Docker Compose 並不是通過腳本和各種冗長的 docker 命令來將應用組件組織起來,而是通過一個【聲明式的配置文件】描述整個應用,從而使用一條命令完成部署。
- 容器編排有以下四個特徵(批量操作):
- 容器同時啓動;
- 容器同時關閉;
- 鏡像和容器同時刪除;
- 鏡像和容器同時構建;
【容器編排工具(目前主流)】
- docker-compose;
- docker-swarm;
- Kubernetes/k8s;
【docker-compose簡介】
- Compose的前身是Fig,Fig被Docker收購之後正式更名爲Compose,Compose向下兼容Fig(Fig 是一個由 Orchard 公司開發的強有力的基於 Docker 的 Python 工具,允許用戶基於一個 YAML 文件定義多容器應用,從而可以使用 fig 命令行工具進行應用的部署,同時還可對應用的全生命週期進行管理);
- Compose是一個用於部署(定義和運行)多容器Docker應用的工具,只需要一個Compose的配置文件和一個簡單的命令就可以創建並運行應用所需的所有容器;
- 在配置文件中,所有容器通過【services】來定義,並使用【docker-compose命令】啓動或停止容器以及所有依賴容器;
- 使用它時,首先編寫定義多容器(多服務)應用的 YAML 文件,然後將其交由 docker-compose 命令處理,Docker Compose 就會基於 Docker 引擎 API 完成應用的部署和管理;
【docker 操作鏡像-容器流程】
【docker-compose容器編排工作流程】
【linux 環境安裝 docker-compose】
- 檢查Linux系統上面是否已經安裝Docker =》sudo docker version
- curl 下載 compose(版本1.11.2)地址 =》sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 添加 compose 可執行權限 =》chmod +x /usr/local/bin/docker-compose
- 查看 compose 安裝結果 =》docker-compose --version ,卸載使用 =》sudo rm /usr/local/bin/docker-compose
- 創建 compose 快捷方式 =》sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
【docker-compose命令】=》docker-compose --help
- build =》構建或重新構建容器服務
- bundle =》從compose文件生成一個Docker包
- config =》驗證並查看compose文件
- create =》創建容器服務
- down =》停止並刪除容器、網絡、映像和卷
- events =》從容器接收實時事件
- exec =》在正在運行的容器中執行命令
- help =》幫助命令
- images =》鏡像列表
- kill =》殺死容器
- logs =》查看容器的日誌
- pause =》暫停容器服務
- port =》輸出端口號
- ps =》容器列表
- pull =》下載容器服務鏡像
- push =》上傳容器服務鏡像
- restart =》容器服務重新開始
- rm =》刪除停止的容器
- run =》運行一次性命令
- scale =》設置服務的容器數量
- start =》開始容器服務
- stop =》停止容器服務
- top =》顯示正在運行的進程
- unpause =》暫停容器服務
- up =》創建並啓動容器
- version =》顯示Docker-Compose版本信息
【docker-compose.yml文件】
- 類似josn文件,YAML是"YAML Ain't a Markup Language"(YAML不是一種標記語言)的遞歸縮寫,是一個可讀性高,用來表達數據序列化的格式。
- YAML語法格式參考:https://www.runoob.com/w3cnote/yaml-intro.html
- docker-compose.yml文件配置:
version 指定compose版本 最好是3.0以上版本 目前最新是3.7版本
services 配置容器[容器列表]
nginx: #配置容器標識(唯一編號)
image: #配置容器鏡像
ports: #配置容器映射端口號[數組]
networks: #配置容器網絡[數組]
networks 網絡指定配置
nginx-rmcore: #配置網絡名稱
external: true #網絡自定義
volumes 數據掛載配置
extensions 擴展配置
- 容器編排使用場景;
- 批量管理 docker 容器上面的鏡像和容器化應用;
容器編排如何應用,目標同時操作nginx和.net core構建的鏡像?
- 準備 nginx 鏡像;
- 準備.net core項目構建的鏡像;
- docker-compose工具;
- docker-compose.yml配置文件;
【linux實際操作】:
- 進入創建的容器目錄 =》cd nginx
- 查看當前目錄列表 =》ls
- 創建 compose 文件夾 =》mkdir compose
- 再次查看當前目錄列表 =》ls 此時會有一個 compose 文件夾
- 進入 compose 文件夾 =》cd compose
- 創建 docker-compose.yml (嚴格命名)文件 =》touch docker-compose.yml
- 編輯 docker-compose.yml (語法嚴格規範)文件=》vi docker-compose.yml 編輯配置信息如下:
version: '3' #標識 componse 版本信息
services:
netcore: #鏡像標識(唯一)
image: netcore #當前環境鏡像名稱,不用指明路徑,會自動從本地尋找鏡像
ports: #暴露端口,端口映射
- 8080:80 #把容器端口80映射到外部主機訪問端口8080
- 8081:443 #把容器鏡像文件所在目錄端口443映射到外部訪問端口8081
nginx:
image: nginx
ports:
- 8090:80
#注:上面符號 - 表示數組,注意空格縮進表示層級,該文件配置嚴格遵循YAML語法配置
- 以上 docker-compose.yml 文件配置完成,保存並推出 =》wq
- 再次查看當前文件目錄 =》ls 查看裏面是否存在 docker-compose.yml 文件
- 通過 docker-compose.yml 文件配置信息批量運行容器 =》docker-compose up 此時會輸出兩個信息
- Creating compose_netcore_1 ... done
- Creating compose_nginx_1 ... done
- 查看批量創建的容器信息 =》docker ps -a / docker container ls -a
以上配置過程就實現了容器編排,通過當前主機ip和對應端口即可訪問批量創建的容器【netcore和nginx】;
- compose 批量停止容器(並刪除容器、網絡、映像和卷) =》docker-compose down
- 爲了驗證是否刪除信息,查看所有容器列表 =》docker ps -a / docker container ls -a
注:容器編排缺陷 =》docker-compose 只支持 docker 單節點主機上面的容器應用部署和編排管理;
如何使用創建的 nginx 容器反向代理 netcore ?
- 進入 nginx 容器(通過Bash Shell橋接) =》docker exec -it [container-name/id] /bin/bash
- 進入當前目錄 =》cd /
- 查看列表文件夾目錄 =》ls
- 進入 nginx 容器安裝目錄(通常情況在 /usr/local 目錄下)=》cd /usr/local
- 再次查看列表文件夾目錄 =》ls
- 進入 nginx 容器目錄 =》cd nginx/ 在查看當前文件目錄列表 =》ls 會看到 conf 文件目錄
- 進入 conf 目錄 =》cd conf 查看列表 =》ls 存在 nginx.conf
- 編輯 nginx.conf 文件 =》vi nginx.conf / vim nginx.conf
- 在 【server】/【location】註釋默認配置,編寫【netcore】容器ip:port(暴露端口) =》http_proxy http://192.168.48.3:8081;
- 保存並推出 nginx.conf =》wq
- 退出 ngixn 容器 =》exit
- 查看當前目錄列表 =》ls
- 重啓 componse =》docker-componse restart
【容器間如何實現網絡通信?】
此時瀏覽器查看 nginx 容器可能訪問無效(不會反向代理運行 netcore 容器),由於docker 中的容器是相互隔離的,所以容器間是不能直接相互通信的,此時需要找一箇中介(docker 容器 網絡管理工具 =》network),linux shell 終端輸入=》docker --help 顯示的管理命令中會有一個 =》【network Manage networks】
- 查看 docker 容器【網絡管理命令】信息 =》docker network --help
- 方案:使用自定義方式橋接模式(DRIVER/bridge)接入網絡,實現容器間相互通信
- 創建網絡(默認bridge,範圍本地local),橋接標識/名稱爲(netcore-nginx) =》docker network create netcore-nginx
- 查看當前 docker 節點網絡目錄列表 =》docker network ls 顯示信息【NETWORK ID/網絡id,NAME/網絡名稱,DRIVER/網絡驅動模式,SCOPE/網絡範圍】
- 找到 docker-compose.yml 文件並切換到文件所在目錄 =》ls
- 編輯 docker-compose.yml 文件,對容器【netcore,nginx】接入網絡橋接模式,配置信息如下:
version: '3' #標識 compones 版本信息
services:
netcore: #鏡像標識(唯一)
image: netcore #當前環境鏡像名稱,不用指明路徑,會自動從本地尋找鏡像
ports: #暴露端口,端口映射
- 8080:80 #把容器端口80映射到外部主機訪問端口8080
- 8081:443 #把容器鏡像文件所在目錄端口443映射到外部訪問端口8081
networks:
- netcore-nginx
nginx:
image: nginx
ports:
- 8090:80
networks: #單個容器內局部網絡配置
- netcore-nginx
networks: #docker 網絡配置聲明,此處是全局網絡配置
netcore-nginx: #自定義網絡名稱
external: true #啓動外部訪問
# 1.上面符號 - 表示數組,注意空格縮進表示層級,該文件配置嚴格遵循YAML語法配置
# 2.上面配置信息,services 配置了兩個容器,分別是 netcore 和 nginx ,並且同時使用自定義的網絡橋接模式 netcore-nginx 實現容器相互通信;
# 3.和 serices 同級的 networks 配置信息,告訴 docker 啓動自定義橋接模式網絡 netcore-nginx ;
- 退出 docker-componse.yml 文件並保存 =》wq
- 重啓 componse 讓配置信息生效 =》docker-componse restart
再次瀏覽器查看 nginx 容器是否實現反向代理 netcore 容器,若出現 nginx 默認站點信息,注意查看 nginx.conf 配置信息,因爲 componse 工具配置重啓後,信息不會被保存,原有容器會被還原,注意修改 nginx.conf / server / location 【proxy_pass http://[netcore容器ip:port];】信息,wq 推出並保存,然後在 nginx 容器內部重啓 :
- 切換目錄 =》cd ..
- 查看當前目錄列表 =》ls
- 進入 sbin 目錄 =》cd sbin
- 再次查看當前目錄列表 =》ls 此時會看到 nginx
- 重啓 nginx =》./nginx restart 或 重新加載 =》./nginx -s reload
此時再次瀏覽器查看,確保以上配置信息都對的前提下,通常情況都可以正常訪問了 =》實現 nginx 反向代理 netcore;
【如何查看容器 netcore 網絡ip地址?】
- 查看 netcore 容器分層信息(安裝配置詳細信息)=》docker container inspect [container-name/id]
- =》查看【NetworkSettings】/【Networks】/【IPAddress】,文件配置展示的IP就是 netcore 的ip
- =》查看對外暴露的端口號【NetworkSettings】/【Ports】/【HostPort】
- 查看 docker 所有容器信息 =》dockre container ls -a
- =》找到對應的 netcore 容器查看對外暴露的端口;
注意:在以上的配置過程中,容器重啓後,容器的數據不會持久化(容器數據是保留內存中的),並且容器的ip也會發生變化。
【容器數據掛載 volums】:實現容器數據持久化 ;
由於【compose】工具只能 docker 單個節點配置部署容器應用,不能實現 docker 跨節點管理,因此 docker 官方團隊實現了 【docker-swarm】工具實現 docker 集羣管理,下一篇幅繼續講解;