Docker-compose && swarm

这篇具有很好参考价值的文章主要介绍了Docker-compose && swarm。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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可能会发生变化。

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集成,轻松地扩展到多个主机。

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

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

docker node ls #查看swarm节点

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

docker container ls

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

#我们强制删除一个节点
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-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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)
    Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose
    比如启动一个有三个replica的服务,三个容器分布在三个节点上。swarm会提供一个vip,并且承担流量在三个容器上的负载均衡

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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose
访问节点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

我们可以看到在部署应用的时候,给我们创建了一个默认的网络,然后启动各个服务。
Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

实战
安装一个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-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

防火墙打开相关指令

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-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose
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

Docker-compose && swarm,docker && k8s && devops,docker,容器,运维,swarm,compose

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://www.toymoban.com/news/detail-811674.html

到了这里,关于Docker-compose && swarm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【docker】 docker-compose如何更新services镜像 | docker-compose如何更新某个镜像 | docker-compose如何重启某个服务

    更新镜像: 首先,确保你已经获取了最新的镜像版本。这可以通过 docker pull 命令来实现,或者直接使用 docker-compose pull 命令更新所有服务的镜像。 拉取 指定 镜像 - 代码如下: 拉取 所有 镜像 - 代码如下: 注意:在拉取更新的镜像后,docker-compose不会自动重新启动服务。你需要

    2024年02月06日
    浏览(48)
  • 深入探讨Docker生态系统,Docker Compose vs. Docker Swarm vs. Kubernetes:深入比较

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容:Docker生态系统 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 Docker已经成为现代容器化应用程序的事实标准,但

    2024年02月07日
    浏览(40)
  • docker-compose build 和 docker-compose up -d 的区别

    docker-compose build 命令用于构建 Docker Compose 文件中定义的服务的镜像,根据 docker-compose.yml 文件中的配置信息,构建需要的镜像并且将它们打上标签。构建镜像是一个比较耗时的过程,可能需要从 Docker Hub 上拉取镜像、下载依赖等,而且在构建完成后不会启动容器。 docker-comp

    2024年02月13日
    浏览(81)
  • docker-compose和docker compose的区别

    在docker实际使用中,经常会搭配Compose,用来定义和运行多个 Docker 容器。使用时会发现,有时候的指令是docker-compose,有时候是docker compose,下面给出解释。 docker官方文档:https://docs.docker.com/compose/install/linux/ 官方文档中其实已经给出了答案:Compose分为V1和V2版本,安装方式分

    2024年01月19日
    浏览(47)
  • 【Docker-compose】基于Docker-compose创建LNMP环境并运行Wordpress网站平台

    参见使用Docker构建LNMP环境并运行Wordpress网站平台 Docker-Compose将所管理的容器分为三层,分别是 项目(project)、服务(service)以及容器(container) 。 Docker-Compose运行目录下的所有文件组成一个项目, 若无特殊指定项目名即为当前目录名 。 一个工程当中可包含多个服务,每个

    2024年02月15日
    浏览(51)
  • docker-compose up -d和docker-compose up --build的补充

    docker-compose up -d 命令用于启动已定义在 docker-compose.yml 文件中的服务容器,并以守护进程的方式在后台运行。 具体解释如下: docker-compose : 是一个用于定义和运行多个容器应用的工具。 up : 用于创建并启动容器。 -d 或 --detach : 表示以守护进程的方式运行容器,即在后台运行,

    2024年02月15日
    浏览(35)
  • docker-compose

    Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理 1. Dockerfile 与服务编排  我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器

    2024年02月03日
    浏览(37)
  • 【Docker-Compose】

    Dockerfile模板可以定义一个单独的应用容器,若需要定义多个容器就需要服务编排。 Dockerfile可以让用户管理一个单独的应用容器,而compose允许用户在一个模板(YAML格式)中定义一组相关应用容器(被称为一个项目)。 Docker-Compose是Docker官方的开源项目,负责实现对Docker容器

    2024年02月11日
    浏览(48)
  • Docker容器:Docker-Compose

    一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天是介绍 Docker 官方产品 Docker Compose 。 docker swarm(管理跨节点)。 Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(Y

    2024年02月11日
    浏览(39)
  • docker-compose安装

    一、安装docker(二进制方式) 1、下载docker二进制包 2、添加执行权限并解压 3、二进制文件放到/usr/bin下:mv docker/* /usr/bin/ 4、创建docker配置文件 5、docker 被systemd管理 6、重新加载配置文件: 7、启动并设为开机自启: 8、查看版本:docker --version 二、安装docker-compose 1、使用g

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包