Docker學習筆記05---Docker Compose、Docker Swarm分布式部署


Docker學習筆記05---Docker Compose、Docker Swarm分布式部署

Docker Compose

簡介

之間的DockerFile部署模式 DockerFile build run 手動操作,單個容器!

如果是一個微服務,上百個微服務怎么辦,這個時候就用到 Docker Compose 來輕松高效的管理容器,自定義運行多個容器!

image

三個步驟:

  1. Dockerfile保證我們的項目在任何地方運行。
  2. services 是什么服務
  3. docker-compose.yml
  4. 啟動項目

自己的理解:

Compose是Docker官方開源的項目,需要安裝!

Compose

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose up 100個服務

Compose:重要的概念

  1. 服務service,容器,應用(web,redis,mysql。。)
  2. 項目project,一組關聯的容器。博客,web,mysql,wp等

安裝

image

1、下載

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 推薦使用下面的連接,較快
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

image

2、對二進制文件應用可執行權限

賦權:sudo chmod +x /usr/local/bin/docker-compose

執行:docker-compose version

image

pip的安裝

pip install docker-compose

體驗

python應用,做一個計數器,使用redis工具;

  1. 應用 app.py
  2. Dockerfile 文件應用打包為鏡像
  3. Docker-compose yml 文件(定義整個服務,需要的環境,web,redis)完整的上線服務!
  4. 啟動compose項目(docker-compose up)

流程:

  1. 創建網絡
  2. 執行docker-compose yml
  3. 啟動服務

docker-compose yml

1、創建文件夾

[root@localhost /]# cd home/
[root@localhost home]# ls
ccq
[root@localhost home]# mkdir composetest
[root@localhost home]# cd composetest/
[root@localhost composetest]# ls

2、創建一個app.py文件

[root@localhost composetest]# vim app.py
[root@localhost composetest]# ls
app.py
# app.py
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host=0.0.0.0,debug=True)

3、創建requirements.txt

[root@localhost composetest]# vim requirements.txt
[root@localhost composetest]# ls
app.py  requirements.txt

#requirements.txt
flask
redis

4、創建Dockerfile

[root@localhost composetest]# vim Dockerfile
[root@localhost composetest]# ls
app.py  Dockerfile  requirements.txt
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
#RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

#Dockerfile

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

5、創建docker-compose.yml

[root@localhost composetest]# vim docker-compose.yml
[root@localhost composetest]# ll
總用量 16
-rw-r--r--. 1 root root 569 8月  17 15:31 app.py
-rw-r--r--. 1 root root 135 8月  17 15:40 docker-compose.yml
-rw-r--r--. 1 root root 252 8月  17 15:38 Dockerfile
-rw-r--r--. 1 root root  12 8月  17 15:34 requirements.txt

#docker-compose.yml

version: "3.8"
services:
  web:
    build: .
    ports:
      - 5000:5000
    volumes:
      - .:/code
  redis:
    image: "redis:alpine"
    
#docker-compose.yml
version: "3.3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
    
    

6、執行docker-compose up

[root@localhost composetest]# docker-compose up
Creating network "composetest_default" with the default driver
Building web
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
29291e31a76a: Pull complete
3626a090061d: Pull complete

image

默認的服務名 命名規則為 文件名_服務器__num

多個服務器,集群,A B _num 副本數量

服務器redis 服務=>4個副本

集群狀態, 服務都不可能只有一個運行實例,彈性 10 HA 高並發

kubectl service 負載均衡。

3、網絡規則

10個服務==>項目(項目中的內容都在同一個網絡下,域名訪問)

如果在同一個網絡下、我們可以直接通過域名訪問!

停止:docker-compose down CTRL+C

小結

docker-compose

以前都是單個 docker run容器

docker-compose,通過 docker-compose編寫yml配置文件、可以通過compose 一鍵啟動所有的容器,停止!

​ docker小結

  1. Dockers鏡像 run===>容器
  2. DockerFile構建鏡像(服務打包)
  3. docker-compose 啟動項目(編排,多個微服務/環境)
  4. Docker網絡!

yml規則

docker-compose.yml是核心

# 一共有三層

version: '' # 版本
server: # 版本
	服務1:web
	#  服務配置
        images
        build
        network
        .....
	服務2:redis
	....
	服務3:redis
# 其他配置 網絡/卷、全局規則
Volumes:
network:
configs:

開源項目測試:

搭建博客:

​ 下載程序、安裝數據庫、配置。。。。

​ compose應用===> 一鍵啟動

1、下載項目(docker-compose.yml)

2、如果需要文件按、Dockerfile

3、文件准備齊全(直接一鍵啟動項目!)

​ 前台啟動

docker -d

后台啟動

docker-compose up -d

image

image

實戰

1、編寫項目微服務

2、dockerfile構建鏡像

3、docker-compose.yml編排項目

4、丟到服務器 docker-compose up

# 1、創建一個空的項目目錄。
[root@localhost home]# mkdir my_wordpress/
# 2、切換到您的項目目錄。
[root@localhost home]# cd my_wordpress/
# 3、創建一個docker-compose.yml文件來啟動您的 WordPress博客和一個單獨的MySQL實例,該實例具有用於數據持久性的卷掛載 
[root@localhost my_wordpress]# vim docker-compose.yml
version: "3.3"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
# 4、構建項目
#現在,docker-compose up -d從您的項目目錄運行。
#這docker-compose up在分離模式下運行,拉取所需的 Docker 鏡像,並啟動 wordpress 和數據庫容器,如下面的示例所示。
[root@localhost my_wordpress]# docker-compose up -d
# 5、docker-machine ip MACHINE_VM獲取機器地址,然后http://MACHINE_VM_IP:8000在 Web 瀏覽器中打開 .


