re.containerbase.startinternal 子容器啟動失敗_Python項目容器化實踐(二) Docker Machine和Docker Swarm...

前言

這篇文章介紹Docker生態中的常被提到的Engine、Machine和Swarm,大家以了解為主,工作需要再深入。

Engine

Docker Engine其實就是我們常說的「Docker」,它是一個C/S模型(Client/Server)的應用,包含如下組件:

  • Daemon。守護進程,屬于C/S中的Server(?dockerd)

  • REST API。Daemon向外暴露的REST 接口

  • CLI。向外暴露的命令行接口(Command Line API:?docker)

f20c1916a0eddc842c2299746f90dc3d.png

客戶端訪問服務端的方式有三種:

  • 使用命令行工具,如?docker run、?docker ps等等

  • 直接通過調用REST API,如發送一個?curl請求

  • 通過腳本直接和Daemon交互

用戶通過Docker CLI向Docker Daemon發送REST API請求。Daemon創建和管理Docker objects(對象),如:

  • images。鏡像

  • containers。容器

  • networks。網絡

  • volumes。數據卷

ccfc7c0fc821158f8ce4bb7d5ad147ae.png

Machine

在沒有Machine之前,Docker的安裝流程非常復雜,首先需要登錄到相應的主機上,根據官方的安裝和配置指南來安裝Docker,而且不同的操作系統的安裝步驟也不同。

Machine是一個簡化Docker Engine安裝和管理的命令行工具,這樣通過一個簡單的命令即可在相應的平臺上安裝Docker,如本地(macOS、Linux和Windows)、虛擬化平臺(VirtualBox、macOS xhyve等),公有云(AWS、Azure、Digital Ocean等)等。使用Machine可以啟動、審查、停止和重新啟動托管的宿主機、升級 Docker 客戶端和守護程序、并配置 Docker 客戶端與宿主機通信。

653dce59529dd4166fe3b4b44177b3a8.png

通過圖示可以看出來,Machine是管理本地/遠程帶有Docker Engine的主機的工具, docker-machine create創建的「machine」包含了Daemon和REST API這2部分,Machine自己包含CLI。

我大概演示一下使用Machine的方法:

  • 創建machine。?docker-machine create--driver virtualboxdefault,這就會可以創建一個叫做?default的「機器」,它是Virtualbox類型的,所以可以在Virtualbox管理器里面看到這個虛擬機。

  • 連接到machine。?eval"$(docker-machine env default)",其實就是做了對應的環境變量設置

  • 使用Docker CLI。之后就可以使用?docker ps等命令查看和管理這個主機里面的鏡像/容器等內容了

Swarm Mode

Docker Swarm是Docker 官方的集群管理和編排工具,可以將多個Docker主機封裝為單個大型的虛擬Docker主機,成為一個容器平臺。從 Docker1.12.0+開始 SwarmMode已經內嵌入 Docker Engine,成為子命令 docker swarm可以直接使用。

SwarmMode主要特性如下:

  • 具有容錯能力的去中心化設計

  • 服務發現。可以做到Docker集群中節點的動態加入和退出的感知,支持主流的etcd、consul和zookeeper。

  • 負載均衡。讓資源分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載。

  • 動態伸縮。服務在判斷監測指標超出所設定的上下限時,會按照你的設置觸發擴容或縮容。

  • 滾動更新(Rolling updates)。可以實現「零停機時間部署」,下節我們還會再說。

  • 安全傳輸。集群中的每個節點都執行TLS的相互認證和加密,以確保自己與所有其他節點之間的通信安全。

  • 確保期望狀態。Swarm會在后臺進行輪訓檢查,確保實際狀態能夠滿足期望狀態的要求。

Swarm 是使用SwarmKit構建的 Docker 引擎內置(原生)的集群管理和編排工具。它包含如下三個重要概念: 節點、服務和任務,我們挨個看。

節點(Node)

運行 Docker 的主機可以主動初始化一個 Swarm 集群或者加入一個已存在的 Swarm 集群,這樣這個運行 Docker 的主機就成為一個 Swarm 集群的節點。節點分為管理 (manager) 節點和工作 (worker) 節點。

