一、前言
隨着互聯網快速發展,以及微服務架構的流行,服務器的壓力越來越大。上一篇介紹的 Docker Compose 項目,可以將多個容器捏合在一起,實現容器間的通信,比如 Web 項目對 DB、Cache 的依賴,以及微服務之間的通信等。但這還是遠遠不夠的,Docker Compose 僅僅局限在一個 Docker 主機上,服務器的壓力仍然沒有得到解決,怎么辦呢?集群唄!Docker Swarm 可以將多個 Docker 主機 集群成一個大型的虛擬 Docker 主機,然后在上面部署服務,當服務器壓力上來時,不斷的往 Swarm 集群中添加 Docker 主機就行了!更重要的,不必像傳統發布那樣,在每台服務器上都運行一遍分布式項目,大大節約了流程和工作量。
由於沒有多台 Docker 主機給我做集群操作,以及 Centos 7 上 安裝虛擬機各種報錯,以下多為學習筆記。
二、基本概念
Swarm 是使用 SwarmKit 構建的 Docker 引擎內置(原生)的集群管理和編排工具,提供 Docker 容器集群服務。
Swarm 集群中每台 Docker 主機稱為一個節點。其中主動初始化一個 Swarm 集群的節點稱為管理節點,加入一個Swarm 集群的節點稱為工作節點。工作節點是任務執行節點,管理節點將任務下發至工作節點執行。管理節點默認也作為工作節點。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為 leader。
任務(Task):是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。
服務(Services):是指一組任務的集合,服務定義了任務的屬性,主要有兩種模式(通過 docker service create 的 --mode 參數指定):
-- replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
-- global services 每個工作節點上運行一個任務
三、創建 Swarm 集群
1、創建管理節點
docker swarm init
這樣就初始化了一個 Swarm 集群,執行該命令的節點自動成為管理節點,命令的結果會給出提示表示如何加入該節點,如下。
2、創建工作節點
docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377
表示該 Docker 主機作為工作節點,加入到 Swarm 集群中。
3、查看集群
#管理節點使用 docker node ls
四、部署升級服務
1、部署服務
現在我們將多個 Docker 主機虛擬成一個大型的虛擬主機了,我們使用 docker service 命令來管理 Swarm 集群中的服務,該命令只能在管理節點運行。
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
--replicas 3 為該鏡像創建三個副本集,管理節點會將副本實例均勻部署在集群中的 Docker 主機上 --name 服務名
使用 docker service ls 來查看當前 Swarm 集群中運行的服務。
使用 docker service ps [服務名] 來查看某個服務的詳情。
使用 docker service logs [服務名] 來查看某個服務的日志。
使用 docker service scale 對一個服務運行的容器數量進行伸縮,根據業務的壓力自由伸縮容器的數量:
docker service scale nginx=[num]
使用 docker service rm 來從 Swarm 集群中移除某個服務。
2、升級服務
docker service update --image nginx:1.13.12-alpine nginx
--image nginx:1.13.12-alpine 鏡像名 nginx 需要升級的服務名
3、回退服務
如果新部署的服務出現問題,我們需要快速的將服務回退到前一個版本!
docker service rollback [服務名]
五、管理敏感數據和配置信息
1、使用 secret 管理敏感數據
在動態的、大規模的分布式集群上,管理和分發密碼、證書 等敏感信息是極其重要的工作。我們可以用 docker secret 命令來管理敏感信息,並允許在多個Docker 容器實例之間共享訪問制定的敏感數據。
secret創建后其內容是不能更新的,只能刪除掉舊的secret然后再重新創建,並且不能刪除正在被使用的secret。
printf 'mysqlPassword' | docker secret create mysql_password -
使用 docker secret ls 命令來查看 secret 。
創建 MySQL 服務:
docker service create \ --name mysql \ --replicas 1 \ --network mysql_private \ --mount type=volume,source=mydata,destination=/var/lib/mysql \ --secret source=mysql_root_password,target=mysql_root_password \ --secret source=mysql_password,target=mysql_password \ -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \ -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \ -e MYSQL_USER="wordpress" \ -e MYSQL_DATABASE="wordpress" \ mysql:latest
如果沒有在 target 中顯式的指定路徑時,secret 默認通過 tmpfs 文件系統掛載到容器的 /run/secrets 目錄中。
secret 也可以在 Docker Compose 中使用。
2、使用 config 管理配置信息
Docker 新增了 docker config 子命令來管理集群中的配置信息,用戶無需將配置文件放入鏡像或掛載到容器中就可實現對服務的配置。
創建 config
docker config create redis.conf redis.conf
使用 docker config ls 命令來查看 config
利用配置文件創建服務:
#如果沒有在 target 中顯式的指定路徑時,默認的 redis.conf 以 tmpfs 文件系統掛載到容器的 /config.conf docker service create \ --name redis \ # --config source=redis.conf,target=/etc/redis.conf \ --config redis.conf \ -p 6379:6380 \ redis:latest \ redis-server /redis.conf
config 僅能在 Swarm 集群中使用。