通过docker-compose可以很方便的组织相关服务,方便的进行服务构建和运行。
现在通过版本演变的方式,让我们看看如何搭建可配置型的环境。
新建docker-compose文件,第一个版本大概类型如下
version: "3" # 指定 docker-compose.yml 文件的写法格式
services: # 用来表示compose需要启动的服务
redis: # 自定义服务名
image: redis:6.0.8-alpine # 指定服务所使用的镜像
container_name: env-redis # docker容器实例名称
restart: always # 配置重启,表示如果服务启动不成功会一直尝试
privileged: true # 特权模式,修改系统变量
environment: # 环境变量定义
- author=ucucs
ports: # 端口映射,外部访问的端口 不同端口可以如此配置 6379:6380,单独写代表随机端口
- "6379:6379"
networks: # 网络网段定义
- frontend
volumes: # 加载本地目录下的配置文件到容器目标地址下
- ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./data/redis/:/data/
- ./log/redis/:/var/log/redis/
command: # 表示以这个命令来启动服务
/bin/sh -c "echo 65535 > /proc/sys/net/core/somaxconn
&& echo never > /sys/kernel/mm/transparent_hugepage/enabled
&& echo never > /sys/kernel/mm/transparent_hugepage/defrag
&& redis-server /usr/local/etc/redis/redis.conf --appendonly yes"
deploy: # 需要用命令才生效 docker stack deploy --compose-file docker-compose.yml
replicas: 1 # 部署副本数量
update_config: # 升级回滚控制
parallelism: 2 # 服务中多个容器同时更新数量
delay: 10s # 设置每组容器更新之间的延迟时间
restart_policy: # 设置何时重启容器
condition: on-failure # 设置重启策略的条件
networks: # 网络定义
frontend: # 网络命名
driver: bridge # 定义网络模式,默认时可忽略 bridge(默认) host none service:[service name] container:[container name/id]
如何让服务进行启动和停止呢
# 服务启动
docker-compose up
# 如果需要让服务在后台运行
docker-compose up -d
# 服务停止
docker-compose stop
# 查看服务运行情况
docker-compose ps
# docker-compose的原理只是让我们以配置的方式组装docker运行命令
如果一个服务想变成可配置的,例如配置文件,密码,环境变量等,我们引入.env文件,作为配置。
# define env var default value.
AUTHOR=ucucs
VERSION=1.0.0
# Redis env
REDIS_IMAGE_TAG=6.0.8-alpine
REDIS_DATA=./data/redis/
REDIS_CNF=./config/redis/redis.conf
REDIS_LOG=./log/redis/
REDIS_PORT=6379
REDIS_CONTAINER_NAME=redis
#使用.env文件进行配置
#compose里格式如下,设置默认值 -后面加的是默认值,如果不设置默认值,则都可以是空
#环境变量${VARIABLE:-default}引用
现在我们来看看新版本的docker-compose.yml是什么样子
version: "3.8" # 指定 docker-compose.yml 文件的写法格式
services: # 用来表示compose需要启动的服务 本文件从.env文件读取变量
redis: # 自定义服务名
image: redis:${REDIS_IMAGE_TAG:-6.0.8-alpine} # 指定服务所使用的镜像
container_name: ${REDIS_CONTAINER_NAME:-redis} # docker容器实例名称
restart: always # 配置重启,表示如果服务启动不成功会一直尝试
privileged: true # 特权模式,修改系统变量
environment: # 环境变量定义
- author=${AUTHOR:-ucucs}
ports: # 端口映射,外部访问的端口 不同端口可以如此配置 6379:6380,单独写代表随机端口
- ${REDIS_PORT:-6379}:6379
networks: # 网络网段定义
- frontend
volumes: # 加载本地目录下的配置文件到容器目标地址下
- ${REDIS_CNF:-./config/redis/redis.conf}:/usr/local/etc/redis/redis.conf
- ${REDIS_DATA:-./data/redis/}:/data/
- ${REDIS_LOG:-./log/redis/}:/var/log/redis/
command: # 表示以这个命令来启动服务
/bin/sh -c "echo 65535 > /proc/sys/net/core/somaxconn
&& echo never > /sys/kernel/mm/transparent_hugepage/enabled
&& echo never > /sys/kernel/mm/transparent_hugepage/defrag
&& redis-server /usr/local/etc/redis/redis.conf"
networks: # 网络定义
frontend: # 网络命名
driver: bridge # 定义网络模式,默认时可忽略 bridge(默认) host none service:[service name] container:[container name/id]
注意,command命令里包括对redis警告的修复
为了能够让redis外部访问,以及安全加固,需要对redis配置文件进行修改
#注释该语句,方便外部访问
#bind 127.0.0.1
# 关闭保护模式
protected-mode no
# 以配置文件启动,不需要守护进程
daemonize no
# 日志级别
loglevel notice
# 日志文件路径
logfile /var/log/redis/redis.log
# 访问授权密码设置
requirepass ucucs
# AOF持久化配置
appendonly yes
# 主要对以上几个关键字进行配置修改,具体配置文件可查看链接
为了查看配置的.env文件最终的效果,可以执行以下命令查看
# 执行命令
docker-compose config
# 效果
networks:
frontend:
driver: bridge
services:
redis:
command: /bin/sh -c "echo 65535 > /proc/sys/net/core/somaxconn && echo never >
/sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag
&& redis-server /usr/local/etc/redis/redis.conf"
container_name: redis
environment:
author: ucucs
image: redis:6.0.8-alpine
networks:
frontend: null
ports:
- published: 6379
target: 6379
privileged: true
restart: always
volumes:
- /data/github/docker-nginx-mysql-springboot/docker-build/config/redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
- /data/github/docker-nginx-mysql-springboot/docker-build/data/redis:/data:rw
- /data/github/docker-nginx-mysql-springboot/docker-build/log/redis:/var/log/redis:rw
version: '3.8'
项目完整地址