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