简介

Docker Compose是一个用于定义和运行多个Docker容器的工具,它使用YAML文件来定义应用程序的服务、网络和卷配置。它使得在多个容器之间建立依赖关系、调整容器参数和配置变得更加容易。

原理

Docker Compose的原理是基于Docker技术,它允许用户通过一个单一的Compose文件来定义多个容器,然后使用docker-compose命令将这些容器一起启动。Compose文件中包含了容器的配置、依赖关系、网络设置和卷挂载等信息。Docker Compose会根据Compose文件的定义,使用Docker引擎来创建和启动容器,并确保它们能够相互通信。

作用

Docker Compose的主要作用包括:

  • 定义多个容器的配置:通过Compose文件,您可以定义多个容器的镜像、环境变量、端口映射、卷挂载等配置信息。

  • 管理容器之间的依赖关系:您可以指定容器之间的依赖关系,确保容器按照正确的顺序启动。

  • 管理多个容器的生命周期:使用docker-compose命令,您可以方便地启动、停止、重启和删除整个应用程序。

  • 简化部署流程:Compose文件可以被版本控制,使得部署变得更加可靠和可重复。

步骤

使用Docker Compose的基本步骤如下:

  1. 安装Docker和Docker Compose:确保您的系统上已安装Docker和Docker Compose。

  2. 创建Compose文件:编写一个YAML格式的Compose文件,定义您的应用程序的服务、网络和卷。

  3. 启动容器:在Compose文件所在目录中运行docker-compose up命令,Docker Compose将会根据文件中的定义启动相关容器。

  4. 管理容器:使用docker-compose命令管理容器的生命周期,例如docker-compose stopdocker-compose restartdocker-compose down等。

优劣势

优势

  • 简化开发环境配置: Docker Compose可以用于在开发环境中一键启动多个服务,减少了配置开发环境的复杂性。
  • 可重复性: Compose文件可以用于多个环境,确保开发、测试和生产环境之间的一致性。
  • 易于管理: 使用docker-compose命令集中管理多个容器,使得操作容器更加方便。
  • 便于扩展: 可以根据需要轻松扩展Compose文件以添加新的服务。

劣势

  • 不适合复杂应用: 对于非常复杂的多容器应用程序,Compose文件可能会变得复杂和难以维护。
  • 性能开销: 在生产环境中,Compose可能会带来一定的性能开销,因为它增加了容器之间的网络通信。
  • 有限的编排能力: Docker Compose是一个简单的编排工具,不适合大规模的容器编排需求,对于这种情况,通常会使用Kubernetes等更强大的工具。

实战示例代码演示

1. 配置docker-compose.yml

以下是SpringCloud微服务部署配置docker-compose.yml,其中包括MySQL,Nginx,Redis,微服务等相关配置。

version: '3.8'  # 使用的Docker Compose文件版本

