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

通过docker-compose启动进行编排容器

地址

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 规定启动顺序

4、开源项目-wordpress博客搭建

通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序三两行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值