一、分发文件
1、编写脚本并执行
命令示例:
touch {nginx,tomcat,redis,mysql}-compose.yaml
cat >>/etc/hosts <<'eof'
10.4.7.11 ansible
10.4.7.12 lb-nginx
10.4.7.13 app-tomcat
10.4.7.14 db-redis
10.4.7.15 db-mysql
eof
cat >scp.sh <<'EOF'
#/bin/bash
ROOT_PASSWD=666666
[ -d ~/.ssh ] || ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" -q
for num in 10.4.7.{12..15} lb-nginx app-tomcat db-redis db-mysql; do
sshpass -p${ROOT_PASSWD} ssh-copy-id -i ~/.ssh/id_rsa.pub $num "-o StrictHostKeyChecking=no" &>/dev/null
scp /etc/hosts $num:/etc &>/dev/null
done
scp *nginx*.yaml lb-nginx:/root/ &>/dev/null
scp *tomcat*.yaml app-tomcat:/root/ &>/dev/null
scp *redis*.yaml db-redis:/root/ &>/dev/null
scp *mysql*.yaml db-mysql:/root/ &>/dev/null
EOF
yum install -y sshpass
ls
sh scp.sh
输出结果:
[root@MineGi ~]# touch {nginx,tomcat,redis,mysql}-compose.yaml
[root@MineGi ~]# cat >>/etc/hosts <<'eof'
> 10.4.7.11 ansible
> 10.4.7.12 lb-nginx
> 10.4.7.13 app-tomcat
> 10.4.7.14 db-redis
> 10.4.7.15 db-mysql
> eof
[root@MineGi ~]# cat >scp.sh <<'EOF'
> #/bin/bash
> ROOT_PASSWD=666666
> [ -d ~/.ssh ] || ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" -q
> for num in 10.4.7.{12..15} lb-nginx app-tomcat db-redis db-mysql; do
> sshpass -p${ROOT_PASSWD} ssh-copy-id -i ~/.ssh/id_rsa.pub $num "-o StrictHostKeyChecking=no" &>/dev/null
> scp /etc/hosts $num:/etc &>/dev/null
> done
> scp *nginx*.yaml lb-nginx:/root/ &>/dev/null
> scp *tomcat*.yaml app-tomcat:/root/ &>/dev/null
> scp *redis*.yaml db-redis:/root/ &>/dev/null
> scp *mysql*.yaml db-mysql:/root/ &>/dev/null
> EOF
[root@MineGi ~]# yum install -y -q sshpass
软件包 sshpass-1.06-2.el7.x86_64 已安装并且是最新版本
[root@MineGi ~]# ls
mysql-compose.yaml nginx-compose.yaml redis-compose.yaml scp.sh tomcat-compose.yaml
[root@MineGi ~]# sh scp.sh
[root@MineGi ~]#
2、查看结果
二、docker-compose文件解释
1、yaml文件
version: '2'
services:
elasticsearch:
image: elasticsearch:7.9.0
mem_limit: 2G
container_name: znxd-elasticsearch-9200-9200
ports:
- "9200:9200"
- "9300:9300"
restart: always
environment:
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
discovery.type: "single-node"
volumes:
- ./elasticsearch:/usr/share/elasticsearch:rw
zookeeper:
image: zookeeper:3.4.14
container_name: znxd-zookeeper-2181-2181
ports:
- "2181:2181"
restart: always
volumes:
- ./zookeeper-3.4.14/data:/zookeeper-3.4.14/data:rw
- ./zookeeper-3.4.14/conf:/zookeeper-3.4.14/conf:rw
- ./zookeeper-3.4.14/logs:/zookeeper-3.4.14/logs:rw
kafka:
image: kafka:latest
container_name: znxd-kafka-9092-9092
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.160.1.44:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: 10.160.1.44:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
volumes:
- ./kafka_2.13-2.8.1/config:/opt/kafka_2.13-2.8.1/config:rw
- ./kafka_2.13-2.8.1/data:/opt/kafka_2.13-2.8.1/data:rw
- ./kafka_2.13-2.8.1/logs:/opt/kafka_2.13-2.8.1/logs:rw
depends_on:
- zookeeper
redis:
image: redis:6.2.6
container_name: znxd-redis-9379-9379
restart: always
ports:
- "9379:9379"
volumes:
- ./redis/redis.conf:/usr/local/bin/redis.conf:rw
- ./redis/data:/data:rw
command:
/bin/bash -c "redis-server /usr/local/bin/redis.conf"
nacos:
image: nacos/nacos-server
container_name: znxd-nacos-8848-8848
restart: always
environment:
MODE: standalone
ES_JAVA_OPTS: "-Xms1024m -Xmx1024m"
volumes:
- ./nacos:/home/nacos:rw
ports:
- "8848:8848"
networks:
default:
2、相关解释
整体结构说明
- 这个 docker-compose.yml 文件使用的是版本 2 的格式,用于定义多个容器化服务以及它们之间的配置关系,通过 docker-compose 工具可以基于此文件方便地启动、停止和管理这些相关联的服务。
version: '2'
- 指定了 docker-compose 文件所遵循的配置版本规范。不同版本在语法和支持的功能特性上有所不同,这里选择版本 2 来定义后续的服务配置。
services 部分
这是整个文件的核心部分,用于定义各个容器化服务的详细配置信息,下面分别对每个服务进行说明:
elasticsearch 服务
elasticsearch:
image: elasticsearch:7.9.0
mem_limit: 2G
container_name: znxd-elasticsearch-9200-9200
ports:
- "9200:9200"
- "9300:9300"
restart: always
environment:
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
discovery.type: "single-node"
volumes:
-./elasticsearch:/usr/share/elasticsearch:rw
- elasticsearch::定义了名为 elasticsearch 的服务,后续缩进的配置都是针对这个服务的。
- image: elasticsearch:7.9.0:指定该服务使用的 Docker 镜像为 elasticsearch:7.9.0,意味着将基于这个官方的 Elasticsearch 镜像来创建容器。
- mem_limit: 2G:对容器能够使用的内存进行限制,设置上限为 2G,防止该容器过度占用宿主机内存资源。
- container_name: znxd-elasticsearch-9200-9200:给容器指定一个自定义的名称,方便后续识别和操作该容器。
- ports::定义容器端口与宿主机端口的映射关系。
- restart: always:配置容器在退出(无论何种原因)后总是自动重启,以保障服务的持续可用性。
- environment::设置容器内的环境变量。
- volumes::用于将宿主机的目录挂载到容器内的对应目录,实现数据持久化等目的。
- "./elasticsearch:/usr/share/elasticsearch:rw":把宿主机当前目录下的 elasticsearch 目录挂载到容器内的 /usr/share/elasticsearch 目录,并且设置为可读可写(rw)权限,方便存储 Elasticsearch 的数据、配置等文件,同时保证可以在宿主机侧对这些文件进行操作。
zookeeper 服务
zookeeper:
image: zookeeper:3.4.14
container_name: znxd-zookeeper-2181-2181
ports:
- "2181:2181"
restart: always
volumes:
-./zookeeper-3.4.14/data:/zookeeper-3.4.14/data:rw
-./zookeeper-3.4.14/conf:/zookeeper-3.4.14/conf:rw
-./zookeeper-3.4.14/logs:/zookeeper-3.4.14/logs:rw
- zookeeper::定义名为 zookeeper 的服务。
- image: zookeeper:3.4.14:指定使用 zookeeper:3.4.14 这个 Docker 镜像来创建容器。
- container_name: znxd-zookeeper-2181-2181:给容器指定名称 znxd-zookeeper-2181-2181。
- ports::
- "2181:2181":将容器内 Zookeeper 服务监听的 2181 端口映射到宿主机的 2181 端口,便于外部客户端通过宿主机的 2181 端口连接到容器内的 Zookeeper 服务。
- restart: always:确保容器在退出后自动重启。
- volumes::挂载多个目录实现数据持久化和配置管理。
kafka 服务
kafka:
image: kafka:latest
container_name: znxd-kafka-9092-9092
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.160.1.44:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: 10.160.1.44:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
volumes:
-./kafka_2.13-2.8.1/config:/opt/kafka_2.13-2.8.1/config:rw
-./kafka_2.13-2.8.1/data:/opt/kafka_2.13-2.8.1/data:rw
-./kafka_2.13-2.8.1/logs:/opt/kafka_2.13-2.8.1/logs:rw
depends_on:
- zookeeper
- kafka::定义 kafka 服务。
- image: kafka:latest:使用 kafka:latest 这个 Docker 镜像来创建容器,会获取最新版本的 Kafka 镜像。
- container_name: znxd-kafka-9092-9092:给容器指定名称 znxd-kafka-9092-9092。
- ports::
- 9092:9092:将容器内 Kafka 服务的 9092 端口(通常用于客户端连接等)映射到宿主机的 9092 端口,方便外部客户端与容器内的 Kafka 服务进行通信。
- environment::设置一系列与 Kafka 运行相关的环境变量。
- KAFKA_BROKER_ID: 1:指定该 Kafka 节点的唯一标识符为 1,在 Kafka 集群中每个节点都有一个不同的 Broker ID。
- KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.160.1.44:9092:对外公布的监听地址,告诉客户端如何连接到这个 Kafka 节点,这里指定为 10.160.1.44 这个 IP 地址(可能是宿主机或相关网络环境下的有效 IP)和 9092 端口,并且协议为 PLAINTEXT(即普通文本协议,非加密的)。
- KAFKA_CREATE_TOPICS: "test:1:1":设置在 Kafka 启动时自动创建一个名为 test 的主题,分区数为 1,副本数为 1。
- KAFKA_ZOOKEEPER_CONNECT: 10.160.1.44:2181:指定 Kafka 连接的 Zookeeper 服务的地址和端口,用于 Kafka 与 Zookeeper 之间进行协调管理,如存储元数据等,这里指向了前面定义的 zookeeper 服务所在的 10.160.1.44:2181。
- KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092:定义 Kafka 在容器内监听的地址和端口,这里监听所有可用的 IP 地址(0.0.0.0)上的 9092 端口,以便接收来自内部或外部的连接请求。
- volumes::挂载相关目录实现数据持久化和配置管理。
- "./kafka_2.13-2.8.1/config:/opt/kafka_2.13-2.8.1/config:rw":把宿主机当前目录下的 kafka_2.13-2.8.1/config 目录挂载到容器内的 /opt/kafka_2.13-2.8.1/config 目录,方便修改和管理 Kafka 的配置文件,可读可写权限。
- "./kafka_2.13-2.8.1/data:/opt/kafka_2.13-2.8.1/data:rw":挂载宿主机的 kafka_2.13-2.8.1/config 目录到容器内的 /opt/kafka_2.13-2.8.1/data 目录,用于存储 Kafka 的数据,具备可读可写权限。
- "./kafka_2.13-2.8.1/logs:/opt/kafka_2.13-2.8.1/logs:rw":将宿主机的 kafka_2.13-2.8.1/logs 目录挂载到容器内的 /opt/kafka_2.13-2.8.1/logs 目录,用于存储 Kafka 的日志文件,可读可写权限。
- depends_on::定义了服务之间的依赖关系,这里表明 kafka 服务依赖于 zookeeper 服务,意味着在启动 kafka 服务之前,docker-compose 会先确保 zookeeper 服务已经启动并处于可用状态。
redis 服务
redis:
image: redis:6.2.6
container_name: znxd-redis-9379-9379
restart: always
ports:
- "9379:9379"
volumes:
-./redis/redis.conf:/usr/local/bin/redis.conf:rw
-./redis/data:/data:rw
command:
/bin/bash -c "redis-server /usr/local/bin/redis.conf"
- redis::定义 redis 服务。
- image: redis:6.2.6:使用 redis:6.2.6 这个 Docker 镜像来创建容器。
- container_name: znxd-redis-9379-9379:给容器指定名称 znxd-redis-9379-9379。
- restart: always:使容器在退出后自动重启。
- ports::
- "9379:9379":将容器内 Redis 服务监听的 9379 端口映射到宿主机的 9379 端口,方便外部通过宿主机的 9379 端口访问容器内的 Redis 服务。
- volumes::挂载相关目录。
- "./redis/redis.conf:/usr/local/bin/redis.conf:rw":把宿主机当前目录下的 redis/redis.conf 文件挂载到容器内的 /usr/local/bin/redis.conf 文件位置,并且可读可写,这样可以方便地在宿主机侧修改 Redis 的配置文件来控制 Redis 服务的运行参数等。
- "./redis/data:/data:rw":挂载宿主机的 redis/data 目录到容器内的 /data 目录,用于存储 Redis 的数据,具备可读可写权限。
- command::指定容器启动时要执行的命令,这里执行一个 bash 命令来启动 Redis 服务器,并指定使用挂载进来的 redis.conf 配置文件,以此来按照期望的配置运行 Redis 服务。
nacos 服务
nacos:
image: nacos/nacos-server
container_name: znxd-nacos-8848-8848
restart: always
environment:
MODE: standalone
ES_JAVA_OPTS: "-Xms1024m -Xmx1024m"
volumes:
-./nacos:/home/nacos:rw
ports:
- "8848:8848"
- nacos::定义 nacos 服务。
- image: nacos/nacos-server:使用 nacos/nacos-server 这个 Docker 镜像来创建容器。
- container_name: znxd-nacos-8848-8848:给容器指定名称 znxd-nacos-8848-8848。
- restart: always:保障容器退出后自动重启。
- environment::设置容器内的环境变量。
- MODE: standalone:配置 Nacos 的运行模式为单机模式,即独立运行,不需要与其他 Nacos 节点组成集群。
- ES_JAVA_OPTS: "-Xms1024m -Xmx1024m":为 Nacos 运行时的 Java 进程指定初始内存和最大内存均为 1024m,以合理控制内存使用情况。
- volumes::
- "./nacos:/home/nacos:rw":把宿主机当前目录下的 nacos 目录挂载到容器内的 /home/nacos 目录,可读可写权限,方便存储 Nacos 的数据、配置等文件,也便于在宿主机侧对这些文件进行操作。
- ports::
- "8848:8848":将容器内 Nacos 服务监听的 8848 端口映射到宿主机的 8848 端口,便于外部通过宿主机的 8848 端口访问容器内的 Nacos 服务。
networks 部分
networks:
default:
- 这里定义了网络相关配置,不过只是简单地使用了默认网络。在 docker-compose 中,默认网络会自动创建,用于连接各个容器服务,使得容器之间可以相互通信(如果有需要通信的场景)。如果有更复杂的网络需求,比如创建自定义网络、指定网络驱动、配置网络的 IP 范围等,可以在这里进一步详细扩展相关网络配置内容。
总体来说,这份 docker-compose.yml 文件定义了一套常见的用于开发、测试或小型生产环境的服务组合,包含了搜索引擎(Elasticsearch)、分布式协调服务(Zookeeper)、消息队列(Kafka)、缓存数据库(Redis)以及配置中心(Nacos)等服务,并对它们的资源使用、端口映射、数据持久化、运行模式等关键方面进行了配置,方便通过 docker-compose 工具一键启动和管理这些关联服务。