services:  # 定义各个Docker服务

  # Nacos注册中心服务
  nacos:
    container_name: nacos  # 容器名称
    image: nacos/nacos-server  # 使用的Docker镜像
    build:
      context: ./nacos  # 构建上下文路径
    environment:
      - MODE=standalone  # 设置Nacos运行模式为独立模式
    volumes:
      - ./nacos/logs/:/home/nacos/logs  # 挂载Nacos日志目录
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties  # 挂载Nacos配置文件
    ports:
      - "8848:8848"  # 映射Nacos的8848端口到宿主机的8848端口
      - "9848:9848"  # 映射Nacos的9848端口到宿主机的9848端口
      - "9849:9849"  # 映射Nacos的9849端口到宿主机的9849端口
    depends_on:
      - mysql  # 依赖于mysql服务,等待mysql启动后再启动

  # MySQL数据库服务
  mysql:
    container_name: mysql  # 容器名称
    image: mysql:5.7  # 使用的Docker镜像
    build:
      context: ./mysql  # 构建上下文路径
    ports:
      - "3306:3306"  # 映射MySQL的3306端口到宿主机的3306端口
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d  # 挂载MySQL配置文件
      - ./mysql/logs:/logs  # 挂载MySQL日志目录
      - ./mysql/data:/var/lib/mysql  # 挂载MySQL数据目录
    command:  # 启动MySQL容器时执行的命令
      - 'mysqld'
      - '--innodb-buffer-pool-size=80M'
      - '--character-set-server=utf8mb4'
      - '--collation-server=utf8mb4_unicode_ci'
      - '--default-time-zone=+8:00'
      - '--lower-case-table-names=1'
    environment:
      MYSQL_DATABASE: 'ry-cloud'  # 设置MySQL数据库名称
      MYSQL_ROOT_PASSWORD: password  # 设置MySQL的root用户密码

  # Redis缓存服务
  redis:
    container_name: redis  # 容器名称
    image: redis  # 使用的Docker镜像
    build:
      context: ./redis  # 构建上下文路径
    ports:
      - "6379:6379"  # 映射Redis的6379端口到宿主机的6379端口
    volumes:
      - ./redis/conf/redis.conf:/home/wenxi/redis/redis.conf  # 挂载Redis配置文件
      - ./redis/data:/data  # 挂载Redis数据目录
    command: redis-server /home/wenxi/redis/redis.conf  # 启动Redis容器时执行的命令

  # Nginx反向代理服务
  nginx:
    container_name: nginx  # 容器名称
    image: nginx  # 使用的Docker镜像
    build:
      context: ./nginx  # 构建上下文路径
    ports:
      - "80:80"  # 映射Nginx的80端口到宿主机的80端口
    volumes:
      - ./nginx/html/dist:/home/wenxi/projects/ui  # 挂载Nginx静态文件目录
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf  # 挂载Nginx配置文件
      - ./nginx/logs:/var/log/nginx  # 挂载Nginx日志目录
      - ./nginx/conf.d:/etc/nginx/conf.d  # 挂载Nginx额外配置文件目录
    depends_on:
      - gateway  # 依赖于gateway服务,等待gateway启动后再启动
    links:
      - gateway  # 连接到gateway服务

  # Spring Cloud Gateway服务
  gateway:
    container_name: gateway  # 容器名称
    build:
      context: ./wenxi/gateway  # 构建gateway上下文路径
      dockerfile: dockerfile  # 使用的Dockerfile文件,此处具体dockerfile配置不细讲
    ports:
      - "8000:8000"  # 映射Spring Cloud Gateway的8000端口到宿主机的8000端口
    depends_on:
      - redis  # 依赖于redis服务,等待redis启动后再启动
    links:
      - redis  # 连接到redis服务

  # 认证服务
  auth:
    container_name: auth  # 容器名称
    build:
      context: ./wenxi/auth  # 构建auth上下文路径
      dockerfile: dockerfile  # 使用的Dockerfile文件,此处具体dockerfile配置不细讲
    ports:
      - "8001:8001"  # 映射认证服务的8001端口到宿主机的8001端口
    depends_on:
      - redis  # 依赖于redis服务,等待redis启动后再启动
    links:
      - redis  # 连接到redis服务

  # 系统模块服务
  modules-system:
    container_name: modules-system  # 容器名称
    build:
      context: ./wenxi/modules/system  # 构建modules-system上下文路径
      dockerfile: dockerfile  # 使用的Dockerfile文件,此处具体dockerfile配置不细讲
    ports:
      - "8002:8002"  # 映射系统模块服务的8002端口到宿主机的8002端口
    depends_on:
      - redis  # 依赖于redis服务,等待redis启动后再启动
      - mysql  # 依赖于mysql服务,等待mysql启动后再启动
    links:
      - redis  # 连接到redis服务
      - mysql  # 连接到mysql服务

2. 配置启动sh脚本

#!/bin/sh
# 使用说明,用来提示输入参数
usage() {
	echo "Usage: sh 执行脚本.sh [port|base|modules|stop|rm]"
	exit 1
}

# 开启所需端口
port(){
	# 开放Nginx 80端口
	firewall-cmd --add-port=80/tcp --permanent 
	# 开放Nacos 8848、9848、9849端口
	firewall-cmd --add-port=8848/tcp --permanent
	firewall-cmd --add-port=9848/tcp --permanent
	firewall-cmd --add-port=9849/tcp --permanent
	# 开放Redis 6379端口
	firewall-cmd --add-port=6379/tcp --permanent
	# 开放Mysql 3306端口
	firewall-cmd --add-port=3306/tcp --permanent

	# 开放各个服务端口
	# 开放gateway 8000
	firewall-cmd --add-port=8000/tcp --permanent
	# 开放auth 8001
	firewall-cmd --add-port=8001/tcp --permanent
	# 开放System 8002
	firewall-cmd --add-port=8002/tcp --permanent

	# 配置重启立即生效
	service firewalld restart
}

# 启动基础环境
base(){
	docker-compose up -d mysql redis nacos
}

# 启动微服务模块
modules(){
	docker-compose up -d nginx gateway auth modules-system
}

# 关闭所有环境/模块
stop(){
	docker-compose stop
}

# 删除所有环境/模块
rm(){
	docker-compose rm
}

# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
	port
;;
"base")
	base
;;
"modules")
	modules
;;
"stop")
	stop
;;
"rm")
	rm
;;
*)
	usage
;;
esac