docker compose:單機部署,使用docker compose編排多個服務
docker swarm:多機部署,實現對單個服務的簡單部署(通過dockerfile)
docker stack :實現集羣環境下多服務編排。(通過compose.yml)
狂神說docker(最全筆記)_狂神說docker筆記-CSDN博客
docker-compose教程(安裝,使用, 快速入門)-CSDN博客
docker-compose文件結構
docker-compose.yml:
version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: frontend: backend: volumes: db-data:
Docker三劍客之docker-swarm
Docker三劍客之docker-swarm - 會飛的豬的文章 - 知乎 https://zhuanlan.zhihu.com/p/93459309
簡介
Swarm是Docker官方提供的一款集羣管理工具,其主要作用是把若干臺Docker主機抽象爲一個整體,並且通過一個入口統一管理這些Docker主機上的各種Docker資源。Swarm和Kubernetes比較類似,但是更加輕,具有的功能也較kubernetes更少一些。
swarm集羣提供給用戶管理集羣內所有容器的操作接口與使用一臺Docker主機基本相同。
Swarm一些概念說明
1、節點
運行 Docker 的主機可以主動初始化一個 Swarm 集羣或者加入一個已存在的 Swarm 集羣,這樣這個運行 Docker 的主機就成爲一個 Swarm 集羣的節點 (node) 。
節點分爲管理 (manager) 節點和工作 (worker) 節點。
管理節點用於 Swarm 集羣的管理,docker swarm 命令基本只能在管理節點執行(節點退出集羣命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集羣可以有多個管理節點,但只有一個管理節點可以成爲 leader,leader 通過 raft 協議實現。
工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作爲工作節點。你也可以通過配置讓服務只運行在管理節點。
來自 Docker 官網的這張圖片形象的展示了集羣中管理節點與工作節點的關係。
2、服務和任務
任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。
服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
global services 每個工作節點上運行一個任務
兩種模式通過 docker service create 的 --mode 參數指定。
來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關係。
Swarm 調度策略
Swarm在scheduler節點(leader 節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個 Node 來運行容器,一般用作調試用,spread 和 binpack 策略會根據各個節點的可用的 CPU, RAM 以及正在運行的容器的數量來計算應該運行容器的節點。
2)Spread
在同等條件下,Spread 策略會選擇運行容器最少的那臺節點來運行新的容器,binpack 策略會選擇運行容器最集中的那臺機器來運行新的節點。使用 Spread 策略會使得容器會均衡的分佈在集羣中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
3)Binpack
Binpack 策略最大化的避免容器碎片化,就是說 binpack 策略儘可能的把還未使用的節點留給需要更大空間的容器運行,儘可能的把容器運行在一個節點上面。
Swarm命令行說明
docker swarm:集羣管理
init #初始化集羣
join #將節點加入集羣
join-token #管理加入令牌
leave #從集羣中刪除某個節點,強制刪除加參數--force
update #更新集羣
unlock #解鎖集羣
docker node:節點管理,
demote #將集羣中一個或多個節點降級
inspect #顯示一個或多個節點的詳細信息
ls #列出集羣中的節點
promote #將一個或多個節點提升爲管理節點
rm #從集羣中刪除停止的節點,--force強制刪除參數
ps #列出一個或多個節點上運行的任務
update #更新節點
docker service:服務管理,
create #創建一個新的服務
inspect #列出一個或多個服務的詳細信息
ps #列出一個或多個服務中的任務信息
ls #列出服務
rm #刪除一個或多個服務
scale #擴展一個或多個服務
update #更新服務
安裝佈署swarm集羣服務
manager:192.168.124.129
node:192.168.124.132
1、修改主機名,配置hosts文件
[root@manager ~]# cat >>/etc/hosts<<EOF
192.168.124.129 manager
192.168.124.132 node1
EOF
[root@manager ~]# tail -3
/etc/hosts
192.168.124.129 manager
192.168.124.132 node1
#node1 node2配置同上一致即可
2、配置docker
編輯docker文件:/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
修改ExecStart行爲下面內容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
重新加載docker配置
systemctl daemon-reload // 1,加載docker守護線程
systemctl restart docker // 2,重啓docker
所有節點加上上面標記的部分,開啓2375端口
3、所有節點下載swarm鏡像文件
$ docker pull swarm
4、創建swarm並初始化
$ docker swarm init --advertise-addr 192.168.124.129
Swarm initialized: current node (4c70fdpk3ip083rg7nnuk5stw)
is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x
192.168.124.129:2377
To add a manager to this swarm, run 'docker swarm join-token manager'
and follow the instructions.
#執行上面的命令後,當前的服務器就加入到swarm集羣中,同時會產生一個唯一的token值,其它節點加入集羣時需要用到這個token。
#--advertise-addr 表示swarm集羣中其它節點使用後面的IP地址與管理節點通訊,上面也提示了其它節點如何加入集羣的命令。
5、將node1加入到集羣中
在node1下執行
$ docker swarm join --token SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x
192.168.124.129:2377
This node joined a swarm as a worker.
6、管理節點查看集羣節點狀態
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
4c70fdpk3ip083rg7nnuk5stw
* manager Ready
Active
Leader
18.09.0
5viloj6u950gkilsl689aonyn node1 Ready
Active
Reachable
18.09.0
#swarm集羣中node的AVAILABILITY狀態有兩種:Active、drain。其中actice狀態的節點可以接受管理節點的任務指派;drain狀態的節點會結束任務,也不會接受管理節點的任務指派,節點處於下線狀態。
7、Swarm 的Web管理
$ docker run -d -p 9000:9000
-v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
瀏覽器訪問
docker-swarm佈署服務
1、佈署服務前創建於個用於集羣內不同主機之間容器通信的網絡
$ docker network create -d overlay dockernet
5lhuzjkx36j40na59gmu400op
2、創建服務(nginx爲例)
$docker service create --replicas 1
--network dockernet --name nginx-cluster -p 80:80 nginx
klpwtncehp0vkh0d1gqqvicf6
#--replicas 指定副本數量
$docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
klpwtncehp0v nginx-cluster replicated 1/1 nginx:latest *:80->80/tcp
$ docker service ps nginx-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j1y2blg3pa7j nginx-cluster.1 nginx:latest manager Running
Running
53 seconds ago
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a2e361f535b nginx:latest "nginx -g 'daemon of…"
About a minute ago Up
About a minute 80/tcp nginx-cluster.1.j1y2blg3pa7j9mtg54e2csr7f
3、在線動態擴容服務
docker service scale nginx-cluster=5
nginx-cluster scaled to 5
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
klpwtncehp0v nginx-cluster replicated 5/5 nginx:latest *:80->80/tcp
$ docker service ps nginx-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j1y2blg3pa7j nginx-cluster.1 nginx:latest manager Running
Running
3 minutes ago
y5ib98y3rr5i nginx-cluster.2 nginx:latest node1 Running
Running
35 seconds ago
wpiydfv0j2w5 nginx-cluster.3 nginx:latest node1 Running
Running
35 seconds ago
ibl73haatpvc nginx-cluster.4 nginx:latest manager Running
Running about a minute ago
a6oa1h83ba3c nginx-cluster.5 nginx:latest node1 Running
Running
35 seconds ago
#從輸出結果可以看出已經將服務動態擴容至5個,也就是5個容器運行着相同的服務
4、節點故障
$ docker service ps nginx-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j1y2blg3pa7j nginx-cluster.1 nginx:latest manager Running
Running
45 minutes ago
ugx002mtbfmp nginx-cluster.2 nginx:latest manager Running
Running
7 seconds ago
y5ib98y3rr5i \_ nginx-cluster.2 nginx:latest node1 Shutdown
Shutdown
11 seconds ago
q1f5jhhx7kcy nginx-cluster.3 nginx:latest manager Running
Running
7 seconds ago
wpiydfv0j2w5 \_ nginx-cluster.3 nginx:latest node1 Shutdown
Shutdown
11 seconds ago
ibl73haatpvc nginx-cluster.4 nginx:latest manager Running
Running
43 minutes ago
a6f7zpclrpm4 nginx-cluster.5 nginx:latest manager Running
Running
7 seconds ago
a6oa1h83ba3c \_ nginx-cluster.5 nginx:latest node1 Shutdown
Shutdown
11 seconds ago
#如果集羣中節點發生故障,會從swarm集羣中被T除,然後利用自身的負載均衡及調度功能,將服務調度到其它節點上
5、其它常用命令介紹
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
klpwtncehp0v nginx-cluster replicated 5/5 nginx:latest *:80->80/tcp
$ docker service update --replicas 2 nginx-cluster
nginx-cluster
#將服務縮減到2個
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
klpwtncehp0v nginx-cluster replicated 2/2 nginx:latest *:80->80/tcp
$ docker service update --image nginx:new nginx-cluster
#更新服務的鏡像版本
$ docker rm nginx-cluster
#將所有節點上的所有容器全部刪除,任務也將全部刪除
docker swarm 集羣服務編排部署指南(docker stack) - DPDK原理的文章 - 知乎 https://zhuanlan.zhihu.com/p/620868766
Docker Swarm 集羣管理
概述
Docker Swarm 是 Docker 的集羣管理工具。它將 Docker 主機池轉變爲單個虛擬 Docker 主機,使得容器可以組成跨主機的子網網絡。Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕鬆地擴展到多個主機。
集羣的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啓動 swarm 模式或者加入已存在的 swarm。
支持的工具包括但不限於以下各項:
- Dokku
- Docker Compose
- Docker Machine
- Jenkins
Docker Swarm 優點
- 任何規模都有高性能表現
對於企業級的 Docker Engine 集羣和容器調度而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個服務器——都能在其環境下有效使用 Swarm。
經過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每個容器的啓動時間爲亞秒級,同時性能無減損。
- 靈活的容器調度
Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調度器(scheduler)支持多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。
- 服務的持續可用性
Docker Swarm 由 Swarm Manager 提供高可用性,通過創建多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那麼一個 slave 節點就會被升格爲 master 節點,直到原來的 master 節點恢復正常。
此外,如果某個節點無法加入集羣,Swarm 會繼續嘗試加入,並提供錯誤警報和日誌。在節點出錯時,Swarm 現在可以嘗試把容器重新調度到正常的節點上去。
- 和 Docker API 及整合支持的兼容性
Swarm 對 Docker API 完全支持,這意味着它能爲使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。
- Docker Swarm 爲 Docker 化應用的核心功能(諸如多主機網絡和存儲卷管理)提供原生支持
開發的 Compose 文件能(通過 docker-compose up )輕易地部署到測試服務器或 Swarm 集羣上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 裏 pull 並 run 鏡像。
- 集羣模式,當修改了服務的配置後無需手動重啓服務。並且只有集羣中的manager才能管理集羣中的一切(包括服務、容器都歸它管,在一個woker節點上無法操作容器)
節點
swarm 集羣由管理節點(manager)和工作節點(work node)構成。
- swarm mananger:負責整個集羣的管理工作包括集羣配置、服務管理等所有跟集羣有關的工作。一個 Swarm 集羣可以有多個管理節點,但只有一個管理節點可以成爲 leader,leader 通過 raft 協議實現。
爲了利用swarm模式的容錯功能,Docker建議根據組織的高可用性要求實現奇數個節點。當您擁有多個管理器時,您可以從管理器節點的故障中恢復而無需停機。
N個管理節點的集羣容忍最多損失 (N-1)/2 個管理節點。
Docker建議一個集羣最多7個管理器節點。
- work node:即圖中的 available node,主要負責運行相應的服務來執行任務(task)。工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作爲工作節點。也可以通過配置讓服務只運行在管理節點。
服務和任務
任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。
服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
replicated services (複製服務)按照一定規則在各個工作節點上運行指定個數的任務。
global services (全局服務)每個工作節點上運行一個此任務。
兩種模式通過 docker service create 的 --mode 參數指定。下圖展示了容器、任務、服務的關係。
路由網格
service 通過 ingress load balancing 來發布服務,且 swarm 集羣中所有 node 都參與到 ingress 路由網格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務。
當訪問任何節點上的端口8080時,Docker將請求路由到活動容器。在羣節點本身,端口8080可能並不實際綁定,但路由網格知道如何路由流量,並防止任何端口衝突的發生。
路由網格在發佈的端口上監聽分配給節點的任何IP地址。對於外部可路由的IP地址,該端口可從主機外部獲得。對於所有其他IP地址,只能從主機內部訪問。
Swarm 集羣的搭建
準備工作
二個或二個以上可以通過網絡進行通信的Linux主機或虛擬機,並安裝了Docker(加入開機自啓),或者使用docker-machine 創建三臺虛擬機。swarm 不需要單獨安裝,安裝了 docker 就自帶了該軟件
已安裝Docker Engine 1.12或更高版本
關閉所有主機上的防火牆或者開放以下端口:
TCP協議端口 2377 :集羣管理端口
TCP協議端口 7946 :節點之間通訊端口(不開放則會負載均衡失效)
UDP協議端口 4789 :overlay網絡通訊端口
防火牆相關命令:
# 查看firewalld防火牆狀態
systemctl status firewalld
# 查看所有打開的端口
firewall-cmd --zone=public --list-ports
# 防火牆開放端口(更新firewalld防火牆規則後生效)
firewall-cmd --zone=public --add-port=要開放的端口/tcp --permanent
# 選項:
–zone # 作用域
–add-port=80/tcp # 添加端口,格式爲:端口/通訊協議
–permanent #永久生效,沒有此參數重啓後失效
# 示例:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# firewalld防火牆關閉接口(更新firewalld防火牆規則後生效)
firewall-cmd --zone=public --remove-port=要關閉的端口/tcp --permanent
# 更新firewalld防火牆規則(並不中斷用戶連接,即不丟失狀態信息)
firewall-cmd --reload
# 啓動firewalld防火牆
systemctl start firewalld
# 關閉firewalld防火牆:
systemctl stop firewalld
# 開機禁用firewalld防火牆
systemctl disable firewalld
# 開機啓用firewalld防火牆:
systemctl enable firewalld
- 分別修改機器的主機名,更改成 swarm01,swarm02 …
hostnamectl set-hostname swarm01
創建docker swarm集羣
1.master主機上初始化swarm。執行 docker swarm init 命令的節點自動成爲管理節點。
docker swarm init
# 注:如果主機有多個網卡,擁有多個IP,必須使用 --advertise-addr 指定 IP。
# 示例:
docker swarm init --advertise-addr 192.168.99.100
# 執行命令後會給出加入這個swarm的命令
Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2.在node主機上執行命令加入swarm
docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377
3.查看集羣信息。集羣的大部分命令需要在管理節點中才能運行
# 查看 swarm 集羣狀態
docker info
# 查看集羣節點信息
docker node ls
Swarm 集羣管理常用命令
docker swarm:管理集羣
# 初始化一個swarm
docker swarm init [OPTIONS]
# 選項:
--advertise-addr string # 發佈的地址(格式:<ip|interface>[:port])
--force-new-cluster # 強制從當前狀態創建一個新的集羣(去除本地之外的所有管理器身份)
--cert-expiry duration # 節點證書有效期(ns|us|ms|s|m|h)(默認爲2160h0m0s)
--data-path-addr string # 用於數據路徑通信的地址或接口(格式: <ip|interface>)
--data-path-port uint32 # 用於數據路徑流量的端口號(1024 - 49151)。如果沒有值,則默認端口號4789
--dispatcher-heartbeat duration # 調度程序的心跳週期(ns|us|ms|s|m|h)(默認爲5s)
--listen-addr node-addr # 監聽地址(格式: <ip|interface>[:port]) (默認 0.0.0.0:2377)
# 查看加入節點到集羣的命令及令牌(token)
docker swarm join-token [OPTIONS] (worker|manager)
# 選項:
-q, --quiet # 只顯示令牌
--rotate # 使舊令牌無效並生成新令牌
# 查看加入工作節點到集羣的命令及令牌
docker swarm join-token worker
# 查看加入管理節點到集羣的命令及令牌
docker swarm join-token manager
# 將節點加入swarm集羣,作爲一個manager或worker
docker swarm join [OPTIONS] HOST:PORT
# 選項:
--advertise-addr string # 發佈的地址 (格式: <ip|interface>[:port])
--availability string # 節點的可用性 ("active"|"pause"|"drain") (default "active")
--data-path-addr string # 用於數據路徑通信的地址或接口 (格式: <ip|interface>)
--listen-addr node-addr # 監聽地址 (格式: <ip|interface>[:port]) (default 0.0.0.0:2377)
--token string # 進入的swarm集羣的令牌
# 主動退出集羣,讓節點處於down狀態(在需要退出Swarm集羣的節點主機上執行命令)
docker swarm leave [OPTIONS]
# 選項:
-f, --force # 強制。Manager若要退出 Swarm 集羣,需要加上強制選項
## 移除一個work-node節點主機的完整步驟:
# 1.在管理節點上操作,清空work-node節點的容器。id 可以使用命令 docker node ls 查看
docker node update --availability drain [id]
# 2.在work-node節點主機上操作,退出集羣
docker swarm leave
# 3,在管理節點上操作,刪除work-node節點
docker node rm [id]
# 若想解散整個集羣,則需先移除所有work-node節點主機,然後所有管理節點也退出集羣
# 更新 swarm 集羣的配置
docker swarm update [OPTIONS]
# 選項:
--autolock # 更改管理器自動鎖定設置(true|false)
--cert-expiry duration # 節點證書有效期(ns|us|ms|s|m|h)(默認爲2160h0m0s)
--dispatcher-heartbeat duration # 調度程序心跳週期(ns|us|ms|s|m|h)(默認爲5s)
docker node:管理swarm集羣節點
# 查看集羣中的節點
docker node ls
#選項:
-f, --filter filter # 根據所提供的條件過濾輸出。(格式:key=value)
# 目前支持的過濾器是:id, label, name, membership[=accepted|pending]
# , role[manager|worker]
-q, --quiet # 只顯示id
# 查看運行的一個或多個及節點任務數,默認當前節點
docker node ps [OPTIONS] [NODE...]
#選項:
-f, --filter filter # 根據所提供的條件過濾輸出
-q, --quiet # 只顯示id
# 將worker角色升級爲manager
docker node promote NODE [NODE...]
# 將manager角色降級爲worker
docker node demote NODE [NODE...]
# 查看節點的詳細信息,默認json格式
docker node inspect 主機名
# 查看節點信息平鋪格式
docker node inspect --pretty 主機名
# 從swarm中刪除一個節點
docker node rm 主機名
# 從swarm中強制刪除一個節點
docker node rm -f 主機名
# 更新一個節點
docker node update [options] 主機名
# 選項
--label-add list # 添加節點標籤(key=value)
--label-rm list # 刪除節點標籤
--role string # 更改節點角色 ("worker"|"manager")
--availability active/pause/drain # 設置節點的狀態
# active 正常
# pause 暫停。調度程序不向節點分配新任務,但是現有任務仍然保持運行
# drain 排除自身work任務。調度程序不向節點分配新任務,且會關閉任何現有任務並在可用節點上安排它們
docker service:服務管理
# 列出服務列表
docker service ls
# 列出服務任務信息
docker service ps [OPTIONS] SERVICE [SERVICE...]
# 選項:
--no-trunc # 顯示完整的信息
-f, --filter filter # 根據所提供的條件過濾輸出。過濾只運行的任務信息:"desired-state=running"
-q, --quiet # 只顯示任務id
# 查看服務內輸出
docker service logs [OPTIONS] SERVICE|TASK
# 選項:
--details # 顯示提供給日誌的額外細節
-f, --follow # 跟蹤日誌輸出
--since string # 顯示自時間戳 (2013-01-02T13:23:37Z) 或相對時間戳 (42m for 42 minutes) 以來的日誌
-n, --tail string # 從日誌末尾顯示的行數(默認爲“all”)
-t, --timestamps # 顯示時間戳
# 更新服務的相關配置
docker service update [options] 服務名
# 選項
--args "指令" # 容器加入指令
--image IMAGE # 更新服務容器鏡像
--rollback # 回滾服務容器版本
--network-add 網絡名 # 添加容器網絡
--network-rm 網絡名 # 刪除容器網絡
--reserve-cpu int # 更新分配的cpu
--reserve-memory bytes # 更新分配的內存(示例:512m)
--publish-add 暴露端口:容器端口 # 映射容器端口到主機
--publish-rm 暴露端口:容器端口 # 移除暴露端口
--endpoint-mode dnsrr # 修改負載均衡模式爲dnsrr
--force # 強制重啓服務
--config-rm 配置文件名稱 # 刪除配置文件
--constraint-add list # 新增一個約束
--constraint-rm list # 移除一個約束
--placement-pref-add pref # 新增一個偏好
--placement-pref-rm pref # 移除一個偏好
--config-add 配置文件名,target=/../容器內配置文件名 # 添加新的配置文件到容器內
# 查看服務詳細信息,默認json格式
docker service inspect [OPTIONS] 服務名 [SERVICE...]
# 查看服務信息平鋪形式
docker service inspect --pretty 服務名
# 刪除服務
docker service rm [OPTIONS] 服務名 [SERVICE...]
# 縮容擴容服務容器副本數量
docker service scale 服務名=副本數 [SERVICE=REPLICAS...]
# 創建一個服務。一般搭建好 Swarm 集羣后,使用 docker stack 部署應用,此處僅作了解
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 選項:
--name string # 指定容器名稱
--replicas int # 指定副本數
--network 網絡名 # 添加網絡組
--mode string # 服務模式(複製或全局)(replicated | global)
--reserve-cpu int # 預留的cpu
--reserve-memory bytes # 預留的內存(512m)
--limit-cpu int # 限制CPU
--limit-memory bytes # 限制內存(512m)
-l, --label list # 服務的標籤(key=value)
--container-label list # 容器標籤(key=value)
-p, --publish 暴露端口:容器端口 # 映射容器端口到主機
-e, --env MYVAR=myvalue # 配置環境變量
-w, --workdir string # 指定工作目錄(示例:/tmp)
-restart-condition string # 滿足條件時重新啓動(no | always | on-failure | unless-stopped)
--restart-delay duration # 重新啓動嘗試之間的延遲 (ns/us/ms/s/m/h)
--restart-max-attempts int # 放棄前的最大重啓次數
--restart-window duration # 用於評估重啓策略的窗口 (ns/us/ms/s/m/h)
--stop-grace-period duration # 強制殺死容器前的等待時間 (ns/us/ms/s/m/h)
--update-delay duration # 更新之間的延遲(ns/us/ms/s/m/h)(默認 0s)
--update-failure-action string # 更新失敗的操作("pause"停止|"continue"繼續)(默認pause)
--update-max-failure-ratio float # 更新期間容忍的失敗率
--update-monitor duration # 每次任務更新後監控失敗的持續時間(ns/us/ms/s/m/h)(默認 0s)
--update-parallelism int # 同時更新的最大任務數(0表示一次更新全部任務)(默認爲1)
--endpoint-mode string # 負載均衡模式(vip or dnsrr) (默認 "vip")
--rollback-monitor 20s # 每次容器與容器之間的回滾時間間隔
--rollback-max-failure-ratio .數值 # 回滾故障率如果小於百分比允許運行(“.2”爲%20)
--mount type=volume,src=volume名稱,dst=容器目錄 # 創建volume類型數據卷
--mount type=bind,src=宿主目錄,dst=容器目錄 # 創建bind讀寫目錄掛載
--mount type=bind,src=宿主目錄,dst=容器目錄,readonly # 創建bind只讀目錄掛載
--config source=docker配置文件,target=配置文件路徑 # 創建docker配置文件到容器本地目錄
docker config:管理配置文件
# 查看已創建配置文件
docker config ls [OPTIONS]
# 選項:
-f, --filter filter # 根據所提供的條件過濾輸出
-q, --quiet # 只顯示id
# 查看配置詳細信息
docker config inspect 配置文件名
# 刪除配置
docker config rm CONFIG [CONFIG...]
# 創建配置文件
docker config create 配置文件名 本地配置文件
# 示例:新建配置文件並添加新配置文件到服務
# 1.創建配置文件
docker config create nginx2_config nginx2.conf
# 2.刪除舊配置文件
docker service update --config-rm ce_nginx_config 服務名
# 3.添加新配置文件到服務
ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx
docker network:管理網絡
# 查看集羣網絡列表
docker network ls
# 將容器連接到集羣網絡中
$ docker network connect [OPTIONS] NETWORK CONTAINER
# 選項
--alias strings # 爲容器添加網絡範圍的別名
--driver-opt string · # 指定網絡驅動程序
--ip string # 指定IPv4地址(如172.30.100.104)
--ip6 string # 指定IPv6地址(例如,2001:db8::33)
--link list # 添加到另一個容器的鏈接
--link-local-ip string # 爲容器添加一個鏈接本地地址
# 示例
docker network connect mynet nginx
# 斷開一個容器與集羣網絡的連接
$ docker network disconnect [OPTIONS] NETWORK CONTAINER
# 選項
-f, --force # 強制容器從網絡斷開連接
# 顯示一個或多個集羣網絡的詳細信息
$ docker network inspect [OPTIONS] NETWORK [NETWORK...]
# 選項
-f, --format string # 使用給定的Go模板格式化輸出
-v, --verbose # 輸出詳細的診斷信息
# 創建一個集羣網絡
$ docker network create [OPTIONS] NETWORK
# 選項
--attachable # 准許手動容器連接
--aux-address map # 網絡驅動使用的輔助IPv4或IPv6地址(默認映射[])
--config-from string # 要從其中複製配置的網絡
--config-only # 創建僅配置網絡
-d, --driver string # 管理網絡的驅動程序(默認爲“"bridge”)。選項:bridge、overlay、macvlan
--gateway strings # 指定IPv4或IPv6主子網網關。示例:172.20.0.1
--ingress # 創建羣路由-網格網絡
--internal # 限制外部訪問網絡
--ip-range strings # 從子範圍分配容器ip
--ipam-driver string # IP管理驅動(默認爲“default”)
--ipam-opt map # 設置IPAM驅動程序的特定選項(默認map[])
--ipv6 # 啓用IPv6網絡
--label list # 在網絡中設置元數據
-o, --opt map # 設置驅動程序特定選項(默認map[])
--scope string # 控制網絡的範圍
--subnet strings # 指定一個CIDR格式的網段。示例:172.20.0.0/24
# 示例:
docker network create -d overlay --attachable apps_net
# 移除所有未使用的集羣網絡
$ docker network prune [OPTIONS]
# 選項
--filter filter # 提供過濾值(e.g. 'until=<timestamp>')
-f, --force # 強制,沒有提示確認
# 刪除一個或多個集羣網絡
$ docker network rm NETWORK [NETWORK...]
# 別名:rm, remove
docker secret:管理敏感數據存儲
# 查看敏感數據卷列表
$ docker secret ls
# 顯示一個或多個敏感數據卷的詳細信息
$ docker secret inspect [OPTIONS] SECRET [SECRET...]
# 選項
--pretty # 易讀的格式打印信息
# 從文件或標準輸入創建一個敏感數據卷作爲內容
$ docker secret create [OPTIONS] SECRET [file|-]
# 選項
-d, --driver string # 指定驅動
-l, --label list # 指定標籤
--template-driver string # 指定模板驅動程序
# 移除一個或多個敏感數據卷
$ docker secret rm SECRET [SECRET...]
# 別名:rm, remove
docker網絡管理
參考:
docker的3種自定義網絡(bridge、overlay、macvlan)
Docker Swarm - 網絡管理
Docker的網絡模式bridge、host、container 、overlay
概述
Docker 提供三種 user-defined 網絡驅動:bridge,overlay 和 macvlan
overlay 和 macvlan 用於創建跨主機的網絡
Swarm 集羣產生兩種不同類型的流量:
- 控制和管理層面:包括 Swarm 消息管理等,例如請求加入或離開Swarm,這種類型的流量總是被加密的。(涉及到集羣內部的hostname、ip-address、subnet、gateway等)
- 應用數據層面:包括容器與客戶端的通信等。(涉及到防火牆、端口映射、網口映射、VIP等)
在 Swarm Service 中有三個重要的網絡概念:
- Overlay networks :管理 Swarm 中 Docker 守護進程間的通信。可以將服務附加到一個或多個已存在的 overlay 網絡上,使得服務與服務之間能夠通信。
- ingress network :是一個特殊的 overlay 網絡,用於服務節點間的負載均衡,處理與羣集服務相關的控制和數據流量。當任何 Swarm 節點在發佈的端口上接收到請求時,它將該請求交給一個名爲 IPVS 的模塊。IPVS 跟蹤參與該服務的所有IP地址,選擇其中的一個,並通過 ingress 網絡將請求路由到它。
- 初始化或加入 Swarm 集羣時會自動創建 ingress 網絡,大多數情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。
- docker_gwbridge :是一種橋接網絡,將 overlay 網絡(包括 ingress 網絡)連接到一個單獨的 Docker 守護進程的物理網絡。默認情況下,服務正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網絡。
- docker_gwbridge 網絡在初始化或加入 Swarm 時自動創建。大多數情況下,用戶不需要自定義配置,但是 Docker 允許自定義。
在管理節點上查看網絡
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
cb0ccb89a988 bridge bridge local
0174fb113496 docker_gwbridge bridge local
541b62778c0e host host local
8n7xppn5z4j2 ingress overlay swarm
369d459f340d none null local
overlay網絡驅動程序會創建多個Docker守護主機之間的分佈式網絡。該網絡位於(覆蓋)特定於主機的網絡之上,允許連接到它的容器(包括羣集服務容器)安全地進行通信。Docker透明地處理每個數據包與正確的Docker守護程序主機和正確的目標容器的路由。
自定義overlay 網絡
創建用於swarm服務的自定義的overlay網絡 命令:
docker network create -d overlay --attachable my-overlay
# 注:overlay 網絡創建可以在 Swarm 集羣下的任意節點執行,並同步更新到所有節點。
集羣中部署了兩個服務 nginx、alpine,現在我們進入alpine,去訪問nginx。
$ docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash
$ ping nginx
ping: bad address 'nginx'
$ wget 192.168.99.100:8080
Connecting to 192.168.99.100:8080 (192.168.99.100:8080)
index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA
發現集羣中的各個服務不能用名稱訪問的,只能用集羣服務發現的路由網絡訪問,若需要集羣中的服務能通過名稱進行訪問,這就需要用到上面自定義的 overlay 網絡。
刪除啓動的服務,重新創建指定使用自定義網絡的服務。
docker service rm nginx alpine
docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx
docker service create --name alpine --network my-overlay alpine ping www.baidu.com
進入alpine容器中,重新測試下:
$ ping nginx
PING nginx (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms
$ wget nginx
Connecting to nginx (10.0.0.2:80)
index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA
發現可以通過名稱進行集羣中的容器間的訪問了。
Docker Stack 部署應用
概述
單機模式下,可以使用 Docker Compose 來編排多個服務。Docker Swarm 只能實現對單個服務的簡單部署。而Docker Stack 只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集羣環境下的多服務編排。
stack是一組共享依賴,可以被編排並具備擴展能力的關聯service。
Docker Stack和Docker Compose區別
- Docker stack 會忽略了“構建”指令,無法使用 stack 命令構建新鏡像,它是需要鏡像是預先已經構建好的。 所以 docker-compose 更適合於開發場景;
- Docker Compose 是一個 Python 項目,在內部,它使用 Docker API 規範來操作容器。所以需要安裝 Docker -compose,以便與 Docker 一起在計算機上使用;Docker Stack 功能包含在 Docker 引擎中。你不需要安裝額外的包來使用它,docker stacks 只是 swarm mode 的一部分。
- Docker stack 不支持基於第2版寫的 docker-compose.yml ,也就是 version 版本至少爲3。然而 Docker Compose 對版本爲2和 3 的文件仍然可以處理;
- docker stack 把 docker compose 的所有工作都做完了,因此 docker stack 將佔主導地位。同時,對於大多數用戶來說,切換到使用
- 單機模式(Docker Compose)是一臺主機上運行多個容器,每個容器單獨提供服務;集羣模式(swarm + stack)是多臺機器組成一個集羣,多個容器一起提供同一個服務;
compose.yml deploy 配置說明
docker-compose.yaml 文件中 deploy 參數下的各種配置主要對應了 swarm 中的運維需求。
docker stack deploy 不支持的參數:
(這些參數,就算yaml中包含,在stack的時候也會被忽略,當然也可以爲了 docker-compose up 留着這些配置)
build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode
deploy:指定與服務的部署和運行有關的配置。注:只在 swarm 模式和 stack 部署下才會有用。且僅支持 V3.4 及更高版本。
可以選參數:
endpoint_mode:訪問集羣服務的方式。3.2版本開始引入的配置。用於指定服務發現,以方便外部的客戶端連接到swarm
vip:默認的方案。即通過 Docker 集羣服務一個對外的虛擬 ip對外暴露服務,所有的請求都會通過這個虛擬 ip 到達集羣服務內部的機器,客戶端無法察覺有多少個節點提供服務,也不知道實際提供服務的IP和端口。
dnsrr:DNS的輪詢調度。所有的請求會自動輪詢獲取到集羣 ip 列表中的一個 ip 地址。客戶端訪問的時候,Docker集羣會通過DNS列表返回對應的服務一系列IP地址,客戶連接其中的一個。這種方式通常用於使用自己的負載均衡器,或者window和linux的混合應用。
labels:在服務上設置標籤,並非附加在service中的容器上。如果在容器上設置標籤,則在deploy之外定義labels。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。
mode:用於指定是以副本模式(默認)啓動還是全局模式
- replicated:副本模式,複製指定服務到集羣的機器上。默認。
- global:全局模式,服務將部署至集羣的每個節點。類似於k8s中的DaemonSet,會在每個節點上啓動且只啓動一個服務。
replicas:用於指定副本數,只有mode爲副本模式的時候生效。
placement:主要用於指定約束和偏好。這個參數在運維的時候尤爲關鍵
- constraints(約束):表示服務可以部署在符合約束條件的節點上,包含了:
node attribute matches example
Home | NODE.ID 節點id Home | NODE.ID == 2ivku8v2gvtg4
node.hostname 節點主機名 node.hostname != node-2
node.role 節點角色 (manager/worker node.role == manager
node.platform.os 節點操作系統 node.platform.os == windows
node.platform.arch 節點架構 node.platform.arch == x86_64
node.labels 用戶定義的labels node.labels.security == high
engine.labels Docker 引擎的 labels engine.labels.operatingsystem == ubuntu-14.04
preferences(偏好):表示服務可以均勻分佈在指定的標籤下。
preferences 只有一個參數,就是spread,其參數值爲節點的屬性,即約束表中的內容
例如:node.labels.zone這個標籤在集羣中有三個值,分別爲west、east、north,那麼服務中的副本將會等分爲三份,分佈到帶有三個標籤的節點上。
max_replicas_per_node:3.8版本中開始引入的配置。控制每個節點上最多的副本數。
注意:當 最大副本數*集羣中可部署服務的節點數<副本數,會報錯
resources:用於限制服務的資源,這個參數在運維的時候尤爲關鍵。
示例:配置 redis 集羣運行需要的 cpu 的百分比 和 內存的佔用。避免佔用資源過高出現異常。
- limit:用於限制最大的資源使用數量
cpus:cpu佔比,值的格式爲百分比的小數格式
memory:內存的大小。示例:512M
- reservation:爲最低的資源佔用量。
cpus
memory
- restart_policy:容器的重啓策略
condition:重啓的條件。可選 none,on-failure 或者 any。默認值:any
delay:嘗試重啓的時間間隔(默認值:5s)。
max_attempts:最大嘗試重啓容器的次數,超出次數,則不再嘗試(默認值:一直重試)。
window:判斷重啓是否成功之前的等待時間(一個總的時間,如果超過這個時間還沒有成功,則不再重啓)。
- rollback_config:更新失敗時的回滾服務的策略。3.7版本加入。和升級策略相關參數基本一致。
- update_config:配置應如何更新服務,對於配置滾動更新很有用。
parallelism:同時升級[回滾]的容器數
delay:升級[回滾]一組容器的時間間隔
failure_action:若更新[回滾]失敗之後的策略:continue、 pause、rollback(僅在update_config中有) 。默認 pause
monitor:容器升級[回滾]之後,檢測失敗的時間檢測 (支持的單位:ns|us|ms|s|m|h)。默認爲 5s
max_failure_ratio:最大失敗率
order:升級[回滾]期間的操作順序。可選:stop-first(串行回滾,先停止舊的)、start-first(並行回滾,先啓動新的)。默認 stop-first 。注意:只支持v3.4及更高版本
compose.yml 文件示例
version: "3" # 版本號,deploy功能是3版本及以上纔有的
services: # 服務,每個服務對應配置相同的一個或者多個docker容器
redis: # 服務名,自取
image: redis:alpine # 創建該服務所基於的鏡像。使用stack部署,只能基於鏡像
ports: # 容器內外的端口映射情況
- "1883:1883"
- "9001:9001"
networks: # 替代了命令行模式的--link選項
- fiware
volumes: # 容器內外數據傳輸的對應地址
- "/srv/mqtt/config:/mqtt/config:ro"
- "/srv/mqtt/log:/mqtt/log"
- "/srv/mqtt/data/:/mqtt/data/"
command: -dbhost stack_mongo # 命令行模式中跟在最後的參數,此條沒有固定的格式,建議參照所部署的docker鏡像的說明文檔來確定是否需要該項、需要寫什麼
deploy:
mode: replicated
replicas: 6 # replicas模式, 副本數目爲1
endpoint_mode: vip
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==worker" # 部署位置,只在工作節點部署
- "engine.labels.operatingsystem==ubuntu 18.04"
preferences:
- spread: node.labels.zone
update_config:
parallelism: 2
delay: 10s
order: stop-first
networks: # 定義部署該項目所需要的網絡
fiware:
stack 常用命令
docker stack:編排部署應用
# 部署一個新的stack(堆棧)或更新現有的stack。別名:deploy, up
docker stack deploy [OPTIONS] 自定義STACK名稱
# 選項:
-c, --compose-file strings # Compose文件的路徑,或從標準輸入中讀取的“-”
--prune # 表示削減不再引用的服務。可以把一些down掉的service進行自動清理。
--orchestrator string # 指定編排模式 (swarm|kubernetes|all)
--resolve-image string # 請求倉庫來重新解析鏡像的摘要和支持的平臺。("always"|"changed"|"never") (默認 "always")
--with-registry-auth # 發送倉庫的授權詳情到Swarm代理
--orchestrator # 使用的容器編排服務
# 通過compose.yml文件指令部署
docker stack deploy -c 文件名.yml 自定義STACK名稱
# 列出現有堆棧。別名:ls, list
docker stack ls [OPTIONS]
# 列出堆棧中的任務
docker stack ps [OPTIONS] STACK
# 選項:
--no-trunc # 輸出完整信息
# 刪除一個或多個堆棧。別名:rm, remove, down
docker stack rm [OPTIONS] STACK [STACK...]
# 選項
--orchestrator string # 指定適配器 (swarm|kubernetes|all)
# 列出堆棧中的服務
docker stack services [OPTIONS] STACK