管理節點用于 Swarm 集群的管理,管理節點分發工作單元(稱為Task「任務」)到工作節點。docker swarm 命令基本只能在管理節點執行(節點退出集群命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為領導(leader, 通過Raft協議實現)。管理節點還要通過leader執行維護集群所需狀態所需的編排和集群管理任務。

工作節點接收并執行從管理節點分派的任務。默認情況下,管理器節點也作為工作節點運行服務(Service),但是你可以將它們配置為專門運行管理器任務,并且只運行管理器節點。代理在每個工作節點上運行,并報告分配給它的任務。工作節點通知管理節點其分配任務的當前狀態,以便管理器可以維護每個工作的所需狀態。

c76a5d03e10efea2e644655b6e23858f.png

任務(Task)

任務是Swarm中的最小的調度單位,任務攜帶Docker容器和在容器中運行的命令。管理節點根據服務中設置的副本(Replicas)數量將任務分配給工作節點。一旦任務被分配給一個節點,它就不能移動到另一個節點。它只能在指定的節點上運行或失敗

任務是這么調度的:

14c89d9023c7576f25f4742eb18774b0.png

服務(Service)

服務是指一組任務的集合,它定義了任務的屬性,是Swarm系統的中心結構:

e708250ab508fab1befa6cacd5268982.png

服務有兩種模式:

  • Replicated services。按照一定規則在各個工作節點上運行指定個數的任務

  • Global services。每個可用節點上運行一個任務

5225c0d1f4edf87a0f0a30979b3f6dc2.png

PS: 兩種模式通過 docker service create--mode參數指定。

基本用法

我們創建一個最小的 Swarm 集群,包含一個管理節點和兩個工作節點。創建Docker 主機使用Docker Machine:

# 管理節點

? docker-machine create -d virtualbox manager # 創建管理節點,名字為manager

? docker-machine ssh manager # 登錄到管理節點

docker@manager:~$ /sbin/ifconfig eth1 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

192.168.99.104 # 獲得IP

docker@manager:~$ docker swarm init --advertise-addr 192.168.99.104 # 在管理節點初始化一個Swarm集群,另外Docker主機有多個網卡,所以有多個IP,必須使用 --advertise-addr 指定IP

Swarm initialized: current node (k8cdrnrylrkxpsk4qoyybwpca) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377 # 記住這句命令

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

? docker-machine create -d virtualbox worker1 # 創建工作節點,名字worker1

? docker-machine ssh worker1

docker@worker1:~$ docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377 # 從上面直接粘貼來

This node joined a swarm as a worker.

? docker-machine create -d virtualbox worker2 # 創建工作節點,名字worker2

? docker-machine ssh worker2

docker@worker2:~$ docker swarm join --token SWMTKN-1-2gfzia6yrk172e8352jxpolevjr9gx1a9xu95hg0ibkhqat52p-d6j79273adew38s5mzmewgwoo 192.168.99.104:2377

This node joined a swarm as a worker.

這樣集群就做好了,在管理節點看一下狀態:

? docker-machine ssh manager

docker@manager:~$ docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

k8cdrnrylrkxpsk4qoyybwpca * manager Ready Active Leader 18.09.9

puzrum9ixbt6holgfk5d8aokl worker1 Ready Active 18.09.9

sqwpb00zh5fp9z2o6r7vnebbt worker2 Ready Active 18.09.9

然后部署Nginx(只能在管理節點運行):

docker@manager:~$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.17.4-alpine # 創建服務,三個副本,服務監聽在80端口

pydkv5ffwfqiv1aua1ylmwhum

overall progress: 3 out of 3 tasks

1/3: running [==================================================>]

2/3: running [==================================================>]

3/3: running [==================================================>]

verify: Service converged

docker@manager:~$ docker service ls # 查看當前Swarm集群運行的服務

ID NAME MODE REPLICAS IMAGE PORTS

pydkv5ffwfqi nginx replicated 3/3 nginx:1.17.4-alpine *:80->80/tcp

# 現在我們使用瀏覽器,輸入任意節點IP(如管理節點的192.168.99.104),都能看到nginx默認頁面

docker@manager:~$ docker service logs nginx # 查看Nginx服務的日志

... # 省略輸出

docker@manager:~$ docker service scale nginx=5 # 業務高峰期時,擴展服務運行的容器數量

nginx scaled to 5

overall progress: 5 out of 5 tasks

1/5: running [==================================================>]

2/5: running [==================================================>]

3/5: running [==================================================>]

4/5: running [==================================================>]

5/5: running [==================================================>]

verify: Service converged

docker@manager:~$ docker service ps nginx # 查看服務詳情

i6xkgnneqbbq nginx.1 nginx:1.17.4-alpine worker2 Running Running 4 minutes ago

f517ogp705ne nginx.2 nginx:1.17.4-alpine manager Running Running 5 minutes ago

... # 省略輸出

docker@manager:~$ docker service scale nginx=2 # 業務平穩期時,減少服務運行的容器數量

在Swarm集群中使用Compose文件

在第一篇中我使用 docker-compose.yml一次配置、啟動多個容器,在Swarm集群中也可以使用compose文件來配置、啟動多個服務。在上一小節中,使用 docker service create一次只能部署一個服務(Nginx),使用 docker-compose.yml可以一次啟動多個關聯的服務。還是拿lyanna項目的docker-compose.yml體驗一下,不過需要修改配置項,添加deploy(如mode和副本數等項),也要去掉一些stack不支持的項(如build、restart等):

version: '3'

services:

db:

image: mysql

environment:

MYSQL_DATABASE: 'test'

MYSQL_USER: 'root'

MYSQL_PASSWORD: ''

MYSQL_ROOT_PASSWORD: ''

MYSQL_ALLOW_EMPTY_PASSWORD: 'true'

volumes:

- my-datavolume:/var/lib/mysql

deploy:

placement:

constraints: [node.role == manager]

redis:

image: redis:alpine

deploy:

mode: replicated

replicas: 3

memcached:

image: memcached:1.5-alpine

deploy:

mode: replicated

replicas: 3

web:

image: 127.0.0.1:5000/lyanna-app

build: .

ports:

- '8000:8000'

volumes:

- .:/app

- ./local_settings.py.tmpl:/app/local_settings.py

depends_on:

- db

- redis

- memcached

environment:

PYTHONPATH: $PYTHONPATH:/usr/local/src/aiomcache:/usr/local/src/tortoise:/usr/local/src/arq:/usr/local/src

command: sh -c './setup.sh && python app.py'

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]

