Docker - Docker Compose;Docker Swarm

news2024/11/27 2:42:19

一、Docker Compose

(一)Docker Compose介绍

Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。

(二)Compose安装

官网地址

Overview | Docker Documentation

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令就可以从配置中创建并启动所有服务。

Compose works in all environments: production, staging, development, testing, as well as CI workflows. It also has commands for managing the whole lifecycle of your application:

Compose可以在所有环境中工作:生产、登台、开发、测试以及CI工作流。它还有用于管理应用程序整个生命周期的命令

Start, stop, and rebuild services

View the status of running services

Stream the log output of running services

Run a one-off command on a service

启动、停止和重新构建服务

查看正在运行的业务状态

流化正在运行的业务的日志输出

对服务执行一次性命令

The key features of Compose that make it effective are:

Have multiple isolated environments on a single host

Preserves volume data when containers are created

Only recreate containers that have changed

Supports variables and moving a composition between environments

Compose有效的关键特征是:

在一台主机上有多个隔离的环境

创建容器时保存卷数据

只重新创建已更改的容器

支持变量和在环境之间移动组合

Key features and use cases | Docker Documentation

Using Compose is essentially a three-step process:

Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

Define the services that make up your app in docker-compose. yml so they can be run together in an isolated environment

Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using Compose standalone(docker-compose binary)

使用Compose基本上是一个三步过程:

1、创建对应的DockerFile文件

2、创建yml文件,在yml文件中编排我们的服务

3、通过docker-compose up命令一键运行我们的容器

docker-compose.yml

version: "3.9"  # optional since v1.27.0

services:

  web:

    build: .

    ports:

      - "8000:5000"

    volumes:

      - .:/code

      - logvolume01:/var/log

    depends_on:

      - redis

  redis:

    image: redis

volumes:

  logvolume01: {}

安装

Install the Compose plugin | Docker Documentation

sudo cur1 -l "https://github.com/docker /compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/loca1/bin/docker-compose

速度比较慢的话使用下面的地址:

cur1 -l https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s'- ^uname -m`/usr/loca1/bin/docker-compose

修改文件夹权限

chmod +x /usr/loca1/bin/ docker-compose

建立软连接

1n -s /usr/1oca1/bin/docker-compose /usr/bin/docker-compose

校验是否安装成功

docker compose version

(三)Compose初体验

Try Docker Compose | Docker Documentation

Step 1: Define the application dependencies

1、Create a directory for the project

mkdir composetest

cd composetest

2、Create a file called app.py in your project directory and paste the following code in

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)

3、Create another file called requirements.txt in your project directory and paste the following code in

flask

redis

Step 2: Create a Dockerfile

# 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"]

Step 3: Define services in a Compose file

Create a file called docker-compose.yml(核心文件) in your project directory and paste the following

version: "3.9"

services:

  web:

    build: .

    ports:

      - "8000:5000"

  redis:

    image: "redis:alpine"

Step 4: Build and run your app with Compose

1From your project directory, start up your application by running docker compose up

docker compose up

Creating network "composetest_default" with the default driver

Creating composetest_web_1 ...

Creating composetest_redis_1 ...

Creating composetest_web_1

Creating composetest_redis_1 ... done

Attaching to composetest_web_1, composetest_redis_1

web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

redis_1  | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

redis_1  | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started

redis_1  | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

web_1    |  * Restarting with stat

redis_1  | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.

redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

web_1    |  * Debugger is active!

redis_1  | 1:M 17 Aug 22:11:10.483 # Server initialized

redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

web_1    |  * Debugger PIN: 330-787-903

redis_1  | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

2、Enter http://localhost:8000/ in a browser to see the application running

3Refresh the page

4、Switch to another terminal window, and type docker image ls to list local images

docker image ls

REPOSITORY        TAG           IMAGE ID      CREATED        SIZE

composetest_web   latest        e2c21aa48cc1  4 minutes ago  93.8MB

