当前位置:首页 > 技术分析 > 正文内容

Docker部署MySQL、Redis、Kafka、ES、Kibana

ruisui8818小时前技术分析1

Docker

Docker的基础概念和安装就不多讲了,参考官网学习就行。

https://www.docker.com/

https://docs.docker.com/engine/install/

镜像仓库

https://hub.docker.com/explore

https://hub.docker.com/search?badges=official

hub.docker已经提供了非常多的镜像,一般情况来讲使用官方镜像就好了。

如:
https://hub.docker.com/_/mysql

官方写的也相当明白,如何使用镜像,运行容器可以配置那些参数,日志等

还包括进入容器执行命名、查看文件等等

Docker Compose

Docker Compose 相较于单独使用 docker run 命令有很多优势,特别是在管理多容器应用时。

1. 简化复杂环境的配置

  • 多容器管理:当您的应用程序由多个服务组成(如前端、后端、数据库等),使用 docker run 需要为每个服务单独启动容器,并手动配置它们之间的网络和依赖关系。而 Docker Compose 可以通过一个简单的 docker-compose.yml 文件定义所有服务及其配置。
  • 统一配置文件:所有服务的配置都集中在一个 YAML 文件中,易于阅读和维护。

2. 自动化服务依赖

  • 自动处理依赖:在 docker-compose.yml 中可以指定服务之间的依赖关系。例如,您可以设置 MySQL 服务必须在应用服务之前启动。Docker Compose 会确保这些依赖关系得到满足。
  • 重启策略:可以定义重启策略来保证服务的高可用性,比如某个服务失败后自动重启。

3. 网络配置简化

  • 内置网络管理:Docker Compose 自动创建一个默认网络供所有服务使用,使得容器间通信变得非常简单。您不需要手动创建和管理网络。
  • 自定义网络:虽然可以手动创建网络并在 docker run 中指定,但 Docker Compose 提供了更简洁的方式来自定义网络。

4. 环境变量管理

  • .env 文件支持:Docker Compose 支持从 .env 文件加载环境变量,这使得管理和切换不同环境下的配置更加容易。
  • 环境变量文件:还可以通过 env_file 指令引用外部环境变量文件,进一步增强灵活性。

5. 卷和绑定挂载的便捷配置

  • 持久化存储:在 Docker Compose 文件中,可以通过简单的声明来配置卷或绑定挂载,从而轻松实现数据持久化。
  • 一致的开发与生产环境:可以在不同环境中复用相同的配置,只需调整少量参数即可适应不同的部署场景。

6. 命令行简化

  • 单命令操作多个容器:使用 docker-compose up 即可一次性启动所有定义的服务,而无需分别执行 docker run 命令。
  • 便捷的生命周期管理:除了启动服务外,还可以使用 docker-compose down 来停止并移除所有相关容器、网络和卷。

7. 版本控制友好

  • YAML 格式便于版本控制:将 docker-compose.yml 文件纳入版本控制系统(如 Git)中,便于团队协作和历史记录追踪。
  • 回滚方便:如果需要恢复到之前的配置版本,只需切换到相应的分支或标签即可。

8. 扩展性和伸缩性

  • 轻松扩展服务实例数:通过 docker-compose scale 或者在 docker-compose.yml 中定义 deploy 部分,可以轻松地增加或减少服务实例的数量。
  • 负载均衡:对于Web应用等场景,Docker Compose 能够结合 Docker Swarm 实现负载均衡。

示例对比

假设我们要部署一个包含 MySQL 和 Redis 的应用:

使用 docker run

# 启动 MySQL 容器
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动 Redis 容器
docker run --name some-redis -d redis:alpine

使用 Docker Compose

version: '3'
services:
  db:
    image: mysql:tag
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
  redis:
    image: redis:alpine

只需运行 docker-compose up -d 即可同时启动这两个服务,并且它们之间能够自动发现对方(如果在同一网络下)。

Docker Compose 提供了一种更为高效、灵活的方式来管理和部署复杂的多容器应用,特别适合开发、测试以及小规模生产环境中的快速部署需求。

示例Compose

https://github.com/wnhyang/coolGuard

也是此项目的部署方式

.env

mysql_root_password=mysql_password
mysql_database=mysql_database
mysql_user=mysql_user
mysql_password=mysql_password
redis_password=redis_password
elasticsearch_password=elasticsearch_password
kibana_password=kibana_password
kibana_url=http://localhost:5601
coolguard_image=coolguard_image

docker-compose.yml