volumes:

my-datavolume:

其中有3個需要著重說明的點:

  • visualizer服務提供一個可視化頁面,可以從瀏覽器中很直觀的查看集群中各個服務的運行節點,一會會感受到

  • db/redis/memcached/visualizer這幾項都添加了deploy項,?mode指服務模式,?replicas指副本數,?placement可以限定滿足條件的Node,而避免在不合適的Node進行部署,這里限制db/visualizer都要在管理節點上

  • web加了image項,是一個注冊服務的API地址,下面會看到如何注冊和推送鏡像上去

接著部署:

? eval "$(docker-machine env manager)" # 本機切換到管理主機

? git clone https://github.com/dongweiming/lyanna # 下載lyanna項目源碼,如果原來已經clone了不用再做

? cd lyanna

? docker service create --name registry --publish published=5000,target=5000 registry:2 # 創建注冊服務(名字叫registry),啟動在5000端口上

? docker-compose -f docker-compose.swarm.yml build # 用Compose的方式啟動,這個過程會構建lyanna-app鏡像

? docker-compose -f docker-compose.swarm.yml push # 把lyanna-app推送給本地的注冊服務

? docker stack deploy -c docker-compose.swarm.yml lyanna # 部署服務

Ignoring unsupported options: build

Creating network lyanna_default

Creating service lyanna_web

Creating service lyanna_visualizer

Creating service lyanna_db

Creating service lyanna_redis

Creating service lyanna_memcached

現在在瀏覽器輸入 任一節點IP:8080 即可看到各節點運行狀態,類似如下效果:

3afb4c07961181b4f1456b2ee7ae6031.png

可以看到:

  • db、visualizer限定在管理節點manager

  • redis/memcached由于副本數和節點數一致,所以每個節點都有一個

  • web和registry由于負載平衡的作用分配到了2個工作節點上,讓服務整體看起來比較均衡

在瀏覽器新的標簽頁輸入 任一節點IP:8000 即可看到lyanna博客效果!