python            3.4-alpine    84e6077c7ab6  7 days ago     82.5MB

redis             alpine        9d8fa9aa0e5b  3 weeks ago    27.5MB

Step 5: Edit the Compose file to add a bind mount

version: "3.9"

services:

  web:

    build: .

    ports:

      - "8000:5000"

    volumes:

      - .:/code

    environment:

      FLASK_DEBUG: True

  redis:

    image: "redis:alpine"

Step 6: Re-build and run the app with Compose

docker compose up     #启动服务
docker compose down  或者 Ctrl+C   #退出服务

Step 7: Update the application

Step 8: Experiment with some other commands

docker compose up -d

Starting composetest_redis_1...

Starting composetest_web_1...

docker compose ps

       Name                      Command               State           Ports        

-------------------------------------------------------------------------------------

composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp             

composetest_web_1     flask run                        Up      0.0.0.0:8000->5000/tcp

docker compose run web env
docker compose stop
docker compose down --volumes

(四)Compose配置规则

Compose specification | Docker Documentation

Compose file version 3 reference | Docker Documentation

# 版本

version:’’

# 服务  

services:

   服务1:

      # 服务配置

      build

      network

      images

   服务2:

服务3:

……

# 其它配置;如 网络,全局规则,数据卷等

# 数据卷

volumes:

# 全局规则

configs:

# 网络

networks:

(五)Compose部署实战

Sample apps with Compose | Docker Documentation

awesome-compose/README.md at master · docker/awesome-compose · GitHub

一键部署WordPress博客系统

1、Create an empty project directory  创建my_wordpress目录

mkdir my_wordpress

2、Change into your project directory

cd my_wordpress/

3、Create a docker-compose.yml file that starts your WordPress blog and a separate MySQL instance with volume mounts for data persistence

services:

  db:

    # We use a mariadb image which supports both amd64 & arm64 architecture

    image: mariadb:10.6.4-focal

    # If you really want to use MySQL, uncomment the following line

    #image: mysql:8.0.27

    command: '--default-authentication-plugin=mysql_native_password'

    volumes:

      - db_data:/var/lib/mysql

    restart: always

    environment:

      - MYSQL_ROOT_PASSWORD=somewordpress

      - MYSQL_DATABASE=wordpress

      - MYSQL_USER=wordpress

      - MYSQL_PASSWORD=wordpress

    expose:

      - 3306

      - 33060

  wordpress:

    image: wordpress:latest

    volumes:

      - wp_data:/var/www/html

    ports:

      - 80:80

    restart: always

    environment:

      - WORDPRESS_DB_HOST=db

      - WORDPRESS_DB_USER=wordpress

      - WORDPRESS_DB_PASSWORD=wordpress

      - WORDPRESS_DB_NAME=wordpress

volumes:

  db_data:

  wp_data:

4、后台运行

docker compose up -d

5、查看运行效果

http://localhost:80

二、Docker Swarm

Swarm mode overview | Docker Documentation

docker swarm | Docker Documentation

Docker Swarm是Docker公司推出的用来管理Docker集群的平台,Swarm是容器集群管理工具,可以统一管理分布在不同主机的多个容器,相比起Kubenetes,Docker Swarm无需额外安装

Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的

Docker Swarm代码开源地址

mirrors / docker / swarm · GitCode

Docker Swarm将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker

简单理解就是多台服务器搭建一个Docker集群,每个服务器就是集群中的一个节点

Docker Swarm 和 Docker Compose

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方管理跨节点容器的编排工具

但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。如果下载的是最新版的Docker,那么Swarm就已经被包含在内了,无需再安装

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息

Docker Swarm架构包含两种角色,manager和node,前者是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求,然后调度Node进行具体的容器工作,比如容器的创建、扩容与销毁等。 manager本身也是一个node

从上图可以看出,Docker Client使用Swarm对 集群(Cluster)进行调度使用

Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持