測試啟動

docker-compose up
docker-compose build

小結:

未來項目只要有 docker-compose文件,按照這個規則,啟動編排容器!

公司:docker-compose 直接啟動

網上的開源項目 :docker-compose 一鍵啟動

假設項目需要重新部署打包

docker-compose up --build # 重新構建

小結

​工程、服務、容器

​項目 compose:三層

  1. 工程Porject
  2. 服務 服務
  3. 容器 運行實例! docker k8s 容器

Docker Swarm

購買服務器

集群 至少3台

購買4台服務器 2G

1、點擊控制台

image

2、選擇雲服務器

image

image

3、創建實例

image

5、購買集群

image

image

6、網絡安全組

image

7、系統配置

image

8、分組設置、確認訂單

image

image

9、查看實例

image

用4台機器安裝docker

image

image

工作模式

操作都在manager

image

swarm搭建集群

image

image

初始化節點 docker swarm init

image

私網、公網

172.24.82.149

image

docker swarm join

docker swarm join

# 獲取令牌
docker swarm join-token manager
docker swarm join-token worker

生成的令牌在任何一個manager上就可以了

1、生成主節點init

2、加入(管理者、worker)

目標:雙主從節點!(一般至少三個主節點)

1、生成主節點

image

2、加入管理節點和工作節點

# 創建工作節點
docker swarm join-token worker

image

image

# 創建管理節點
docker swarm join-token manager

image

image

3、查看節點內容

image

Raft協議

雙主雙從:假設一個節點掛了!其他節點是否可以使用!

Raft協議:保證大多數節點存活才可以使用。只要>1,集群至少大於3台

實驗:

1、將docker1機器停止,宕機!雙主,另外一台主節點也不可以使用!

2、可以將其他節點離開

3、wrok就是工作的、管理節點的操作! 3台機器設置為管理節點。

十分簡單:集群,可用!3個主節點。大於1台管理節點存活!

Raft協議:保證大多數節點存活,才可以使用,高可用!

# 重啟集群,自己的身份會改變
docker node ls

離開集群

image

生成令牌再次加入

image

體會

命令只能在manager上執行

彈性、擴縮容!集群

以后告別 docker run !

docker-compose up! 啟動一個項目 單機

集群:swarm docker serivce

容器=>服務

容器=>服務=>副本

redis服務=>10個副本(同時開啟10個redis容器)

體驗:創建服務、動態擴展服務、動態更新服務

image

灰度發布:金絲雀發布

image

docker run 容器啟動!不具有擴縮容器
docker service 服務 具有擴縮容器 滾動更新!

查看服務 REPLICAS

1、啟動創建項目

docker service create -p 8888:80 --name my-nginx nginx
# docker service 服務 具有擴縮容器 滾動更新!

image

2、查看是否啟動成功

docker service ps my-nginx
docker service ls

image

3、查看網絡信息

docker service inspect my-nginx

image

4、隨機分布在集群上,動態擴縮容,創建多個副本

docker service update --replicas 3 my-nginx
# 服務,集群中任意一個節點都可以訪問。服務可用有多個副本動態擴縮容實現高可用!

image

# 動態括縮容
docker service scale my-nginx

image

5、移除服務

image

雖然是在docker-1機器上創建的,但1、2、4上都沒有這個docker進程

跑到了3上,docker-3也是manager節點

動態更新nginx成3個副本,1上沒有,2、3、4都有nginx。但用1的ip訪問也能訪問到nginx

如果開10個時,四個節點上分別跑3、3、2、2個nginx容器。
同樣的命令也可以再設置成只有1個副本

服務,集群中任意一個節點都可以訪問。服務可用有多個副本動態擴縮容實現高可用!

彈性、擴縮容!

10台!10000台!虛擬化

服務的高可用,任何企業,雲

k8s!雲原生應用

相對而言:docker swarm 其實並不難

只要會搭建集群、會啟動服務、動態管理容器就可以了

k8s更難、功能更多。swarm相當於簡單版的k8s

概括總結

swarm

集群的管理和編號。docker可以初始化一個swarm集群,其他節點可以加入。(管理、工作者)

Node

就是一個docker節點。多個節點就組成了一個網絡集群。(管理、工作者)

Service

任務,可以在管理節點或者工作節點來運行。核心!用戶訪問!

Task

容器內的命令,細節任務!

image

Service

image

命令--管理--api--調度--工作節點--(創建Task容器維護創建)

kubectl get pod

kubectl service api

服務副本於全局服務

image

調整service以什么方式運行

--mode string
Service mode (replicated or global)(default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默認的

docker service create --mode global --name haha alpine ping baidu.com

# 場景? 日志收集
每一個節點都有自己的日志收集器,過濾,把所有的日志最終再傳給日志中心
服務監控 狀態性能

拓展:網絡模式:’PublishMode“:”ingress“

Swarm

Overlay

ingress:特殊的Overlay網絡!負載均衡的功能!IPVS VIP

雖然docker在4台機器上,實際網絡是同一個! ingress網絡,是一個特殊的Overlay網絡

Overlay可使多個相互;ping不同的機器聯通並變成一個整體

Docker Stack

docker-compose 單機部署項目
Docker Stack 部署,集群部署

# 單機
docker-compose up -d wordpress.yml
# 集群
docker stack deploy wordpress-yml
# docker-compose 文件

Dockers Secret

安全!配置密碼! 證書!

k8s中也有這個概念,學k8s的時候再說

Docker Config

拓展到K8s

雲原生時代

Go語言!

超過10台用k8s不用swarm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM