likes
comments
collection
share

利用 Docker Compose 部署多服务应用

作者站长头像
站长
· 阅读数 15

引言

在现代软件开发中,微服务架构已经成为一种趋势。为了管理和部署由多个服务组成的复杂应用程序, Docker Compose 提供了一种简单而强大的方式。 本文将详细介绍如何使用 Docker Compose 配置文件来部署一个包含 UI 界面、数据库、消息队列和搜索引擎的服务集合。

Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许开发者通过一个 YAML 文件来配置应用的所有服务, 然后使用一个简单的命令来启动和停止这些服务。这种方式不仅可以简化开发和测试流程,而且还能保证生产环境的一致性。

服务配置解析

在 Docker Compose 文件中,定义了六个主要服务:dockeruimysqlzookeeperkafkarediselasticsearch

主配置文件:


version: '2.2'
services:
    dockerui:
      image: uifd/ui-for-docker
      container_name: dockerui
      volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
      ports:
      - 9000:9000
      privileged: true
      restart: always
      environment:
      - TZ=Asia/Shanghai
    mysql:
      image: mysql:5.7
      restart: always
      container_name: mysql
      environment:
        - MYSQL_ROOT_PASSWORD=123456
      volumes:
        - ./mysql/conf:/etc/mysql/conf.d
        - ./mysql/datadir:/var/lib/mysql
      ports:
        - 3306:3306          
    zookeeper:
      image: index.docker.io/wurstmeister/zookeeper:latest
      container_name: zookeeper
      volumes:
      - /etc/localtime:/etc/localtime:ro
      restart: always
      ports:
      - 2181:2181
    kafka:
      image: index.docker.io/wurstmeister/kafka:2.11-1.1.0
      container_name: kafka
      restart: always
      ports:
      - 9092:9092
      - 32770:32770
      links:
      - zookeeper:zookeeper
      environment:
      - TZ=Asia/Shanghai
      - KAFKA_ADVERTISED_HOST_NAME=10.68.16.24
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_CREATE_TOPICS=DeviceTopic:1:1
      volumes:
      - ./kafka/var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    redis:
      image: redis:4
      container_name: redis
      restart: always
      networks:
        - esnet
      ports:
        - 6379:6379
      volumes:
        - ./redis/redis.conf:/etc/redis/redis.conf
      command: redis-server /etc/redis/redis.conf
    elasticsearch:
      image: elasticsearch:5.6.16
      restart: always
      container_name: elasticsearch
      environment:
        - cluster.name=docker-cluster
        - bootstrap.memory_lock=true
        - "ES_JAVA_OPTS=-Xms4096m -Xmx4096m"
      ulimits:
        memlock:
         soft: -1
         hard: -1
      volumes:
        - ./elasticsearch/plugins:/usr/share/elasticsearch/plugins
        - ./elasticsearch/data:/usr/share/elasticsearch/data
      ports:
        - 9200:9200
      networks:
        - esnet
    elasticsearch6.8.8:
      image: elasticsearch:6.8.8
      restart: always
      container_name: elasticsearch6.8.8
      environment:
        - cluster.name=docker-cluster
        - bootstrap.memory_lock=true
        - "ES_JAVA_OPTS=-Xms4096m -Xmx4096m"
      ulimits:
        memlock:
         soft: -1
         hard: -1
      volumes:
        - ./elasticsearch688/plugins:/usr/share/elasticsearch/plugins
        - ./elasticsearch688/data:/usr/share/elasticsearch/data
        - ./elasticsearch688/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      ports:
        - 19200:9200
        - 19300:9300
      networks:
        - esnet         
networks:
  esnet:


下面将逐一解析这些服务的配置:

