Docker-compose && swarm

发布时间:2024年01月17日

docker compose

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。docker compose 中的容器是可以相互通信的,因为一般属于同一个网络下,如果没有填网络默认也会在同一网络下,比如下面这个yaml,net是没有填的但是也可以通过服务名进行通信

version: '3'
services:
  jenkins:
    container_name: jenkins
    restart: always
    image: jenkins/jenkins:2.440 
    ports:
      - "10240:8080"
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
    networks:
      - net
  remote_host:
    container_name: remote-host
    image: remote-host:latest
    build:
      context: centos
    networks:
      - net
networks:
  net:
#安装compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

基础指令

docker-compose -h              # 查看帮助
docker-compose up              # 启动所有docker-compose服务
docker-compose up -d           # 启动所有docker-compose服务并后台运行
docker-compose down            # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id   # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps               # 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     # 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     # 查看容器输出日志
docker-compose config     # 检查配置
docker-compose config -q  # 检查配置,有问题才有输出
docker-compose restart   # 重启服务
docker-compose start     # 启动服务
docker-compose stop      # 停止服务

实战
传统的部署存在的问题:
顺序要求,当前的服务依赖于其它服务的启动,需要按顺序启动服务才能够访问成功。
里面的配置写死后,基于docker的部署容器的IP可能会发生变化。
docker compose yaml

version: "3" #版本
#服务容器实例
services:
  microService:
    image: zzyy_docker:1.6 #镜像名 
    container_name: ms01 #容器名
    ports:
      - "6001:6001" #端口映射
    volumes:
      - /app/microService:/data #数据卷挂载,持久化数据
    networks: 
      - atguigu_net  #网络,如果同一个网络下可以通过服务名称去访问容器实例,我们可以看到后面用的都是同一个网络,就类似于我们在网络篇创建一个网络
    depends_on: 
      - redis
      - mysql
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - atguigu_net
    command: redis-server /etc/redis/redis.conf
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: 
   atguigu_net

Restart 有四种可选值:

  • "no": 不重启 (需要引号,没有引号的no被yaml当做false)
  • always: 无论原因,一律重启
  • on-failure: 仅在异常退出时重启
  • unless-stopped: 仅在手动stop时停止,否则一律重启
    在用的时候将IP换为服务名
spring.datasource.url=jdbc:mysql://mysql:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
docker-compose config -q #先检查一下配置
docker-compose up -d  #启动服务一键ok

docker swarm

Docker是容器运行时,而Swarm是Docker公司出品的容器编排工具。
Swarm基于Docker运行时,一个swarm由多个节点组成,每个节点是在swarm模式下运行Docker Engine的物理机或虚拟机。。Docker Swarm 支持标准的Docker API,所有任何已经与Docker Engine通信的工具都可以与Swarm集成,轻松地扩展到多个主机。

在这里插入图片描述
swarm中节点分为两种类型:
管理节点:维护集群状态,调度服务,响应swarm模式HTTP API 端点.管理节点通过Raft算法实现维护整个swarm所有服务的一致内部状态。
工作节点:工作节点是Docker引擎所在的物理机或虚拟机,其唯一目的是运行容器。工作节点不参与 Raft 分布式状态,不做调度决策。
服务:在swarm上部署部署的时候管理节点以服务为状态单位,它会将集群节点上的服务调度为一个或多个任务分发给工作节点。工作节点会去启动一个容器,填充这些任务,并且检查容器的健康状态,如果容器的状态是成功的会返回给调度器。如果一某个副本没有启动成功,则会去其他worker节点启动,如果还是没有成功则终止服务。
任务调度:任务是swarm调度的原子单位。创建或更新服务声明时,调度器会通过调度任务来实现所需的状态。例如,定义一个服务,要求调度器始终保持三个nginx实例运行。调度器将创建三个任务。每个任务都是一个插槽,调度器通过生成容器来填充插槽。
容器是任务的实例化。如果nginx实例崩溃,调度器将创建一个新的nginx副本来生成一个新的容器。

实操
docker info | grep Swarm #默认已经有了只是出于未激活的状态
docker swarm init #进行初始化

在这里插入图片描述

docker node ls #查看节点

在这里插入图片描述

docker service create alpine ping www.baidu.com
docker service ls #查看看服务可以看到有节点数量

在这里插入图片描述

#根据名字查看细节
docker service ps distracted_volhard 

在这里插入图片描述

docker container ls

在这里插入图片描述

#修改为三个副本
docker service update affectionate_knuth  --replicas 3
#进行查看
docker service ps affectionate_knuth

在这里插入图片描述

#我们强制删除一个节点
docker container rm -f 60c2ba6a3d93

我们可以发现节点的数量从三个变成了两个,然后又变成了三个。说明管节点感知到了变化,又调度了一个节点。

集群管理
基础环境

前置条件有三台可以通信的机器

#Master节点执行
docker swarm init --advertise-addr 192.168.0.124
#worker节点执行
docker swarm join --token SWMTKN-1-2yz561otyfc7imbznsdgngkyl0ohqgn2ywzz9pdgoj7h17hehn-73af2mef4pxtf2yhmbqo6aake 192.168.0.124:2377
docker node ls #查看集群的状态