延伸閱讀

  1. https://docs.docker.com/engine/docker-overview/

  2. https://www.docker.com/products/container-runtime

  3. https://docs.docker.com/machine/

  4. https://docs.docker.com/engine/swarm/key-concepts/

  5. https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

  6. https://docs.docker.com/engine/swarm/stack-deploy/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370712.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于設備樹的TQ2440的中斷(2)

下面以按鍵中斷為例看看基于設備數的中斷的用法&#xff1a; 設備樹&#xff1a; tq2440_key {compatible "tq2440,key";interrupt-parent <&gpf>;interrupts <0 IRQ_TYPE_EDGE_FALLING>, <1 IRQ_TYPE_EDGE_FALLING>;key_3 <&gpf 2…

計算機里有個不能進入的磁盤分區,新電腦只有一個分區怎么辦? 教你們如何不進pe給硬盤創建新分區!...

很多朋友新電腦剛買回來打開發現明明自己機械硬盤1T或者1T機械加128G固態&#xff0c;但是卻只有一個或者兩個分區&#xff0c;但是又不會分區現在教大家如何不用老毛桃大白菜之類的進pe系統里面就能直接創建新分區1 WinR輸入diskmgmt.msc2進入磁盤管理可以查看本機的C盤與E盤的…

OSGi中的權限

在上一篇文章中 &#xff0c;我們介紹了為Java應用程序實現沙箱的方法&#xff0c;在其中我們可以安全地運行移動代碼 。 這篇文章探討了如何在OSGi環境中執行相同的操作。 OSGi OSGi規范 為Java定義了一個動態模塊系統 。 因此&#xff0c;它是實施那種可以使您的應用程序動…

HTTP簡單教程

目錄 HTTP簡介 HTTP工作原理 HTTP消息結構 客戶端請求消息服務器響應消息實例 HTTP請求方法HTTP響應頭信息HTTP狀態碼 HTTP狀態碼分類HTTP狀態碼列表 HTTP content-type對照表 HTTP簡介 HTTP協議是Hyper Text Transfer Protocol&#xff08;超文本傳輸協議&#xff09;的縮寫&…

Reversed-Z詳解

在3D渲染管線中&#xff0c;Z這個家伙幾乎無處不在&#xff0c;如Z-Buffer&#xff0c;Early-Z&#xff0c;Z-Cull&#xff0c;Z-Test&#xff0c;Z-Write等等&#xff0c;稍有接觸圖形學的人都會對這些術語有所耳聞。 那么Z到底是什么呢&#xff1f;首先Z當然可以是任意坐標系…

pyqt開發的程序模板_小程序定制開發和模板開發要多少錢?有什么區別?

到現在&#xff0c;小程序開發已經有了1年多的歷史&#xff0c;已經達到百萬數量級。無論是小程序商城還是小程序游戲&#xff0c;其開發方式不外乎兩種&#xff0c;一種是定制開發&#xff0c;另一種是模板開發。對于很多初次接觸小程序的客戶來說&#xff0c;還不知道小程序的…

實現字符串的編碼轉換,用以解決字符串亂碼問題

引起亂碼的情況很多~實質上 主要是字符串本身的編碼格式 與程序所需要的編碼格式不一致導致的。要解決亂碼其實很簡單&#xff0c; 分2步 &#xff1a; 1&#xff1a;獲取到字符串 本身的編碼 2&#xff1a;改變字符串編碼 &#xff08;本身編碼 -> 新編碼&#xff09; 話不…

python運行原理_Python線程池及其原理和使用(超級詳細)

系統啟動一個新線程的成本是比較高的&#xff0c;因為它涉及與操作系統的交互。在這種情形下&#xff0c;使用線程池可以很好地提升性能&#xff0c;尤其是當程序中需要創建大量生存期很短暫的線程時&#xff0c;更應該考慮使用線程池。 線程池在系統啟動時即創建大量空閑的線程…

Google Guava緩存

這篇文章是我在Google Guava上系列文章的續篇&#xff0c;這次涵蓋了Guava Cache。 與HashMap或ConcurrentHashMap相比&#xff0c;Guava Cache提供了更大的靈活性和功能&#xff0c;但不像使用EHCache或Memcached那樣繁重&#xff08;就此而言&#xff0c;它很健壯&#xff0c…

html 三列布局(兩列自適應,一列固定寬度)

