利用 Docker Compose 部署多服务应用
2024-08-02 14:15 阅读(266)

引言

在现代软件开发中,微服务架构已经成为一种趋势。为了管理和部署由多个服务组成的复杂应用程序,

Docker Compose 提供了一种简单而强大的方式。

本文将详细介绍如何使用 Docker Compose 配置文件来部署一个包含 UI 界面、数据库、消息队列和搜索引擎的服务集合。

Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许开发者通过一个 YAML 文件来配置应用的所有服务,

然后使用一个简单的命令来启动和停止这些服务。这种方式不仅可以简化开发和测试流程,而且还能保证生产环境的一致性。

服务配置解析

在 Docker Compose 文件中,定义了六个主要服务:dockerui、mysql、zookeeper、kafka、redis 和 elasticsearch。

主配置文件:


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,确保容器在退出时总是重新启动。

设置环境变量 TZ 为 Asia/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。

映射端口 9092 和 32770,Kafka 默认端口和 JMX 端口。

通过 links 与 zookeeper 服务建立连接。

设置环境变量,包括时区、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. elasticsearch 和 elasticsearch6.8.8:


分别使用 elasticsearch:5.6.16 和 elasticsearch:6.8.8 镜像,这是 Elasticsearch 的官方镜像。

容器命名分别为 elasticsearch 和 elasticsearch6.8.8。 - 设置了重启策略为 always。

设置环境变量,包括集群名、内存锁定和 Java 虚拟机选项。

设置 ulimits 以允许无限的内存锁定。

映射宿主机的插件目录、数据目录和配置文件。

映射端口 9200 和 9200,Elasticsearch 的 HTTP 和传输端口。

加入了 esnet 网络。


7. networks:


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


如何使用

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


docker-compose up -d

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


docker-compose down

结论

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