当前位置: 首页 > article >正文

利用docker-compose一键创建并启动所有容器

简介

在开发复杂的分布式应用时,通常需要同时运行多个服务(如数据库、缓存、Web 应用等)。Docker Compose 提供了一种简便的方式来定义和运行多容器 Docker 应用程序。通过一个 docker-compose.yml 文件,您可以配置应用程序的服务、网络和卷,并且只需一条命令即可轻松管理这些服务的生命周期。

本文将介绍如何编写一个 docker-compose.yml 文件,以及如何使用它来一键创建并启动所有必要的容器。

前提条件

已安装 Docker 和 Docker Compose。
对 Docker 的基本概念有所了解,包括镜像、容器、网络和卷。

docker-compose2.X版本

Docker Compose 配置文件

docker-compose.yml 文件是 Docker Compose 的核心配置文件,用于定义和配置服务、网络和卷。下面是一个简单的例子,展示了如何为一个包含 RabbitMQ 和 Elasticsearch 服务的应用程序编写配置文件。

需要提前把挂载目录和配置文件创建或者写好配置内容
需要创建个网络

docker network create my_custom_network
services:
  redis:
    image: xxxxx/service/redis-amd64:7.0.2
    container_name: redis
    networks:
      - security-hub
    volumes:
      - /data/common/redis/config/redis.conf:/etc/redis.conf
      - /data/common/redis/data:/data
    ports:
      - "6379:6379"
    restart: always
    command: ["redis-server", "/etc/redis.conf", "--requirepass", "xxxx"]

  rabbitmq:
    image: xxxxxx/service/security-hub/rabbitmq-amd64:3.11.2
    container_name: rabbitmq
    networks:
      - security-hub
    ports:
      - "5672:5672"
      - "15672:15672"
    restart: always
    volumes:
      - /data/common/rabbitmq/data:/var/lib/rabbitmq
      - /data/common/rabbitmq/config/rabbitmq.conf:/etc/rabbitmq/conf.d/10-defaults.conf
    command: >
      sh -c "rabbitmq-plugins enable --offline rabbitmq_management &&
             rabbitmq-server"

  xxl-job:
    image: docker.inspur.com:5000/rds-common/job-center:2.0.2-8
    container_name: job-center
    networks:
      - security-hub
    ports:
      - "8085:8085"
    restart: always
    volumes:
      - /data/common/job-center/application.properties:/usr/lib/config/application.properties
      - /data/common/job-center/logback.xml:/usr/lib/config/logback.xml

  elasticsearch:
    image: xxxxxx/service/lma/elasticsearch-amd64:7.17.23
    container_name: elasticsearch
    networks:
      - security-hub
    ports:
      - "9200:9200"
      - "9300:9300"
    restart: always
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=xxxx
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /data/common/elasticsearch/config:/usr/share/elasticsearch/config
      - /data/common/elasticsearch/data:/usr/share/elasticsearch/data


networks:
  security-hub:
    external: true

服务定义 (services:)
redis: 这是服务的名字,用于标识这个特定的服务配置。

配置项解释
image: 指定了要使用的 Docker 镜像。在这个例子中,镜像是从某个私有仓库拉取的 xxxxx/service/redis-amd64:7.0.2。这里的 xxxxx 应该替换为实际的仓库地址。

container_name: 设置容器启动后的名称为 redis。如果不指定,默认会生成一个基于项目和服务名的名称。

networks: 定义了容器将加入的网络。这里指定了一个自定义网络 security-hub,这有助于服务间通信和隔离。

volumes: 映射主机上的目录或文件到容器内,实现数据持久化或配置共享。
/data/common/redis/config/redis.conf:/etc/redis.conf: 将宿主机的 /data/common/redis/config/redis.conf 文件挂载到容器内的 /etc/redis.conf,允许通过修改宿主机上的配置文件来影响容器内的Redis配置。
/data/common/redis/data:/data: 将宿主机的 /data/common/redis/data 目录挂载到容器内的 /data,确保Redis的数据可以持久保存在宿主机上。

ports: 端口映射,格式为 “host_port:container_port”。此处将宿主机的 6379 端口映射到容器内的 6379 端口,使得外部可以通过访问宿主机的 6379 端口来与Redis交互。

restart: 设置重启策略。always 表示无论容器退出代码是什么,Docker都会尝试重新启动容器。

command: 覆盖默认的容器启动命令。这里是告诉容器以特定的方式启动Redis服务器:
[“redis-server”, “/etc/redis.conf”, “–requirepass”, “xxxx”]
redis-server: 启动Redis服务器的命令。
/etc/redis.conf: 指定配置文件的位置。
–requirepass xxxxx: 设置Redis的密码为 xxxxx,这样客户端连接时需要提供此密码进行身份验证。

environment: 设置环境变量,这些变量会影响容器内应用的行为。
discovery.type=single-node: 指定这是一个单节点的Elasticsearch实例,不需要与其他节点组成集群。
bootstrap.memory_lock=true: 锁住内存,防止交换(swap),这对于性能非常重要。
ES_JAVA_OPTS=-Xms512m -Xmx512m: 设置JVM堆大小,最小和最大均为512MB。调整这些值以适应您的硬件资源。
xpack.security.enabled=true: 启用X-Pack安全特性,包括加密、认证等。
ELASTIC_PASSWORD=xxxx: 设置默认用户的密码(通常是elastic用户)。请确保将xxxx替换为一个强密码。

ulimits: 设置容器的资源限制。
memlock: 设置内存锁定限制。soft: -1 和 hard: -1 表示没有限制,允许Elasticsearch进程锁住物理内存,避免被操作系统交换出去。

启动服务

保存上述配置到名为 docker-compose.yml 的文件中后,在该文件所在的目录下运行以下命令以启动所有服务:

docker-compose up -d

-d 参数表示后台运行容器。如果您想要前台运行以便实时查看日志输出,可以省略 -d。

停止并删除所有服务,可以使用:

docker-compose down

http://www.kler.cn/a/552712.html

相关文章:

  • Leetcode刷题面试2025
  • fastapi+vue实现按钮级别的权限控制
  • 深入理解同步与异步I/O:从原理到实战
  • SQL知识体系
  • DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路
  • 【全栈】SprintBoot+vue3迷你商城-细节解析(2):分页
  • (9/100)每日小游戏平台系列
  • 论文阅读4——一种宽频带圆极化微带天线的设计
  • uniapp开发H5套壳APP谷歌账号登录报错403
  • Vue 项目中逐步引入 TypeScript 的类型检查
  • idea-gradle打包运行配置
  • 如何运用DeepSeek R1构建一款全栈简历筛选应用
  • MybaitsPlus学习笔记(二)基本CURD
  • 针对Feign客户端请求体参数处理问题
  • 第 17 天:HUD 世界 UI 显示!
  • MySQL——数据库约束
  • 深度学习04 数据增强、调整学习率
  • Redis哈希槽机制的实现
  • 网络安全推荐的视频教程 网络安全系列
  • Flutter 学习大纲