不做過多解釋&#xff1a;主要是記錄一個完整的布局樣式&#xff0c;實現頁面大致三列其中左右兩列是自適應寬度&#xff0c;中間固定寬度效果。 不多少代碼奉上&#xff1a; CSS樣式代碼&#xff1a; /*********************公共標簽樣式********************//************…

jsp常用動作

jsp:include 動態包含&#xff1b; jsp:forward 轉發&#xff1b; jsp:useBean 實例化bean對象&#xff1b; jsp:setProperty 設置一個屬性值 jsp:getProperty 獲取一個屬性值 jsp:param 動態傳參數&#xff1b; jsp:plugin 生成一個插件 jsp:useBean 實例化一個對象…

單曲循環 翻譯_歌單 | 單曲循環amp;熱評

December2020/12/ 寫在前面的話 /本來打算在跨年的時候才更文&#xff0c;但是吧又覺得空出這最后一個月有點蒼白&#xff0c;然后最近一直夜半網抑云(敏感ing)就想到可以做一期分享歌單的推文&#xff0c;分享一些最近聽得頻繁的歌曲(還不是刷抖音刷出來的)。《曖昧》// 王菲徘…

python的字符串內建函數

python的字符串內建函數 字符串方法是從python1.6到2.0慢慢加進來的——它們也被加到了Jython中。 這些方法實現了string模塊的大部分方法&#xff0c;如下表所示列出了目前字符串內建支持的方法&#xff0c;所有的方法都包含了對Unicode的支持&#xff0c;有一些甚至是專門用…

休息使用Jersey –包含JAXB,異常處理和客戶端程序的完整教程

最近&#xff0c;我開始使用Jersey API開發一個Restful Web服務項目。 在線提供了一些教程&#xff0c;但是我遇到了異常處理方面的一些問題&#xff0c;而且在使用JaxB和提供異常處理方法的完整項目中找不到任何地方。 因此&#xff0c;一旦我能夠使用帶有異常處理和客戶端程序…

python基于web可視化_獨家 | 基于Python實現交互式數據可視化的工具(用于Web)

轉自&#xff1a;數據派ID&#xff1a;datapi 作者&#xff1a;Alark Joshi 翻譯&#xff1a;陳雨琳 校對&#xff1a;吳金笛 本文2200字&#xff0c;建議閱讀8分鐘。 本文將介紹實現數據可視化的軟件包。 這學期&#xff08;2018學年春季學期&#xff09;我教授了一門關于數據…

SASS簡介及使用方法

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一個擴展開發工具&#xff0c;它允許你使用變量、條件語句等&#xff0c;使開發更簡單可維護。這里是官方文檔。 二、基本語法 1&#xff09;變量 sass的變量名必須是一個$符號開頭&#xff0c;后面緊跟變量名…

【轉】Java方向如何準備BAT技術面試答案(匯總版)

原文地址&#xff1a;http://www.jianshu.com/p/1f1d3193d9e3 這個主題的內容之前分三個篇幅分享過&#xff0c;導致網絡上傳播的比較分散&#xff0c;所以本篇做了一個匯總&#xff0c;同時對部分內容及答案做了修改&#xff0c;歡迎朋友們吐槽、轉發。因為篇幅長度和時間的原…

numpy維度交換_“lazy”的transpose()函數——從numpy 數組的內存布局講起

1 數組的兩種內存布局方式行優先與列優先首先我們回顧一下&#xff0c;矩陣數據在內存中的兩種布局方式&#xff1a;行優先&#xff08;row-major&#xff09;&#xff1a;以行為優先單位&#xff0c;在內存中逐行存儲/讀取&#xff1b;對于多維&#xff0c;意味著當線性掃描內…

云耀服務器切換系統,【計算】云耀服務器-常見操作匯總指南

通過上期的介紹&#xff0c;相信大家對于云耀云服務器的基本知識有了一個了解。云耀云服務器是一個具備獨立、完整的操作系統和網絡功能&#xff0c;可快速搭建簡單應用的新一代云服務器。接下來&#xff0c;本期為大家帶來關于云耀云服務器使用中的一些簡單方法和小技巧。1.云…

機器學習應該準備哪些數學預備知識?

轉 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 機器學習應該準備哪些數學預備知識&#xff1f; 數據分析師&#xff0c;工作中經常使用機器學習模型&#xff0c;但是以調庫為主。 自己一直也在研究算法&#xff0c;也…