Docker Compose、Swarm、Stack、Secret、Config

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker Compose、Swarm、Stack、Secret、Config

一、Docker Compose

1、概述(为什么使用docker compose)

  • 对于单个容器可以通过DockerFile然后 build、run 手动操作;对于成百上千个依赖关系的微服务。 Docker Compose 来轻松定义和运行多个容器即高效的管理容器
  • compose是docker官网开源的项目 需要安装
  • docker compose通过编写一个docker-compose.yml配置文件,如下

version: '2.0'

services:

web:

build: .

ports:

- "5000:5000"

volumes:

- .:/code

- logvolume01:/var/log

links:

- redis

redis:

image: redis

volumes:

logvolume01: {}

地址

Overview of Docker Compose | Docker Documentation

2、安装

官网给的安装地址

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

查看

[root@izj6c22bffydfp7tlrbx7fz ~]# cd /usr/local/bin/

[root@izj6c22bffydfp7tlrbx7fz bin]# ll

总用量 4

-rw-r--r-- 1 root root 0 7月  20 08:09 docker-compose

-rw-r--r-- 1 root root 9 7月  20 08:12 docker-composer


授权和版本查看

[root@izj6c22bffydfp7tlrbx7fz bin]# sudo chmod +x /usr/local/bin/docker-compose

[root@izj6c22bffydfp7tlrbx7fz bin]# docker-compose version

docker-compose version 1.25.5, build 8a1c60f6

docker-py version: 4.1.0

CPython version: 3.7.5

OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

[root@izj6c22bffydfp7tlrbx7fz bin]#

3、体验(官网案例:python计数器应用)

创建文件夹 ,这里在/home目录下

mkdir composetest

cd composetest

创建文件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)

创建requirements.txt文件

flask

redis

创建 Dockerfile

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


创建docker-compose.yml文件

version: "2.3"

services:

 web:

   build: .

   ports:

     - "5000:5000"

 redis:

   image: "redis:alpine"

启动

docker-compose up


docker-compose up

Starting composetest_web_1   ... done

Starting composetest_redis_1 ... done

Attaching to composetest_web_1, composetest_redis_1

redis_1  | 1:C 20 Jul 2021 00:46:17.761 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

redis_1  | 1:C 20 Jul 2021 00:46:17.761 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started

redis_1  | 1:C 20 Jul 2021 00:46:17.761 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

redis_1  | 1:M 20 Jul 2021 00:46:17.761 * monotonic clock: POSIX clock_gettime

redis_1  | 1:M 20 Jul 2021 00:46:17.761 * Running mode=standalone, port=6379.

redis_1  | 1:M 20 Jul 2021 00:46:17.762 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

redis_1  | 1:M 20 Jul 2021 00:46:17.762 # Server initialized

redis_1  | 1:M 20 Jul 2021 00:46:17.762 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysct

查看服务以及测试

[root@izj6c22bffydfp7tlrbx7fz ~]# docker ps

CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES

5992a0716736   composetest_web   "flask run"              9 minutes ago   Up 7 minutes   0.0.0.0:5000->5000/tcp   composetest_web_1

885b416a1232   redis:alpine      "docker-entrypoint.s…"   9 minutes ago   Up 7 minutes   6379/tcp                 composetest_redis_1

[root@izj6c22bffydfp7tlrbx7fz ~]# curl  http://172.18.0.2:5000/

Hello World! I have been seen 5 times.

[root@izj6c22bffydfp7tlrbx7fz ~]# curl  http://172.18.0.2:5000/

Hello World! I have been seen 6 times.

[root@izj6c22bffydfp7tlrbx7fz ~]# curl  http://172.18.0.2:5000/

Hello World! I have been seen 7 times.

[root@izj6c22bffydfp7tlrbx7fz ~]#

停止

docker-compose down ctrl+c

注意

服务命名规则

默认的服务名 文件名_服务名_num,多个服务器集群方案 ,_num副本数量

CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES

5992a0716736   composetest_web   "flask run"              9 minutes ago   Up 7 minutes   0.0.0.0:5000->5000/tcp   composetest_web_1

885b416a1232   redis:alpine      "docker-entrypoint.s…"   9 minutes ago   Up 7 minutes   6379/tcp                 composetest_redis_1

网络规则

docker network ls

可以看到 有个compsetest_default网络

默认项目中的内容都在同一个网络中 所以可以通过域名访问

后台启动

docker-compose up -d

yaml规则

官网文档

Compose specification | Docker Documentation

yaml文件只有3层

version: '' # 版本

services: # 服务

服务1: web

# 服务配置

images

build

network

.....

服务2: redis

....

服务3: redis

# 其他配置 网络/卷、全局规则

volumes:

networks:

configs:

注意:其中文件可以通过depends_on 规定启动顺序

通过compose可以直接启动开源应用 ,比如wordpress博客

地址

Quickstart: Compose and WordPress | Docker Documentation

mkdir wordpress

vim docker-compose.yml

version: "3.9"

   

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: {}

访问

ip:8000

说明

启动开源项目,直接通过images启动的,所以 不需要创建dockerfile文件 也不需要build等

5、实战

docker-compose.yml

1、编写项目微服务

创建一个boot的微服务项目,带有redis测试,配置文件如下

server.port=8088

spring.redis.host=redis

2、创建dockerfile 构建镜像文件

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8088"]

EXPOSE 8088

ENTRYPOINT ["java","-jar","/app.jar"]

3、docker-compose.yaml 编排项目

version: '3.9'

services:

 testapp:

   build:

   image: testapp

   depends_on:

     - redis

   ports:

     - "8080:8080"

 redis:

   image: "/library/redis:alpine"

4、丢到服务器运行 docker-compose up

小结:

项目中如果有 docker-compose 文件。说明所有项目都是按照这个规则来运行,直接启动 一键搞定

假设项目要重新部署打包docker-compose up --build# 重新构建!

二、Swarm

现在有若干台docker主机,每个主机就是一个node即docker节点。这些节点有管理者也有工作者,多个节点就组成了一个网络集群,而要管理这个网络集群就得需要一个工具

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。

Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。

集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。

Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点。

编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。

此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。

以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。

一般10台以上用k8s,10台以下swarm

官网文档

Swarm mode overview | Docker Documentation

环境准备

需要4台服务器,阿里云购买个人后台创建ecs,选择按量付费+共享性

每台需要安装docker ,xshell中打开四个窗口,选择一个右键选择同步会话,其他三个会同步操作

Swarm工作模式

通过swarm搭建docker集群

参考地址

【狂神说Java】Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili

初始化节点a,(a、b、d、c)

#ip可通过ip addr 查看eth0即可

docker swarm init --advertise-addr 172.21.30.251

初始化节点完成后,把其他3台服务器c d e依次搭建进去,在a上先获取令牌

# 获取令牌

#获取管理者令牌方式

[root@izj6c22bffydfp7tlrbx7fz ~]# docker swarm join-token manager

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


   docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-4g88m1p1mwlcf9w37cvnne239 172.21.30.251:2377


#获取工作者令牌方式

[root@izj6c22bffydfp7tlrbx7fz ~]# docker swarm join-token worker

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


   docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-7ncmcil94nzm4jxdh21n9k2yy 172.21.30.251:2377


[root@izj6c22bffydfp7tlrbx7fz ~]#


根据令牌加入工作者和管理者

比如将b设置为工作者,直接在b执行

docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-7ncmcil94nzm4jxdh21n9k2yy 172.21.30.251:2377

将c设置成管理者,直接在c执行

docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-4g88m1p1mwlcf9w37cvnne239 172.21.30.251:2377

搭建完成通过命令查看

docker node ls

Raft协议

Raft协议:保证大多数节点存活才可以用。只要>1 ,集群至少大于3台!