通常情况下,为了集群的高可用,manager个数>=3的奇数,node的个数则是不限制

可参考

DockerSwarm - DockerSwarm_MinggeQingchun的博客-CSDN博客

Docker Swarm关键概念

1、Swarm

集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

2、Node

一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。

要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。

Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。

工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态

3、Service

一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。

4、Task

任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

----------------------------使用方法--------------------------------

docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)

docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)

docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, lsrm。(docker node --help查看帮助)

node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:

manager nodes,也就是管理节点

worker nodes,也就是工作节点

1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。

2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。

3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。

service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。

4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务 

1、docker swarm init ; 创建manager节点

docker swarm init | Docker Documentation

$docker swarm init --advertise-addr 192.168.99.121

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

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

    docker swarm join \

    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \

    172.17.0.2:2377

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

2、docker swarm join ; 创建work节点

docker swarm join | Docker Documentation

$docker swarm join [OPTIONS] HOST:PORT

$docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.121:2377

This node joined a swarm as a manager.

$docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS

dkp8vy1dq1kxleu9g4u78tlag *  manager2  Ready   Active        Reachable

dvfxp4zseq4s0rih1selh0d20    manager1  Ready   Active        Leader

3、docker service create ; 创建服务

$ docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

$ docker service create --name redis redis:3.0.6

dmu1ept4cxcfe8k8lhtux3ro3

$ docker service create --mode global --name redis2 redis:3.0.6

a8q9dasaafudfs8q8w32udass

$ docker service ls

ID            NAME    MODE        REPLICAS  IMAGE

dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6

a8q9dasaafud  redis2  global      1/1       redis:3.0.6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化组件使用小技巧——中国地图组件的应用

中国地图作为我们数据展示常用的组件,通常被我们用来展示与地理位置相关的数据,中国地图组件在实际应用中可以帮助我们充当地区数据展示的作用,并让我们一眼看出区域之前的差异趋势。接下来结合实际案例让我们看看在山海鲸可视化软件中如何具…

你知道几种乘法的计算方式?

前言 家里有本《算法详解》一直没有看,昨天晚上打开翻了翻,觉得写的挺有趣的,第一章讨论了一个大家都学过的内容,乘法的计算。大部分人计算乘法,应该都只有一种方式,乘法的计算,也算是一种算法…

记录--微信小程序跳转H5、小程序、App

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在业务中接触了微信小程序,客户对引流用户非常在意,每次都会提该需求,经常做就存档一下。使用的小程序账户都是企业版非个人版本。 跳转H5 在微信公众平台-小程序后…

axios:基本使用、常用配置项、create方法、请求和响应拦截器、取消请求

axios的使用一、发送ajax请求1.axios函数发送通用请求2.精简版GET请求3.精简版POST请求二、配置通用属性(create方法)三、请求和响应拦截器1.请求拦截器2.响应拦截器四、取消请求五、axios源码解析官网:https://github.com/axios/axios 一、…

GitHub桌面版和汉化包,使用详细(GitHub Desktop安装,github软件汉化包详细使用过程)

github大家都比较熟悉,而它的桌面版使用则更加方便(GitHub桌面版就是GitHub Desktop,它们的数据都是相通的),但是软件是英文版本,使用起来不太方便,这里为大家提供了该软件和汉化包,…

记一次靶场实战【网络安全】

前言 【一一帮助安全学习一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 ⑥网络安全必备书籍 ⑦100个漏洞实战案例 ⑧安全大厂内部视频资源 ⑨历年CTF夺旗赛题解析 一、信息收集 先用nmap扫一下ip。 锁定…

多元线性回归分析

回归分析:研究X和Y之间相关性的分析回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成…

gumbel-softmax的使用、课程学习的使用、有监督的对比学习的使用、无监督的对比学习的使用

