引言
在现代软件开发中,微服务架构已经成为一种趋势。为了管理和部署由多个服务组成的复杂应用程序,
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 将会是每个开发者和运维工程师的宝贵技能。