启动服务

swarm中不在叫启动容器而是启动一个服务,docker run 容器启动!容器不具有扩缩性,docker service启动服务!具有扩缩性,滚动更新!

启动一个服务

查看服务 REPLICAS

docker service ls

只有一个节点

动态管理容器(扩缩容)

现在用户量增加 需要3台容器,则只需扩容nginx服务

或者使用scale命令扩容

集群相当于一个整体,上面通过update或者scale扩容后,或随机分配服务到节点中,有的可能没有分到,通过docker ps 可以查看

但是就算此节点没有分到服务,通过该节点服务器ip:80也能访问服务

删除服务命令

docker swarm rm

三、Stack

docker-compose 单机部署项目!Docker Stack部署,集群部署!

//单机

docker-compose up -d wordpress.yam

集群内

docker stack deploy wordpress.yaml

四、Secret

安全!配置密码,证书

五、Config

创建配置文件. 主要是在docker swarm service创建的过程中 挂在配置文件

主要在docker swarm 容器管理中使用

docker swarm init

echo "This is a config" | docker config create my-config -

挂在配置文件my-config到service容器

docker service create --name redis --config my-config redis:alpine


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1天前
|
存储 监控 安全
【专栏】探讨Docker Compose的核心概念、使用方法及最佳实践,助你轻松驾驭容器编排的世界
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
1天前
|
Kubernetes Docker Python
《Docker 简易速速上手小册》第10章 朝着 Docker Swarm 和 Kubernetes 迈进(2024 最新版)
《Docker 简易速速上手小册》第10章 朝着 Docker Swarm 和 Kubernetes 迈进(2024 最新版)
35 0
|
1天前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm了解两者特点,助力选取合适容器编排工具
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。
|
1天前
|
监控 Docker 容器
【Docker 专栏】Docker Swarm 集群的扩展与缩容策略
【5月更文挑战第8天】本文探讨了Docker Swarm集群的扩展与缩容策略。集群扩展可提高性能、增强可用性和适应业务发展,可通过手动或自动方式实现。缩容则需考虑业务需求、资源利用率和节点状态,可手动或按策略执行。关键步骤包括添加/移除节点及任务迁移。注意数据同步、监控评估和测试验证。案例分析和总结强调了灵活管理对保持集群最佳状态的重要性。
【Docker 专栏】Docker Swarm 集群的扩展与缩容策略
|
1天前
|
Kubernetes 负载均衡 调度
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
【5月更文挑战第8天】Docker Swarm 和 Kubernetes 是两大容器编排工具,各有优势。Docker Swarm 简单易用,适合小到中型规模,与 Docker 生态系统集成紧密;而 Kubernetes 功能强大,扩展性好,适用于大规模、复杂场景。选择时需考虑团队技术能力、应用需求及现有技术栈。Kubernetes 学习曲线较陡,Docker Swarm 则较平缓。
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
|
1天前
|
负载均衡 安全 数据安全/隐私保护
【Docker专栏】Docker Swarm集群管理详解
【5月更文挑战第7天】Docker Swarm是Docker的原生集群管理工具,用于将多个Docker主机整合为虚拟主机。其主要特点是服务发现、负载均衡、自动恢复和扩展性。Swarm由Manager(负责管理与控制)和Worker(运行服务)节点组成。创建Swarm集群涉及初始化、添加Worker节点及查看集群状态。服务部署包括创建、更新、扩展和缩减。Swarm还支持滚动更新、健康检查、网络管理和安全加密。本文概述了Swarm的基本功能,鼓励读者进一步探索其高级特性。
【Docker专栏】Docker Swarm集群管理详解
|
1天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
1天前
|
Shell 应用服务中间件 nginx
6.Docker Compose
6.Docker Compose
|
1天前
|
NoSQL Redis Docker
[docker] Compose 简介
[docker] Compose 简介
|
1天前
|
NoSQL 数据库 Docker
《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)
《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)
47 0