为什么需要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插件目录即可,参考上个节点。
常用命令
生命周期管理
调试与监控
配置管理
数据管理
配置示例
就拿 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服务