cxl
Published on 2025-04-14 / 18 Visits
0
0

Docker Compose:从零到实战编排多容器应用

为什么需要Docker Compose

在微服务架构中,一个应用往往需要数据库、缓存服务、Web服务器等多个容器协同工作。传统方式需手动执行多条docker run命令,不仅效率低下,还容易出错。Docker Compose通过声明式YAML配置文件实现:

  • 一键启停​:单条命令管理所有容器生命周期

  • 环境一致性​:开发、测试、生产环境配置统一

  • 依赖管理​:自动处理服务启动顺序与网络通信 ​配置集中化​:所有服务参数集中在一个文件,便于版本控制

  • 集成 CI/CD 流水线

快速安装与环境搭建

应用docker插件为全局命令

使用docker-compose的前提是已经安装了docker,未安装可以参考 docker安装,有些docker在安装时已经默认安装compose插件了,可以通过 docker compose version 命令查看是否已安装此时看到已经安装了compose插件,但是输入 docker-compose version 时却提示未找到该命令,提示要安装,或者后续直接以插件命令形式使用,即可忽略下面的内容这时候只要把compose插件新建一个软链接到当前用户的bin目录下就可以全局使用了,首先查出docker安装的对应目录,在其目录下有个插件目录,compose插件就在其中,接着创建软链接到 /usr/bin 目录下

下载文件安装

查看docker-compose 版本列表页面,选择合适的版本,然后直接下载,也可直接在命令直接执行,这里以 v2.35.0版本为例

  #安装docker-compose
  curl -L https://hub.gitmirror.com/https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose
  #授予执行权限
  chmod +x /usr/bin/docker-compose
  #验证 docker-compose 是否安装成功
  docker-compose -v

如果希望以docker插件方式如 docker compose version 形式访问,则将 docker-compose文件移到 docker插件目录即可,参考上个节点。

常用命令

生命周期管理

命令

参数

说明

示例

up

-f # 指定配置文件,否则默认文件名docker-compose.yml,可执行多个此参数以实现多环境目的

-d # 后台运行
--build # 重新构建,需配合Dockerfile一起食用
--force-recreate # 强制构建

启动服务

docker-compose up -d -f app.yml -f app-dev.yml

docker-compose up -d --build

docker-compose -p mall-admin up -d # 只启动配置文件中的mall-admin项目

down

-v # 删除对应卷数据
--rmi # 删除指定资源

停止并删除

docker-compose down -v --rmi all #清理所有容器、数据、镜像,生产环境勿用!!!

restart

[service] # 按服务名重启指定服务

重启服务

docker-compose restart app

调试与监控

命令

参数

说明

示例

logs

-f # 持续跟踪日志输出(类似tail -f)
--tail # 从日志末尾开始显示行数

查看日志

docker-compose logs -f --tail=100 app

exec

-it # 与docker一致

进入容器

docker-compose exec -it app sh

ps

-a # all的意思,与docker一致

查看状态

docker-compose ps -a

docker compose -f docker-compose-env.yml -p kibana ps

#查看docker-compose-env.yml配置文件中项目kibana的运行情况

配置管理

命令

说明

示例

config

验证配置文件

docker-compose config

docker-compose config --services # 查看服务依赖图

pull

拉取最新镜像

docker-compose pull mongo

run

单次运行命令

docker-compose run app mvn test

数据管理

命令

说明

示例

volume ls

查看数据卷

docker volume ls

volume inspect

检查数据卷

docker volume inspect mysql_data

配置示例

