Docker-Compose 简介、实战
简介
Docker Compose是一个用于定义和运行多个Docker容器的工具,它使用YAML文件来定义应用程序的服务、网络和卷配置。它使得在多个容器之间建立依赖关系、调整容器参数和配置变得更加容易。
原理
Docker Compose的原理是基于Docker技术,它允许用户通过一个单一的Compose文件来定义多个容器,然后使用docker-compose
命令将这些容器一起启动。Compose文件中包含了容器的配置、依赖关系、网络设置和卷挂载等信息。Docker Compose会根据Compose文件的定义,使用Docker引擎来创建和启动容器,并确保它们能够相互通信。
作用
Docker Compose的主要作用包括:
-
定义多个容器的配置:通过Compose文件,您可以定义多个容器的镜像、环境变量、端口映射、卷挂载等配置信息。
-
管理容器之间的依赖关系:您可以指定容器之间的依赖关系,确保容器按照正确的顺序启动。
-
管理多个容器的生命周期:使用
docker-compose
命令,您可以方便地启动、停止、重启和删除整个应用程序。 -
简化部署流程:Compose文件可以被版本控制,使得部署变得更加可靠和可重复。
步骤
使用Docker Compose的基本步骤如下:
-
安装Docker和Docker Compose:确保您的系统上已安装Docker和Docker Compose。
-
创建Compose文件:编写一个YAML格式的Compose文件,定义您的应用程序的服务、网络和卷。
-
启动容器:在Compose文件所在目录中运行
docker-compose up
命令,Docker Compose将会根据文件中的定义启动相关容器。 -
管理容器:使用
docker-compose
命令管理容器的生命周期,例如docker-compose stop
、docker-compose restart
、docker-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
- 感谢你赐予我前进的力量