Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Docker進階探討
Docker內部實做細節與docker-compose/machine/swarm
大綱
• Docker的那些事
• 倉儲(Registry)
• 資料卷(Volume)
• 網路(Network)
• Docker compose
• Docker machine
• Docker swarm
Docker的組成
LXC
Cgroup
NameSpace
chroot
Other tools AUF
• Docker在LXC的基礎上實現
• LXC是Linux內核容器技術的簡
稱,內部由以下組成:
• Cgroup
• Namespa...
Cgroup
CPU Memory
/cpu_mem_cg
/cgroup_2
/cgroup_1
Cgroup Hierachy
--cpu-shares
--cpuset-cpus
--net
--memory
--blkio-weight...
Namespace
MNT
PID
NET
IPC
UTS
USER
• MNT: 掛載點,檔案系統…等
• PID: 程序
• NET: NIC,路由…等
• IPC: 系統IPC
• UTS: 主機/域名
• USER: UID/GID
P...
AUFS與Cow(Copy on write)
File 1 File 2
File 3
File 4
File 1 .wh.File 3 Top層
基底層
第一層
第二層
• 上層映象檔依賴於下層,每層映象檔都是Read-only
• 啟動後...
Docker核心協作
• Cgroup提供容器管理資源的使用
• Namespace確保每個容器彼此獨立,
而不會互相干擾
• AUFS提供映像檔的擴充性
VM與容器-兼容
Physical Server
Hypervisor
OS
Docker Engine
Bins/Libs
App 1
Bins/Libs
App 2
OS
Docker Engine
Bins/Libs
App 3
Bins...
映象檔
• 映象檔的資料結構:
• 元資料(Metadata)
• 多層映象檔
• 元資料紀錄了整個映象檔的相關資訊,
包含組態資訊與每層的檔案大小
• 當映象檔的層數越多,則相對地會產生
許多瑣碎的小檔案,不利於I/O
• 映象檔無法加密,但...
映象檔的儲存機制- Content Addressable
Storage(CAS)
• 映象檔中的分層透過內容加密Hash來引用與
儲存
• 提供了更高的安全性,也避免了ID衝突的問題
• 容器的ID依然是採用隨機產生的UUID,而其內
的每...
映象檔名稱解析
Remote-dockerhub.com/namespace/busybox:latest
(遠端映象檔來源Url) (命名空間) (倉儲) (標籤)
• 遠端映象檔來源Url: 集中存放映象檔的Web俟服器位址
• 命名空間:...
小結-
Docker的那些事
• Docker本身是一個Processor等級的虛擬化
• Cgroup + Namespace都是Linux核心本身具備的
• VM與Docker兩者並非零和競爭,而是應該在實務中合併使用
• Docker映象...
倉儲(Registry) –應用
RegistryImage
Container
Dockerfile
Backup.tar
commit run
save
load
stop/start/restart
tag
本機Docker實體
buil...
倉儲與CI/CD
Public Registry
Developer
Private Registry
Dev
QA
Prod
Pull
Push/Pull
Pull &
Deploy
• 開發人員從公有倉儲取得基礎映象檔,
在經過異動之後推送...
小結-
倉儲
• 私有倉儲對於開發和維運上都是極為重要的元件
• 盡可能使用官方提供的映象檔作為基礎映象檔來擴充,並將擴充後
的成果放(Push)到私有倉儲
• 可利用映象檔的標籤來區分不同開發環境所需要使用的映象檔
資料卷
Docker Engine
Mount
Volume Plugin
Device
Storage 平台
Docker主機
• 容器本身不會將資料持久化;當容器執行完畢
之後,所有資料都將消失
• 容器可以綁定資料卷,將資料持久化到儲存裝...
資料卷操作模式-主機掛載
Docker Engine
Mount Device
Storage
Docker主機
• 在啟動一個容器時,加上-v的旗標來指示
要將主機上那一個資料夾作為資料卷掛載
到容器中的那一個資料夾
• 無法直接掛載遠端機器...
資料卷操作模式-資料卷容器
Docker Engine
Docker主機
• 創建一個資料卷容器是為了讓資料可以
更方便的被其它容器共用
• 使用docker create –v的方式來創建一個
資料卷容器
• 其它容器可以使用--volume...
資料卷操作模式-資料卷插件
Docker Engine Volume Plugin
Storage 平台
Docker主機
• Docker插件是一個Web Service服務以背景
服務的方式在主機上運行
• 資料使用Http並以Json資料...
具名資料卷範例
Step1. 創建一個名為temp的資料卷
Step2. 檢視是否有創建成功
Step3. 創建容器並且添加一個檔案:Blah
Step4. 創建第二容器並且檢查是否有檔案:Blah
• 這種創建資料卷的方式,帶來的壞處就是
它...
資料卷容器範例
• 採用資料卷容器的好處在於其它容器只需要
和它綁定,就能夠共享持久化的資料
• 資料卷容器同樣有資料卷遺留的問題,需要定期
清除沒用到的資料卷
Step1. 創建一個資料卷容器,並且映射到主機某個位置
Step2. 以volu...
小結-
資料卷
• 資料卷是用來處理容器無法將資料持久化的問題
• 實務上,資料卷只能視為是持久化資料的一種替代手段,應該要把
資料儲存到資料庫中
• 資料卷有著難以移轉的困擾,可以考慮使用第三方資料卷驅動來處
理這個問題
Docker網路概念
Endpoint
網路沙箱
Docker容器
網路1
Endpoint
網路沙箱
Docker容器
Endpoint
網路2
Endpoint
網路沙箱
Docker容器• 沙箱: 是一個隔離的網路
執行環境,儲放了容器網...
Docker網路模式- 主機
eth0
Container
eth0
Docker主機
• 容器會直接繼承自主機的網路設定
• 兩者所有的IP設定會是一致的
Docker網路模式- 網路橋接器
Container
eth0
Docker主機
vethxxx
docker0
eth0
veth pair
iptable
• Docker預設有一個名為:docker0的網路橋接器
• 當使用者沒有指定容...
Docker網路模式- 無網路
Container
Docker主機
• 容器的運行如果需要自行設定網路組態,則需要強制設定無網路模式
• 一旦設定了無網路模式,就需要以exec指令進入運行中的容器,進行
網路組態的手動設定
Docker網路模式- Overlay
Container
eth0
Docker主機
vethxxx
docker0
eth0
veth pair
iptable
Container
eth0
Docker主機
vethxxx
docker0...
小結-
網路
• 在過去會使用link旗標來串連容器,但這個方法有著容器啟動順序
的限制
• 網路帶來的好處是可以讓該網路中的所有容器,彼此以容器的名稱
來找到對方
Docker Compose
• Docker compose是應用在多容器協作的情境
• 使用Docker Compose之後,就不需要使用Shell
來啟動多個容器
• 僅需要一個組態檔案,就可以啟動多個容器,
並且處理好多個容器之間的鏈接...
Docker Compose指令-
up,stop,start
指令: up
目的: 啟動服務
範例: docker-compose up [options] [Service…]
描述: 此命令會嘗試自動完成,包括: 建構映象檔,創建服務,啟...
Docker Compose指令-
build, logs, port
指令: build
目的: 建構服務
範例: docker-compose build [options] [Service…]
描述: 建構(重新建構)某個服務容器,建構...
Docker Compose指令-
scale, run, kill
指令: scale
目的: 擴展容器的數量
範例: docker-compose scale [options] [service=num, …]
描述: 可以一次擴展指定服...
Docker Compose指令-
scale, run, kill
指令: rm
目的: 刪除所有處於停止狀態的容器
範例: docker-compose rm [options] [service…]
描述: 建議先以stop指令停止容器,...
Docker Compose 組態檔案
version: [版本]
services:
[服務名稱]:
build 或 image: …
ports:
- “port映射”
networks:
- [網路1]
volumes:
- [位址]
v...
Docker-compose組態命令-
build, image, container_name, command
指令: build
目的: 建構映象檔,並使用這個映象檔
範例: build: [路徑]
描述: 指定Dockerfile所在的...
Docker-compose組態命令-
environment, env_file, extends
指令: environment
目的: 設定環境變數,可使用陣列/字典兩種格式
範例: environment:
- [key]:[value...
Docker-compose組態命令-
expose, ports, links
指令: expose
目的: 曝露端點給其它docker-compose中定義的其它容器使用
範例: expose:
- “[埠號]”
描述: 這個端點的埠號不會...
Docker-compose組態命令-
volumes, volumes_driver, volumes_from
指令: volumes
目的: 資料卷所掛載路徑設定
範例: volumes:
- [宿主主機絕對/相對路徑]:[容器絕對/相對...
Docker-compose的網路設定
• Docker compose會在執行docker-compose up命令的時候,自動建構一個網路給
所有定義在組態檔案內的服務使用
• 早期常會使用link指令去串連指定的服務,但彼此會因為啟動的順...
Volumes設定的概念
• 常會看到在第一階層定義了一個volumes,
但是在每個服務內部又有一個volumes
• 第一階的volumes定義的是資料卷名稱後綴(Postfix)
• 可在第一階後綴添加存取權限(例: ro/rw)
• 資...
小結-
docker-compose
• 實務上,經常會需要多個容器一起協作,docker-compose是專司處理
這方面的工作
• 越來越多的編排(Orchestractor)工具支援docker-compose
• 當前的docker-c...
Docker Machine
• 採用Go語言撰寫
• 支援多種後端驅動,包括:虛擬機,和雲平台
• 可以使用-d來指示要使用的驅動,目前支援的有:
• Amazon EC2
• Azure
• Digitalocean
• Exoscale
...
Docker-machine指令
• active: 查看目前啟用中的Docker主機
• config: 輸出當前連接主機的組態資訊
• create: 創建一個Docker主機
• env: 顯示指定的Docker主機,其環境變數
• in...
小結-
docker-machine
• 利用docker-machine可以快速在各種不同平台建立出一台具有完
備Docker功能的虛擬機
• 在Hyper-V上,盡可能創建獨立的虛擬機網路給自建的docker主機使
用
• 未來支援的平台會...
Docker Swarm
• Docker Swarm是一套管理Docker叢集的工具,它
將一群Docker的宿主主機虛擬成為單一個主機
• Docker Swarm使用標準的Docker API作為其前端
的存取端點,因此,各種Docker...
Swarm架構
Store
Scheduler
Discovery
Service
Swarm Manager Docker
Client
Docker APIs
over HTTP
Docker
Hub
Docker
Daemon
Swarm...
Swarm排程
第一階段:
套用過濾器
• Constraint
• 挑選滿足所有條件的節點,通常是限制
作業系統
• Affinity
• 從三個面向: 容器/映象檔/標籤來挑選
節點
• Port
• 挑選尚未被使用掉所期望埠號的節點
• ...
Swarm探索服務
• 藉由Consul這個第三方的服務探索系統來達成
HA的效果
• 當某個節點崩潰,管理節點可以透過Consul感知到
• 節點的管理責任可由Consul負擔絕大部份
Swarm Manage
Docker Daemon
2...
以容器建構Swarm -
Consul-Server
docker run –p 8400:8400 –p 8500:8500 –p 8600:53/udp –h node_master progrium/consul
-server –boo...
以容器建構Swarm -
Consul - Replica
docker run –d - -name node_worker –h node_worker progrium/consul
--server –join [Consul Serv...
以容器建構Swarm -
Swarm Manager Node
docker run –d –p 4000:4000 swarm manage –H :4000
--replication - -advertise :4000 consul:/...
以容器建構Swarm -
Swarm Worker Node
docker run –d swarm join - -advertise [node IP]:2375 consul://[Consul Server Container IP]:...
以容器建構Swarm -
確認狀態
• 藉由這個指令觀查Docker Swarm的狀態
• 目前僅有加入一個工作節點-moby
docker –H :4000 info
Swarm三種版本
Docker Swarm Swarm Kit Swarm Next*
額外KV資料庫 需要(progrium/consul) 內建 內建
Security None 內建 內建
額外安裝 不需要 需要額外安裝 不需要
Ext...
Swarm Next系統結構
Docker Worker Node
tcp://localhost:2375
Docker Worker Node
tcp://localhost:2375
Docker Worker Node
tcp://lo...
以Swarm Mode建構Swarm-
創建Docker-machine
docker-machine create –d hyperv - -hyperv-virtual-switch “[虛擬機網路名稱]” [docker主機名稱]
• 需...
以Swarm Mode建構Swarm-
初始化Swarm模式
docker-machine ssh manager1 “docker swarm init - -listen-addr [manager1 IP]
--advertise-add...
以Swarm Mode建構Swarm-
取得Join-Token
docker-machine ssh manager1 “docker swarm join-token manager -q”
docker-machine ssh manag...
以Swarm Mode建構Swarm-
添加一個管理節點
docker-machine ssh manager2 “docker swarm join - -token [manager token] - -listen-addr [manag...
以Swarm Mode建構Swarm-
添加一個工作節點
docker-machine ssh worker1 “docker swarm join - -token [worker token]
--advertise-addr [worke...
以Swarm Mode建構Swarm-
觀察Swarm節點的狀況
• 當所有節點都加入完成之後,記得一定要在使用這個指令檢查一下是否有問題
• 這個指令只能應用在管理節點
docker-machine ssh manager1 “docker ...
與Swarm相關的Docker指令
Docker
Swarm
node
servicestack
Docker swarm相關命令解析
• demote: 將Swarm中的管理節點降級
• inspect: 檢視節點詳細資訊
• ls: 列舉所有節點
• promote: 將Swarm中的工作節點升級
• ps: 檢視某個節點上正在運行的任...
範例: Wordpress-
複製到docker-machine
使用winScp連線,預設的帳號/密碼: docker/tcuser
範例: Wordpress-
部署服務
docker-machine ssh manager1 “docker stack deploy - -compose-file docker-compose.yml vassiblity”
• vass...
範例: Wordpress-
以瀏覽器連線到Wordpress
網址: http://10.66.66.181
範例: Wordpress-
將Wordpress服務擴充為N個
docker-machine ssh manager1 “docker service scale [服務名稱]=[擴充到N個節點數]”
• 服務的名稱可以使用docker se...
範例: Wordpress-
視覺化觀察Swarm的容器部署
docker-machine ssh manager1 “docker service create - -name=viz –publish=8080:8080/tcp
--con...
總結
• Docker一直持續在更新它的內容,很多特性不到半年就無法使用
• 編排(Orchestrator)工具目前雖是kubernetes拔得頭籌,但Swarm仍在
後持續追趕
• 越來越多編排工具支援docker-compose
Upcoming SlideShare
Loading in …5
×

Docker進階探討

1,070 views

Published on

This slide talk about more details about Docker and what is Docker Swarm mode.

There are also some examples in this slide, you can follow them to practice.

Published in: Software
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Docker進階探討

  1. 1. Docker進階探討 Docker內部實做細節與docker-compose/machine/swarm
  2. 2. 大綱 • Docker的那些事 • 倉儲(Registry) • 資料卷(Volume) • 網路(Network) • Docker compose • Docker machine • Docker swarm
  3. 3. Docker的組成 LXC Cgroup NameSpace chroot Other tools AUF • Docker在LXC的基礎上實現 • LXC是Linux內核容器技術的簡 稱,內部由以下組成: • Cgroup • Namespace • Chroot • 其它工具 • 採用AUF多層次檔案結構,提供 容器的擴充性
  4. 4. Cgroup CPU Memory /cpu_mem_cg /cgroup_2 /cgroup_1 Cgroup Hierachy --cpu-shares --cpuset-cpus --net --memory --blkio-weight 資源管理 Task 1 Task 2 Task n… • 由使用者自行定義資源群組 • Cgroup主要是做資源的控制,並將程序(Processor) 放進一個控制群組(group)中 • 透過分配資源給予這個控制群組,達成控制程序 的資源
  5. 5. Namespace MNT PID NET IPC UTS USER • MNT: 掛載點,檔案系統…等 • PID: 程序 • NET: NIC,路由…等 • IPC: 系統IPC • UTS: 主機/域名 • USER: UID/GID Proc 1 Proc 2 Root namespace Proc 1 Proc 2 Namespace A • 針對同一類資源抽象化,將其封裝 • 每個Namespace都有一份獨立的資源, 彼此不可見 • 在同一個種類(i.e. PID)中,資源的識別碼 是獨一無二;同一個識別碼可在不同Namespace 出現
  6. 6. AUFS與Cow(Copy on write) File 1 File 2 File 3 File 4 File 1 .wh.File 3 Top層 基底層 第一層 第二層 • 上層映象檔依賴於下層,每層映象檔都是Read-only • 啟動後的容器,最頂層是Writeable • 若某個檔案是第一次被修改,頂層會從底層copy檔案; 若某個檔案被刪除,則會以whiteout檔案來取代
  7. 7. Docker核心協作 • Cgroup提供容器管理資源的使用 • Namespace確保每個容器彼此獨立, 而不會互相干擾 • AUFS提供映像檔的擴充性
  8. 8. VM與容器-兼容 Physical Server Hypervisor OS Docker Engine Bins/Libs App 1 Bins/Libs App 2 OS Docker Engine Bins/Libs App 3 Bins/Libs App 4 • VM對於硬體的隔離性相較於容器為佳 • 以VM作為硬體隔離的邊界控制,而在VM 中使用容器 • 每一個應用程式跑在一個容器上
  9. 9. 映象檔 • 映象檔的資料結構: • 元資料(Metadata) • 多層映象檔 • 元資料紀錄了整個映象檔的相關資訊, 包含組態資訊與每層的檔案大小 • 當映象檔的層數越多,則相對地會產生 許多瑣碎的小檔案,不利於I/O • 映象檔無法加密,但可以使用notary簽名機制
  10. 10. 映象檔的儲存機制- Content Addressable Storage(CAS) • 映象檔中的分層透過內容加密Hash來引用與 儲存 • 提供了更高的安全性,也避免了ID衝突的問題 • 容器的ID依然是採用隨機產生的UUID,而其內 的每層都是依內容所產生的Hash值
  11. 11. 映象檔名稱解析 Remote-dockerhub.com/namespace/busybox:latest (遠端映象檔來源Url) (命名空間) (倉儲) (標籤) • 遠端映象檔來源Url: 集中存放映象檔的Web俟服器位址 • 命名空間: 使用者帳號/組織中所有映象檔的集合 • 倉儲: 一個倉儲可以有多個映象檔 • 標籤: 用來區分同一個用來區分映象檔的不同版本
  12. 12. 小結- Docker的那些事 • Docker本身是一個Processor等級的虛擬化 • Cgroup + Namespace都是Linux核心本身具備的 • VM與Docker兩者並非零和競爭,而是應該在實務中合併使用 • Docker映象檔的特性讓Docker變得更具備彈性 • Docker不斷地在效能方面有著更多的提升
  13. 13. 倉儲(Registry) –應用 RegistryImage Container Dockerfile Backup.tar commit run save load stop/start/restart tag 本機Docker實體 build push pull 本機 • 在開發的過程中利用公有倉儲取得映象檔 • 使用Dockerfile建構出所需要的映象檔, 接著再推到私有倉儲做管理
  14. 14. 倉儲與CI/CD Public Registry Developer Private Registry Dev QA Prod Pull Push/Pull Pull & Deploy • 開發人員從公有倉儲取得基礎映象檔, 在經過異動之後推送到私有倉儲 • 經過專案的持續進行,開發人員從私有 倉儲拉取修改完畢後,再推送回私有倉儲 • CI工具從私有倉儲取得映象檔,並在各個環境 中運行映象檔成為容器
  15. 15. 小結- 倉儲 • 私有倉儲對於開發和維運上都是極為重要的元件 • 盡可能使用官方提供的映象檔作為基礎映象檔來擴充,並將擴充後 的成果放(Push)到私有倉儲 • 可利用映象檔的標籤來區分不同開發環境所需要使用的映象檔
  16. 16. 資料卷 Docker Engine Mount Volume Plugin Device Storage 平台 Docker主機 • 容器本身不會將資料持久化;當容器執行完畢 之後,所有資料都將消失 • 容器可以綁定資料卷,將資料持久化到儲存裝 置上 • Docker提供Plugin機制,讓資料持久化能有更高 的擴充性
  17. 17. 資料卷操作模式-主機掛載 Docker Engine Mount Device Storage Docker主機 • 在啟動一個容器時,加上-v的旗標來指示 要將主機上那一個資料夾作為資料卷掛載 到容器中的那一個資料夾 • 無法直接掛載遠端機器上的資料卷
  18. 18. 資料卷操作模式-資料卷容器 Docker Engine Docker主機 • 創建一個資料卷容器是為了讓資料可以 更方便的被其它容器共用 • 使用docker create –v的方式來創建一個 資料卷容器 • 其它容器可以使用--volumes-from指示來 存取資料卷容器 --volumes-from --volumes-from Docker create -v
  19. 19. 資料卷操作模式-資料卷插件 Docker Engine Volume Plugin Storage 平台 Docker主機 • Docker插件是一個Web Service服務以背景 服務的方式在主機上運行 • 資料使用Http並以Json資料格式傳輸 • 插件的運行是自行管理,不受Docker Daemon 干涉 • 以docker volume create創建插件 • 以- -volume-driver指定使用的資料卷插件
  20. 20. 具名資料卷範例 Step1. 創建一個名為temp的資料卷 Step2. 檢視是否有創建成功 Step3. 創建容器並且添加一個檔案:Blah Step4. 創建第二容器並且檢查是否有檔案:Blah • 這種創建資料卷的方式,帶來的壞處就是 它與主機是綁定的;只能在這台主機才能 共用這個資料卷 • 資料卷若沒用到記得要定期刪除,可用指令: docker system prune
  21. 21. 資料卷容器範例 • 採用資料卷容器的好處在於其它容器只需要 和它綁定,就能夠共享持久化的資料 • 資料卷容器同樣有資料卷遺留的問題,需要定期 清除沒用到的資料卷 Step1. 創建一個資料卷容器,並且映射到主機某個位置 Step2. 以volumes-from指示要與那個資料卷容器綁定
  22. 22. 小結- 資料卷 • 資料卷是用來處理容器無法將資料持久化的問題 • 實務上,資料卷只能視為是持久化資料的一種替代手段,應該要把 資料儲存到資料庫中 • 資料卷有著難以移轉的困擾,可以考慮使用第三方資料卷驅動來處 理這個問題
  23. 23. Docker網路概念 Endpoint 網路沙箱 Docker容器 網路1 Endpoint 網路沙箱 Docker容器 Endpoint 網路2 Endpoint 網路沙箱 Docker容器• 沙箱: 是一個隔離的網路 執行環境,儲放了容器網 路棧的組態 • 端點: 將沙箱加入到一個 網路;採用veth pair來實做 • 網路: 網路包括一組能互相 通訊的端點 • 一個端點只能隸屬於一個沙箱及一個網路, 透過給沙箱添加多個端點,可以讓沙箱加入 多的網路 • 沙箱是用Linux的Network Namespace來實現的
  24. 24. Docker網路模式- 主機 eth0 Container eth0 Docker主機 • 容器會直接繼承自主機的網路設定 • 兩者所有的IP設定會是一致的
  25. 25. Docker網路模式- 網路橋接器 Container eth0 Docker主機 vethxxx docker0 eth0 veth pair iptable • Docker預設有一個名為:docker0的網路橋接器 • 當使用者沒有指定容器運行的模式,預設會直接套用橋接器模式
  26. 26. Docker網路模式- 無網路 Container Docker主機 • 容器的運行如果需要自行設定網路組態,則需要強制設定無網路模式 • 一旦設定了無網路模式,就需要以exec指令進入運行中的容器,進行 網路組態的手動設定
  27. 27. Docker網路模式- Overlay Container eth0 Docker主機 vethxxx docker0 eth0 veth pair iptable Container eth0 Docker主機 vethxxx docker0 eth0 veth pair iptable vxlanvxlan eth1 eth1 • Overlay網路應用在跨主機網路通訊之用 • 僅能在處於Swarm模式且為管理節點上創建Overlay網路
  28. 28. 小結- 網路 • 在過去會使用link旗標來串連容器,但這個方法有著容器啟動順序 的限制 • 網路帶來的好處是可以讓該網路中的所有容器,彼此以容器的名稱 來找到對方
  29. 29. Docker Compose • Docker compose是應用在多容器協作的情境 • 使用Docker Compose之後,就不需要使用Shell 來啟動多個容器 • 僅需要一個組態檔案,就可以啟動多個容器, 並且處理好多個容器之間的鏈接和依賴
  30. 30. Docker Compose指令- up,stop,start 指令: up 目的: 啟動服務 範例: docker-compose up [options] [Service…] 描述: 此命令會嘗試自動完成,包括: 建構映象檔,創建服務,啟動服務,並關聯服務相關容器的 一系列操作。 若容器組原本已經處於運行狀態,會嘗試停止並重新創建;若不希望停止,則在以命令: docker-compose up - -no-recreate 指令: stop 目的: 停止某個運行中的容器 範例: docker-compose stop [options] [Service…] 描述: 會停止指定並處於運行中的容器,但不會刪除它 指令: start 目的: 啟動某個停止中的容器 範例: docker-compose start [Service…] 描述: 會啟動指定並處於停止中的容器
  31. 31. Docker Compose指令- build, logs, port 指令: build 目的: 建構服務 範例: docker-compose build [options] [Service…] 描述: 建構(重新建構)某個服務容器,建構完畢後會多加一個tag名稱; 若資料夾名為web,而建構的對象是db,則tag名稱為:web_db 指令: logs 目的: 查看服務的輸出資訊 範例: docker-compose logs [options] [Service…] 描述: 查看容器的輸出,預設情境下,docker-compose會針對不同服務以不同顏色來區分 指令: port 目的: 開放某個容器的埠號與公共的埠號 範例: docker-compose port [options] service private_port 描述: 可以使用- -protocol來指定傳輸協定和埠號 - -index來指定執行此命令的對象容器
  32. 32. Docker Compose指令- scale, run, kill 指令: scale 目的: 擴展容器的數量 範例: docker-compose scale [options] [service=num, …] 描述: 可以一次擴展指定服務的容器個數 docker-compose scale web=3 db=2 指令: run 目的: 在指定的容器上執行一段指令 範例: docker-compose run [options] [-p Port…] [-e key=value…] service [command] [Args…] 描述: docker-compose run Ubuntu ping docker.com 這將會啟動一個Ubuntu容器,並執行指令: ping docker.com 預設情況下,除了Ubuntu之外,會連帶將其相關聯的服務都啟動,若不想要這個預設行為,可以加上 - -no-deps 指令: kill 目的: 強制停止某個服務容器 範例: docker-compose kill [options] [service…] 描述: 透過發送SIGKILL訊號來強制停止服務容器 docker-compose kill –s SIGINT
  33. 33. Docker Compose指令- scale, run, kill 指令: rm 目的: 刪除所有處於停止狀態的容器 範例: docker-compose rm [options] [service…] 描述: 建議先以stop指令停止容器,再使用這個指令,其有兩個常用旗標: -f,--force 強制直接刪除,包含非處於停止中的容器 -v 刪除容器所掛載的資料卷 指令: ps 目的: 列出目前專案中所有的容器 範例: docker-compose ps [options] [service…] 描述: 可以加上-q旗標,這樣docker compose只會輸出容器ID
  34. 34. Docker Compose 組態檔案 version: [版本] services: [服務名稱]: build 或 image: … ports: - “port映射” networks: - [網路1] volumes: - [位址] volumes: [位址]: networkds: [網路名稱]: • 目前最新是第三版 • Yml的結構為階層式,除了第一階層,餘下每個階層 都是以”兩個空白”開頭 • 服務可以有多個,若彼此是使用link來串連,則啟動 時,docker-compose會依序啟動容器 (建議仍是採用network的方式來串起多個容器) docker-compose.yml
  35. 35. Docker-compose組態命令- build, image, container_name, command 指令: build 目的: 建構映象檔,並使用這個映象檔 範例: build: [路徑] 描述: 指定Dockerfile所在的路徑(可以是絕對/相對*.yml路徑) 指令: container_name 目的: 容器名稱 範例: container_name: [容器名稱] 描述: 預設名稱格式為: 專案名稱_服務名稱_序號 指令: command 目的: 執行命令 範例: command: [指令] [參數…] 描述: 覆蓋容器啟動後,預設執行的指令 指令: image 目的: 服務的映象檔 範例: image: [名稱 | ID] 描述: 若本地找不到,docker-compose會嘗試去拉取(pull)
  36. 36. Docker-compose組態命令- environment, env_file, extends 指令: environment 目的: 設定環境變數,可使用陣列/字典兩種格式 範例: environment: - [key]:[value] 描述: 要注意的是;如果值是布林值(true|false, yes|no),最好使用引號以避免發生解析錯誤的問題 指令: env_file 目的: 從檔案中取得環境變數,可以是檔案路徑或是列表 範例: env_file: - [檔案路徑] 描述: 環境變數檔案中的每一個變數都需要符合”鍵值對”的格式,亦支持#開頭的註解方式 指令: extends 目的: 基於其它樣版檔案進行擴展 範例: extends: file: [樣版檔案].yml service: [樣版檔案中定義的某個Service] 描述: 要避免出現循環依賴的問題;並且extends不會繼承links和volumes_from定義的內容 建議: 盡可能在樣版檔案中定義一些可共享的映象檔和環境變數
  37. 37. Docker-compose組態命令- expose, ports, links 指令: expose 目的: 曝露端點給其它docker-compose中定義的其它容器使用 範例: expose: - “[埠號]” 描述: 這個端點的埠號不會與宿主主機綁定 指令: links 目的: 鏈結到其它服務的容器 範例: links: - [服務名稱] - [服務名稱]:[別名] 描述: 若直接使用服務名稱,則此服務名稱亦會成為其別名被容器所使用 指令: ports 目的: 曝露端點給其它docker-compose中定義的其它容器使用 範例: ports: - “[埠號]” - “[宿主埠號]”:”[容器埠號]” 描述: 若只有指定埠號,則宿主主機會隨機挑選一個埠號與之對映
  38. 38. Docker-compose組態命令- volumes, volumes_driver, volumes_from 指令: volumes 目的: 資料卷所掛載路徑設定 範例: volumes: - [宿主主機絕對/相對路徑]:[容器絕對/相對路徑] - [宿主主機絕對/相對路徑]:[容器絕對/相對路徑]:[存取模式] 指令: volumes_from 目的: 從另一個服務或容器掛載它的資料卷 範例: volumes_from: - [服務名稱] - [容器名稱] 指令: volumes_driver 目的: 使用第三方的驅動來創建一個資料卷 範例: volumes_driver: [driver名稱]
  39. 39. Docker-compose的網路設定 • Docker compose會在執行docker-compose up命令的時候,自動建構一個網路給 所有定義在組態檔案內的服務使用 • 早期常會使用link指令去串連指定的服務,但彼此會因為啟動的順序而造成docker-compose 啟動時間變得冗長 • 當前可以使用depends_on來取代link,如此一來,服務的啟動不需要等待彼此,速度會更快
  40. 40. Volumes設定的概念 • 常會看到在第一階層定義了一個volumes, 但是在每個服務內部又有一個volumes • 第一階的volumes定義的是資料卷名稱後綴(Postfix) • 可在第一階後綴添加存取權限(例: ro/rw) • 資料卷的名稱則是: 專案(資料夾名稱)_定義的名稱(db_data)
  41. 41. 小結- docker-compose • 實務上,經常會需要多個容器一起協作,docker-compose是專司處理 這方面的工作 • 越來越多的編排(Orchestractor)工具支援docker-compose • 當前的docker-compose已經支援到第三版(2017/03)
  42. 42. Docker Machine • 採用Go語言撰寫 • 支援多種後端驅動,包括:虛擬機,和雲平台 • 可以使用-d來指示要使用的驅動,目前支援的有: • Amazon EC2 • Azure • Digitalocean • Exoscale • Generic • Google • None • Openstack • Rackspace • Softlayer • Virtualbox • VMware vCloudair • VMware vSphere
  43. 43. Docker-machine指令 • active: 查看目前啟用中的Docker主機 • config: 輸出當前連接主機的組態資訊 • create: 創建一個Docker主機 • env: 顯示指定的Docker主機,其環境變數 • inspect: 輸出指定Docker主機更多詳細資訊 • ip: 取得Docker主機的IP • kill: 停止指定的Docker主機 • ls: 列出所有管理的主機 • regenerate-certs: 為某個Docker主機重新產生TLS憑證資訊 • restart: 重啟指定Docker主機 • rm: 刪除指定Docker主機 • ssh: ssh連線到指定Docker主機 • scp: 在Docker主機之間複製檔案 • start: 啟動指定Docker主機 • stop: 停止指定Docker主機 • upgrade: 更新Docker主機的Docker版本 • url: 取得指定Docker主機的Url
  44. 44. 小結- docker-machine • 利用docker-machine可以快速在各種不同平台建立出一台具有完 備Docker功能的虛擬機 • 在Hyper-V上,盡可能創建獨立的虛擬機網路給自建的docker主機使 用 • 未來支援的平台會越來越多
  45. 45. Docker Swarm • Docker Swarm是一套管理Docker叢集的工具,它 將一群Docker的宿主主機虛擬成為單一個主機 • Docker Swarm使用標準的Docker API作為其前端 的存取端點,因此,各種Docker整合工具都能夠與 它輕鬆的整合在一起 • Swarm有兩種模式,較早期的是容器模式,而最新的 則是Swarm模式
  46. 46. Swarm架構 Store Scheduler Discovery Service Swarm Manager Docker Client Docker APIs over HTTP Docker Hub Docker Daemon Swarm Node Docker Daemon Swarm Node Docker Daemon Swarm Node HTTPHTTP Docker APIs over HTTP • 在使用Swarm管理叢集時,會有一群扮演Manager, 以及工作節點。 • Client只需要和Manager溝通,而Manager會依據 Discovery Service的資訊來選擇一個工作節點來服務
  47. 47. Swarm排程 第一階段: 套用過濾器 • Constraint • 挑選滿足所有條件的節點,通常是限制 作業系統 • Affinity • 從三個面向: 容器/映象檔/標籤來挑選 節點 • Port • 挑選尚未被使用掉所期望埠號的節點 • Dependency • 與某些資源有強依賴性,挑選符合具有 這些資源的節點 • Health • 避開有可能會進入不健康狀態的節點 第二階段: 依策略執行 • Binpack • 依資源進行排序,挑選最佳的節點 • Spread • 依資源排序,且挑選容器數少的節點 • Random • 隨機挑選一個節點
  48. 48. Swarm探索服務 • 藉由Consul這個第三方的服務探索系統來達成 HA的效果 • 當某個節點崩潰,管理節點可以透過Consul感知到 • 節點的管理責任可由Consul負擔絕大部份 Swarm Manage Docker Daemon 2375 Consul Swarm Join 2375 8500 Swarm Manager 1 Swarm Manage Docker Daemon 2375 Consul Swarm Join 2375 8500 Swarm Manager 2 Swarm Manage Docker Daemon 2375 Consul Swarm Join 2375 8500 Swarm Manager 3 40008300 8300 Swarm Join Docker Daemon Swarm Worker 1 Swarm Join Docker Daemon Swarm Worker 2 Swarm Join Docker Daemon Swarm Worker 3 8500 8500 8500 2375 2375 2375 Swarm ManagerSwarm Worker User Dev/DevOps
  49. 49. 以容器建構Swarm - Consul-Server docker run –p 8400:8400 –p 8500:8500 –p 8600:53/udp –h node_master progrium/consul -server –bootstrap http://localhost:8500
  50. 50. 以容器建構Swarm - Consul - Replica docker run –d - -name node_worker –h node_worker progrium/consul --server –join [Consul Server Container IP] 目前已有兩個Node
  51. 51. 以容器建構Swarm - Swarm Manager Node docker run –d –p 4000:4000 swarm manage –H :4000 --replication - -advertise :4000 consul://[Consul Server Container IP]:8500
  52. 52. 以容器建構Swarm - Swarm Worker Node docker run –d swarm join - -advertise [node IP]:2375 consul://[Consul Server Container IP]:8500
  53. 53. 以容器建構Swarm - 確認狀態 • 藉由這個指令觀查Docker Swarm的狀態 • 目前僅有加入一個工作節點-moby docker –H :4000 info
  54. 54. Swarm三種版本 Docker Swarm Swarm Kit Swarm Next* 額外KV資料庫 需要(progrium/consul) 內建 內建 Security None 內建 內建 額外安裝 不需要 需要額外安裝 不需要 Extra Service None None Routing Mesh, Load Balance, Service Discovery 支援Docker-Compose 支援 支援 支援 • Docker Swarm: 最原始的Docker Swarm,需要透過docker - -swarm來呼叫 • Docker SwarmKit: 使用Github另外一個Open Source Project – docker/SwarmKit • Docker SwarmNext: 也就是Docker 1.12之後系統內建的Docker Swarm Mode
  55. 55. Swarm Next系統結構 Docker Worker Node tcp://localhost:2375 Docker Worker Node tcp://localhost:2375 Docker Worker Node tcp://localhost:2375 Docker Client strategy random binpacking spread *cluster filter affinity health constraint port dependency node discovery health label … cluster … node node node Server Handlers tcp://localhost:2375 Swarm • Swarm的管理節點本身並不運行容器,它不過是: 路由器+排程器 • 用戶藉由Docker Client與Swarm的管理節點溝通,而管理節點 會依據Discovery服務去選擇某個工作節點來啟動容器 • 由於Swarm的管理節點本身沒有運行容器,因此,就算它停擺 了也不會造成整個系統的崩潰
  56. 56. 以Swarm Mode建構Swarm- 創建Docker-machine docker-machine create –d hyperv - -hyperv-virtual-switch “[虛擬機網路名稱]” [docker主機名稱] • 需要創建兩個族群的docker-machine;一組是工作節點,另一組則是管理節點 • 每個族群約莫都要2個以上的docker-machine
  57. 57. 以Swarm Mode建構Swarm- 初始化Swarm模式 docker-machine ssh manager1 “docker swarm init - -listen-addr [manager1 IP] --advertise-addr [manager1 IP]” • 在接下來的所有Swarm操作都會需要用到各個docker-machine的IP資訊 • 使用docker-machine ls可以看到當前Hyper-V中所有的資訊
  58. 58. 以Swarm Mode建構Swarm- 取得Join-Token docker-machine ssh manager1 “docker swarm join-token manager -q” docker-machine ssh manager1 “docker swarm join-token worker -q” Manager Token: Worker Token: • 要特別小心Token一共有兩種,這兩個Token是用來讓其它docker-machine加入; 依照不同族群可以使用不同Token去加入Swarm • 由於待會一直會需要用到,可以先將這兩個Token複製
  59. 59. 以Swarm Mode建構Swarm- 添加一個管理節點 docker-machine ssh manager2 “docker swarm join - -token [manager token] - -listen-addr [manager2 IP] --advertise-addr [manager2 IP] [manager1 IP]” • 由於是要加入到管理族群,所使用的Token就必須是管理的Token • 參數--advertise-addr: 其它節點可以用這個位址存取到管理節點
  60. 60. 以Swarm Mode建構Swarm- 添加一個工作節點 docker-machine ssh worker1 “docker swarm join - -token [worker token] --advertise-addr [worker1 IP] [manager1 IP]” • 由於是要加入到工作族群,所使用的Token就必須是工作的Token • 工作節點所需要的參數不像管理節點那麼多
  61. 61. 以Swarm Mode建構Swarm- 觀察Swarm節點的狀況 • 當所有節點都加入完成之後,記得一定要在使用這個指令檢查一下是否有問題 • 這個指令只能應用在管理節點 docker-machine ssh manager1 “docker node ls”
  62. 62. 與Swarm相關的Docker指令 Docker Swarm node servicestack
  63. 63. Docker swarm相關命令解析 • demote: 將Swarm中的管理節點降級 • inspect: 檢視節點詳細資訊 • ls: 列舉所有節點 • promote: 將Swarm中的工作節點升級 • ps: 檢視某個節點上正在運行的任務 • rm: 從Swarm中移除1~多個節點 • update: 更新Swarm中某個節點 docker node指令 • create: 創建一個服務 • inspect: 檢視節點詳細資訊 • logs: 取得某個服務的日誌資訊 • ls: 列舉所有節點 • ps: 檢視某個節點上正在運行的任務 • rm: 從Swarm中移除1~多個節點 • scale: 擴展服務的副本數量 • update: 更新Swarm中某個節點 docker service指令 • deploy: 部署新的或更新已存在的服務堆疊 • ls: 列舉所有節點 • ps: 檢視某個節點上正在運行的任務 • rm: 從Swarm中移除1~多個節點 • services: 列舉服務堆疊裡的服務資訊 docker stack指令
  64. 64. 範例: Wordpress- 複製到docker-machine 使用winScp連線,預設的帳號/密碼: docker/tcuser
  65. 65. 範例: Wordpress- 部署服務 docker-machine ssh manager1 “docker stack deploy - -compose-file docker-compose.yml vassiblity” • vassiblity可以被省略;其為服務的前綴字 • 使用stack deploy會自動為其構建網路
  66. 66. 範例: Wordpress- 以瀏覽器連線到Wordpress 網址: http://10.66.66.181
  67. 67. 範例: Wordpress- 將Wordpress服務擴充為N個 docker-machine ssh manager1 “docker service scale [服務名稱]=[擴充到N個節點數]” • 服務的名稱可以使用docker service ls來觀察 • 除了可以使用docker service scale來擴展服務之外,還可以使用docker service update
  68. 68. 範例: Wordpress- 視覺化觀察Swarm的容器部署 docker-machine ssh manager1 “docker service create - -name=viz –publish=8080:8080/tcp --constraint=node.role==manager –mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock manomarks/visualizer 10.66.66.181:8080
  69. 69. 總結 • Docker一直持續在更新它的內容,很多特性不到半年就無法使用 • 編排(Orchestrator)工具目前雖是kubernetes拔得頭籌,但Swarm仍在 後持續追趕 • 越來越多編排工具支援docker-compose

×