就拿 macrozheng.com微服务中间件环境与应用环境来学习一下:

  version: '3'
  services:
    mysql:
      image: mysql:5.7
      container_name: mysql
      command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      restart: always
      environment:
        MYSQL_ROOT_PASSWORD: root #设置root帐号密码
      ports:
        - 3306:3306
      volumes:
        - /mydata/mysql/data/db:/var/lib/mysql #数据文件挂载
        - /mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载
        - /mydata/mysql/log:/var/log/mysql #日志文件挂载
    redis:
      image: redis:7
      container_name: redis
      command: redis-server --appendonly yes
      volumes:
        - /mydata/redis/data:/data #数据文件挂载
      ports:
        - 6379:6379
    nginx:
      image: nginx:1.22
      container_name: nginx
      volumes:
        - /mydata/nginx/conf:/etc/nginx #配置文件挂载
        - /mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
        - /mydata/nginx/log:/var/log/nginx #日志文件挂载
      ports:
        - 80:80
    rabbitmq:
      image: rabbitmq:3.9-management
      container_name: rabbitmq
      volumes:
        - /mydata/rabbitmq/data:/var/lib/rabbitmq #数据文件挂载
        - /mydata/rabbitmq/log:/var/log/rabbitmq #日志文件挂载
      ports:
        - 5672:5672
        - 15672:15672
    elasticsearch:
      image: elasticsearch:7.17.3
      container_name: elasticsearch
      user: root
      environment:
        - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
        - "discovery.type=single-node" #以单一节点模式启动
        - "ES_JAVA_OPTS=-Xms512m -Xmx1024m" #设置使用jvm内存大小
      volumes:
        - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
        - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
      ports:
        - 9200:9200
        - 9300:9300
    logstash:
      image: logstash:7.17.3
      container_name: logstash
      environment:
        - TZ=Asia/Shanghai
      volumes:
        - /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
      depends_on:
        - elasticsearch #kibana在elasticsearch启动之后再启动
      links:
        - elasticsearch:es #可以用es这个域名访问elasticsearch服务
      ports:
        - 4560:4560
        - 4561:4561
        - 4562:4562
        - 4563:4563
    kibana:
      image: kibana:7.17.3
      container_name: kibana
      links:
        - elasticsearch:es #可以用es这个域名访问elasticsearch服务
      depends_on:
        - elasticsearch #kibana在elasticsearch启动之后再启动
      environment:
        - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
      ports:
        - 5601:5601
    mongo:
      image: mongo:4
      container_name: mongo
      volumes:
        - /mydata/mongo/db:/data/db #数据文件挂载
      ports:
        - 27017:27017
    nacos-registry:
      image: nacos/nacos-server:v2.1.0
      container_name: nacos-registry
      environment:
        - "MODE=standalone"
      ports:
        - 8848:8848

接下来是应用配置文件,主要要注意对上面中间件的引用

  version: '3'
  services:
    mall-admin:
      image: mall/mall-admin:1.0-SNAPSHOT
      container_name: mall-admin
      ports:
        - 8080:8080
      volumes:
        - /mydata/app/mall-admin/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - mysql:db #可以用db这个域名访问mysql服务
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务
    mall-search:
      image: mall/mall-search:1.0-SNAPSHOT
      container_name: mall-search
      ports:
        - 8081:8081
      volumes:
        - /mydata/app/mall-search/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        - mysql:db #可以用db这个域名访问mysql服务
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务
    mall-portal:
      image: mall/mall-portal:1.0-SNAPSHOT
      container_name: mall-portal
      ports:
        - 8085:8085
      volumes:
        - /mydata/app/mall-portal/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - redis:redis #可以用redis这个域名访问redis服务
        - mongo:mongo #可以用mongo这个域名访问mongo服务
        - mysql:db #可以用db这个域名访问mysql服务
        - rabbitmq:rabbit #可以用rabbit这个域名访问rabbitmq服务
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务
    mall-auth:
      image: mall/mall-auth:1.0-SNAPSHOT
      container_name: mall-auth
      ports:
        - 8401:8401
      volumes:
        - /mydata/app/mall-auth/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务
    mall-gateway:
      image: mall/mall-gateway:1.0-SNAPSHOT
      container_name: mall-gateway
      ports:
        - 8201:8201
      volumes:
        - /mydata/app/mall-gateway/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - redis:redis #可以用redis这个域名访问redis服务
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务
    mall-monitor:
      image: mall/mall-monitor:1.0-SNAPSHOT
      container_name: mall-monitor
      ports:
        - 8101:8101
      volumes:
        - /mydata/app/mall-monitor/logs:/var/logs
        - /etc/localtime:/etc/localtime
      environment:
        - 'TZ="Asia/Shanghai"'
      external_links:
        - nacos-registry:nacos-registry #可以用nacos-registry这个域名访问nacos服务


Comment