services:
  mysql:
    image: mysql:8.0.36
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_HOST: 'localhost'
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: ${mysql_root_password}
      MYSQL_DATABASE: ${mysql_database}
      MYSQL_USER: ${mysql_user}
      MYSQL_PASSWORD: ${mysql_password}
    networks:
      - custom_network

  redis:
    image: redis:7.2.7-alpine
    container_name: redis
    command: redis-server --requirepass ${redis_password}
    volumes:
      - redisdata:/data
    ports:
      - "6379:6379"
    environment:
      TZ: Asia/Shanghai
    networks:
      - custom_network

  kafka:
    image: apache/kafka:3.7.0
    container_name: kafka
    volumes:
      - kafkadata:/var/lib/kafka/data
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_METADATA_LOG_REPLICATION_FACTOR: 1
      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3
      TZ: Asia/Shanghai
    networks:
      - custom_network

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.3
    container_name: elasticsearch
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xms1g -Xmx1g"
      discovery.type: single-node
      ELASTIC_PASSWORD: ${elasticsearch_password}
      xpack.security.enabled: "true"
      xpack.security.http.ssl.enabled: "false"
      xpack.security.transport.ssl.enabled: "false"
      TZ: Asia/Shanghai
    networks:
      - custom_network

  kibana:
    depends_on:
      - elasticsearch
    image: docker.elastic.co/kibana/kibana:8.17.3
    container_name: kibana
    volumes:
      - kibanadata:/usr/share/kibana/data
    ports:
      - "5601:5601"
    environment:
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200
      ELASTICSEARCH_USERNAME: kibana
      ELASTICSEARCH_PASSWORD: ${kibana_password}
      SERVER_PUBLICBASEURL: ${kibana_url}
      XPACK_SECURITY_ENABLED: "true"
      XPACK_SECURITY_HTTP_SSL_ENABLED: "false"
      TZ: Asia/Shanghai
    networks:
      - custom_network
  coolguard:
    image: ${coolguard_image}
    container_name: coolguard
    volumes:
      - /docker/coolguard/logs:/coolguard/logs
    ports:
      - "8081:8081"
    environment:
      - "SPRING_PROFILES_ACTIVE=demo"
    networks:
      - custom_network

volumes:
  mysqldata:
    driver: local
  redisdata:
    driver: local
  kafkadata:
    driver: local
  esdata:
    driver: local
  kibanadata:
    driver: local

networks:
  custom_network:
    driver: bridge

运行

在docker-compose.yml同目录执行

# 单独运行
docker compose up -d <service_name>
# 一起运行
docker compose up -d

或指定

  • -f 参数 指定 docker-compose.yml 文件的路径
  • -p 参数 指定项目名,默认不指定时使用当前目录名作为项目的名称
docker-compose -f /home/user/projects/myapp/docker-compose.yml -p myapp up -d mysql redis

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4051.html

分享给朋友:

“Docker部署MySQL、Redis、Kafka、ES、Kibana” 的相关文章

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。那么组件间如何通信,也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信。转载链接:https://www.jia...

vue中如何在自定义组件上使用v-model和.sync

自定义事件tips推荐始终使用 kebab-case 的事件名。(v-on会将事件名自动转换为小写,避免匹配不到)changeData ×change-data √自定义组件的v-model用法:父组件定义数据源(不需要定义修改数据的方法),在子组件标签上通过v-model="data...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

一套代码,多端运行——使用Vue3开发兼容多平台的小程序

介绍Vue3发布已经有一段时间了,从目前来看,其生态还算可以,也已经有了各种组件库给予了支持,但是不管是Vue3还是Vue2都无法直接用来开发小程序,因此国内一些技术团队针对Vue开发了一些多端兼容运行的开发框架,今天来体验一下使用Taro来体验一下使用Vue3开发多平台运行的小程序,以便于兼容各大...

微信外H5跳转小程序——组件(vue项目)

场景有个H5(vue项目),需要实现点击商品item跳转到小程序,微信内和微信外都要支持,这里我们只介绍一下H5在微信外的跳转。如图所示,红框内是一个商品,就是点击这里,要跳转小程序:配置微信小程序云开发(云函数)1、开通云开发然后选择免费额度2、云开发权限设置找到权限设置,把这里的「未登录用户访问...

快来看看重构了 365 天的 vue3.5 这次到底更新了啥

新人求关注?,点击右上角 ↗? 关注,博主日更,全年无休,您的关注是我的最大的更新的动力~ 感谢大家了 就在 9 月 1 号,迭代了一年多的 Vue 3.5 终于发布了,这次发布的代号是 "天元突破 红莲螺岩"。这是一个机器人动画片的名字,相信喜欢看动漫的小伙伴应该很熟悉从更新的 C...