Docker學習筆記05---Docker Compose、Docker Swarm分布式部署
Docker Compose
簡介
之間的DockerFile部署模式 DockerFile build run 手動操作,單個容器!
如果是一個微服務,上百個微服務怎么辦,這個時候就用到 Docker Compose 來輕松高效的管理容器,自定義運行多個容器!
三個步驟:
- Dockerfile保證我們的項目在任何地方運行。
- services 是什么服務
- docker-compose.yml
- 啟動項目
自己的理解:
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:重要的概念
- 服務service,容器,應用(web,redis,mysql。。)
- 項目project,一組關聯的容器。博客,web,mysql,wp等
安裝
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
2、對二進制文件應用可執行權限
賦權:sudo chmod +x /usr/local/bin/docker-compose
執行:docker-compose version
pip的安裝
pip install docker-compose
體驗
python應用,做一個計數器,使用redis工具;
- 應用 app.py
- Dockerfile 文件應用打包為鏡像
- Docker-compose yml 文件(定義整個服務,需要的環境,web,redis)完整的上線服務!
- 啟動compose項目(docker-compose up)
流程:
- 創建網絡
- 執行docker-compose yml
- 啟動服務
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
默認的服務名 命名規則為 文件名_服務器__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小結
- Dockers鏡像 run===>容器
- DockerFile構建鏡像(服務打包)
- docker-compose 啟動項目(編排,多個微服務/環境)
- 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
實戰
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:三層
- 工程Porject
- 服務 服務
- 容器 運行實例! docker k8s 容器
Docker Swarm
購買服務器
集群 至少3台
購買4台服務器 2G
1、點擊控制台
2、選擇雲服務器
3、創建實例
5、購買集群
6、網絡安全組
7、系統配置
8、分組設置、確認訂單
9、查看實例
用4台機器安裝docker
工作模式
操作都在manager
swarm搭建集群
初始化節點 docker swarm init
私網、公網
172.24.82.149
docker swarm join
docker swarm join
# 獲取令牌
docker swarm join-token manager
docker swarm join-token worker
生成的令牌在任何一個manager上就可以了
1、生成主節點init
2、加入(管理者、worker)
目標:雙主從節點!(一般至少三個主節點)
1、生成主節點
2、加入管理節點和工作節點
# 創建工作節點
docker swarm join-token worker
# 創建管理節點
docker swarm join-token manager
3、查看節點內容
Raft協議
雙主雙從:假設一個節點掛了!其他節點是否可以使用!
Raft協議:保證大多數節點存活才可以使用。只要>1,集群至少大於3台
實驗:
1、將docker1機器停止,宕機!雙主,另外一台主節點也不可以使用!
2、可以將其他節點離開
3、wrok就是工作的、管理節點的操作! 3台機器設置為管理節點。
十分簡單:集群,可用!3個主節點。大於1台管理節點存活!
Raft協議:保證大多數節點存活,才可以使用,高可用!
# 重啟集群,自己的身份會改變
docker node ls
離開集群
生成令牌再次加入
體會
命令只能在manager上執行
彈性、擴縮容!集群
以后告別 docker run !
docker-compose up! 啟動一個項目 單機
集群:swarm docker serivce
容器=>服務
容器=>服務=>副本
redis服務=>10個副本(同時開啟10個redis容器)
體驗:創建服務、動態擴展服務、動態更新服務
灰度發布:金絲雀發布
docker run 容器啟動!不具有擴縮容器
docker service 服務 具有擴縮容器 滾動更新!
查看服務 REPLICAS
1、啟動創建項目
docker service create -p 8888:80 --name my-nginx nginx
# docker service 服務 具有擴縮容器 滾動更新!
2、查看是否啟動成功
docker service ps my-nginx
docker service ls
3、查看網絡信息
docker service inspect my-nginx
4、隨機分布在集群上,動態擴縮容,創建多個副本
docker service update --replicas 3 my-nginx
# 服務,集群中任意一個節點都可以訪問。服務可用有多個副本動態擴縮容實現高可用!
# 動態括縮容
docker service scale my-nginx
5、移除服務
雖然是在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
容器內的命令,細節任務!
Service
命令--管理--api--調度--工作節點--(創建Task容器維護創建)
kubectl get pod
kubectl service api
服務副本於全局服務
調整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