一、gumbel-softmax的使用 gumbel-softmax里面的 τ\tauτ值越接近无穷获得的向量越接近一个均匀分布的向量;τ\tauτ值越接近0获得的向量越接近一个one-hard vector;τ\tauτ值越接近1则gumbel-softmax就和softmax越类似 # score:代表序列…

Ubuntu服务器使用NTP功能同步时间

前提: 1. 要明确自己的需求,是设计一个NTP服务器,然后给内网的其他用户提供NTP服务? 2. 还是发现自己Ubuntu系统时间错误,想要同步一个时间进来? 如果是2,继续往下看吧,如果是1&am…

2021年一篇强人工智能论文,基于AGI Brain改进的二代版本

AGI Brain II: The Upgraded Version with Increased Versatility Index返回论文和资料目录 1.论文简介 论文基于19年提出的第一代AGI Brain I 改进。主要有两点改进,1.提出一个AGI指标,2.用Mamdani模糊推理联想记忆代替原本的神经网络NN表示外显记忆&…

字节跳动最爱考的前端面试题:计算机网络基础

注意:每道题前面出现的 (xx) 数字代表这道题出现的频次,此 计算机网络 基础是基于 30 篇前端面经整理出的问题和对应的回答、参考链接等。文章内容为拿到 Offer 的本人整理。 (3)问:HTTP 缓存 HTTP 缓存又分为强缓存和…

ArcGIS基础实验操作100例--实验55栅格与ASCII转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验55 栅格与ASCII转换 目录 一、实验背景 二、实验数据 三、实验步骤 (1&a…

nodejs+vue+element+eachers构建开源项目大型连续剧(3)建立前端基础项目(暂时用的vue2框架)

书接上回,在第二集我们成功安装了mysql数据库,并通过nodejs服务器关联到数据库,并成功更改了数据库中的数据。这一集呢,主要是进行一个前端vue2项目的构建,后面如果大家想要看vue3的话可以后续更新,毕竟现在…

计算机原理二_操作系统概述

目录儿三、操作系统概述3.1 操作系统的基本概念3.1.1 操作系统的概念3.1.2 操作系统的目标和功能3.1.2.1 目标3.1.2.2 功能3.1.3 操作系统的特征3.2 操作系统的发展与分类3.2.1 分类3.3 操作系统的运行环境3.3.1 操作系统的运行机制3.3.1.1 用户态、核心态3.3.1.2 时钟与中断3.…

SLAM初探

SLAM初探 1.视觉SLAM框架 整个视觉SLAM包括以下流程 传感器信息读取,主要是相机图像信息的读取和处理前端视觉里程计,它的任务是估算相邻图像之间相机的运动和局部的地图后端优化,接受不同时刻视觉里程计输出的相机位姿以及回环检测的信息&…

【C++高阶数据结构】LRU

​ 🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏…

LeetCode刷题复盘笔记—一文搞懂动态规划之583. 两个字符串的删除操作问题(动态规划系列第四十篇)

今日主要总结一下动态规划的一道题目,583. 两个字符串的删除操作 题目:583. 两个字符串的删除操作 Leetcode题目地址 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意…

ArcGIS基础实验操作100例--实验56 TIFF与GRID栅格转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验56 TIFF与GRID栅格转换 目录 一、实验背景 二、实验数据 三、实验步骤 (…

orika 工具下划线转驼峰不同字段名映射

1.问题: 业务需要把第三方接口的带下划线的字段规范为驼峰的字段 第三方接口的bean对象: public class ObjectsDetail extends XMLElementData implements Serializable {private static final long serialVersionUID 5080447582610246168L;private String objectclass;priv…

用300行Python代码实现一个人脸识别系统源码,基于dlib

用300行Python代码实现一个人脸识别系统 完整代码下载地址:用300行Python代码实现一个人脸识别系统源码,基于dlib 今天我们来python实现一个人脸识别系统,主要是借助了dlib这个库,相当于我们直接调用现成的库来进行人脸识别&…