1. dockerui

  • 使用 uifd/ui-for-docker 镜像,这是一个 Docker UI 管理界面,允许通过 Web 界面管理 Docker 容器。
  • 容器命名为 dockerui
  • 将宿主机的 Docker 套接字文件 /var/run/docker.sock 映射到容器中,使得 UI 可以与 Docker 守护进程通信。
  • 将宿主机的 /etc/localtime 映射到容器中,确保容器使用的时间与宿主机同步。
  • 映射端口 9000,使得 UI 可以通过宿主机的 9000 端口访问。
  • 设置了 privileged 模式,这通常用于需要特权操作的容器。
  • 设置了重启策略为 always,确保容器在退出时总是重新启动。
  • 设置环境变量 TZAsia/Shanghai,指定容器的时区。

2. mysql

  • 使用 mysql:5.7 镜像,这是 MySQL 数据库的官方镜像。
  • 容器命名为 mysql
  • 设置了环境变量 MYSQL_ROOT_PASSWORD,为 MySQL root 用户指定密码。
  • 将宿主机的 ./mysql/conf 目录映射到容器的 /etc/mysql/conf.d,用于自定义 MySQL 配置。
  • 将宿主机的 ./mysql/datadir 目录映射到容器的 /var/lib/mysql,用于持久化 MySQL 数据。
  • 映射端口 3306,使得 MySQL 可以通过宿主机的 3306 端口访问。

3. zookeeper

  • 使用 wurstmeister/zookeeper 镜像,这是 Apache ZooKeeper 的 Docker 镜像。
  • 容器命名为 zookeeper
  • 映射宿主机的 /etc/localtime 以同步时间。
  • 设置了重启策略为 always
  • 映射端口 2181,ZooKeeper 默认端口。

4. kafka

  • 使用 wurstmeister/kafka 镜像,这是 Apache Kafka 的 Docker 镜像。
  • 容器命名为 kafka
  • 设置了重启策略为 always
  • 映射端口 909232770,Kafka 默认端口和 JMX 端口。
  • 通过 linkszookeeper 服务建立连接。
  • 设置环境变量,包括时区、Kafka 对外广播的主机名、连接 ZooKeeper 的地址和创建的主题。
  • 映射宿主机的 ./kafka/var/run/docker.sock/etc/localtime

5. redis

  • 使用 redis:4 镜像,这是 Redis 数据库的官方镜像。
  • 容器命名为 redis
  • 设置了重启策略为 always
  • 加入了 esnet 网络。
  • 映射端口 6379,Redis 默认端口。
  • 将宿主机的 ./redis/redis.conf 映射到容器中,用于自定义 Redis 配置。
  • 使用 redis-server /etc/redis/redis.conf 命令启动 Redis 服务。

6. elasticsearchelasticsearch6.8.8

  • 分别使用 elasticsearch:5.6.16elasticsearch:6.8.8 镜像,这是 Elasticsearch 的官方镜像。
  • 容器命名分别为 elasticsearchelasticsearch6.8.8。 - 设置了重启策略为 always
  • 设置环境变量,包括集群名、内存锁定和 Java 虚拟机选项。
  • 设置 ulimits 以允许无限的内存锁定。
  • 映射宿主机的插件目录、数据目录和配置文件。
  • 映射端口 92009200,Elasticsearch 的 HTTP 和传输端口。
  • 加入了 esnet 网络。

7. networks

  • 定义了一个名为 esnet 的网络,但没有指定任何配置。这允许容器间通过网络名进行通信。

如何使用

要启动所有服务,只需在包含此 docker-compose.yml 文件的目录中运行以下命令:

docker-compose up -d

要停止并移除所有服务,可以运行:

docker-compose down

结论

通过本文的介绍,了解了如何使用 Docker Compose 来定义和管理复杂的多服务应用。Docker Compose 文件为提供了一个清晰、易于理解的方式来配置整个应用的基础设施,使得部署和维护变得简单高效。随着容器化技术的普及,掌握 Docker Compose 将会是每个开发者和运维工程师的宝贵技能。

转载自:https://juejin.cn/post/7397617342163386378
评论
请登录