在这里插入图片描述

#创建一个服务我们发现,每台机器上各一个
docker service create --replicas 3 alpine ping www.baidu.com
docker service ps affectionate_knuth

在这里插入图片描述

overlay 网络

服务于容器间网络,提供了可选的加密特性,允许容器处于多个网络,也就是说它提供了跨节点通信的能力。

docker network create --driver overlay myoverlay
docker network ls

** swarm routing mesh**
比如我们在swarm 集群上部署了一个应用,在swarm集群的任意节点上都可以访问服务。但是在overlay网络上只有一个IP这就是swarm的Routing Mesh机制。

docker service inspect myap

Routing Mesh分为两类:

  • Internal Routing Mesh:容器与容器之间通过overlay网络进行访问。通过service name进行DNS解析,获得VIP(Virtual ip)
    在这里插入图片描述
    比如启动一个有三个replica的服务,三个容器分布在三个节点上。swarm会提供一个vip,并且承担流量在三个容器上的负载均衡

  • Ingress Routing Mesh:当在任何一个swarm节点去访问端口服务的时候会被本节点的IPVS(Linux ip virtual service)转发到真正的swarm节点上。

在这里插入图片描述
访问节点IP时,swarm会对击中节点的流量进行负载均衡。

Stack

docker stack 其实就是swarm版的docker-compose.yml,要求使用version >= 3

  • 使用docker stack deploy代替docker service create
  • Swarm不支持build标签,build标签失效
  • Compose不支持deploy标签,deploy标签失效
    基础命令
#部署应用
docker stack deploy -c docker-stack.yml mystack
docker stack ls
# NAME      SERVICES   ORCHESTRATOR
# mystack   2          Swarm
docker stack services mystack 
# ID             NAME               MODE         REPLICAS   IMAGE             PORTS
# xj7vyueoqcmt   mystack_drupal     replicated   1/1        drupal:8-apache   *:8080->80/tcp
# wiqj2536orpr   mystack_postgres   replicated   1/1        postgres:10    
#查看服务
docker stack ps mystack 
#下线服务
docker stack rm mystack

我们可以看到在部署应用的时候,给我们创建了一个默认的网络,然后启动各个服务。
在这里插入图片描述

实战
安装一个drupal 用来测试

version: '3.1'

services:
  drupal:
    image: drupal:8-apache
    ports:
      - 8080:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      - /var/www/html/sites
  postgres:
    image: postgres:10
    environment:
      POSTGRES_PASSWORD: mypassword

在这一步数据库验证通过以后,可以确认我们这个服务启动成功并可以和PG通信
在这里插入图片描述

防火墙打开相关指令

Docker Swarm Visualizer

提供了一个可视化界面
单独部署:

git clone https://github.com/dockersamples/docker-swarm-visualizer
cd docker-swarm-visualizer
docker-compose up -d

swarm部署:

version: '3.1'

services:
  drupal:
    image: drupal:8-apache
    ports:
      - 80:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      - /var/www/html/sites
  postgres:
    image: postgres:10
    environment:
      POSTGRES_PASSWORD: mypassword
  visualizer:
    image: dockersamples/visualizer
    ports:
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]

可以看到各个服务节点部署的应用:
在这里插入图片描述
Docker secret

在之前的yaml文件中,我们将postgres的密码以明文形式存储在了文件中。这种做法并不安全。因此我们需要引入docker secret
Swarm模式下manager节点通过Raft Database保持状态一致。
Raft DB本身是一个在磁盘上加密的介质,并且信息仅保存于manager节点。我们可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。
单独部署

echo "my_psql_user" >> psql_user.txt
#创建一个用户
docker secret create psql_user psql_user.txt
#查看现在有的密匙
docker secret ls
#创建一个密码的密匙 这是另一种方式
echo "myDBpassWORD" | docker secret create psql_pass - #- 表示从终端输入的
#启动pg 我们将这两个密匙 传递给环境变量的两个文件/run/secrets/psql_pass 和/run/secrets/psql_user
docker service create --name psql --secret psql_user --secret psql_pass -e POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass -e POSTGRES_USER_FILE=/run/secrets/psql_user postgres:10
#进入容器内部测试登录
psql -U my_psql_user

在这里插入图片描述

swarm部署:

version: '3.1' #这个版本必须大于3.1
services:
  drupal:
    image: drupal:8-apache
    ports:
      - 80:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      - /var/www/html/sites
  postgres:
    image: postgres:10
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/psql_password
      POSTGRES_USER_FILE: /run/secrets/psql_user
  visualizer:
    image: dockersamples/visualizer
    ports:
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]
secrets:
  psql_user:
    file: ./psql_user.txt #和上面一样将用户存入这里
  psql_password:
    file: ./psql_password.txt#和上面一样将密码存入这里
compose vs swarm

docker compose,同样可以一次性启动多个docker容器。但是二者的使用场景不同。docker compose更适合与本地测试与开发,而不适合生产环境。

文章来源:https://blog.csdn.net/qq_43259860/article/details/135624388
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。