概要
docker-compose 可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序。
docker-compose 中的 depends_on 配置是容器的启动顺序, 并不是容器中服务的启动顺序.
环境清理
在做实验的时候,我在很多地方都定义了这些容器,为了不受之前启动过的容器和镜像的影响。在本次实验之前,做一下环境的清理。
删除所有容器
docker rm -f $(docker ps -qa)
删除所有镜像
docker rmi -f $(docker images -qa)
项目改造前
情况描述
docker-compose.yml 中定义了2个服务,但这里只能定义到服务容器的启动顺序。通常来说这种方式无法满足我们严格的顺序启动要求。比如说,我们需要等待 mysql 服务完成启动完毕后,再启动 nacos。
虽然这2个服务都启动了,但 nacos启动报错了。也就是说我们无法登陆nacos 页面,具体如图:
项目改造
安装依赖
yum -y install nc
编写脚本
在项目的根目录下创建脚本文件,并赋予执行权限
vim ep.sh
chmod +x ep.sh
其脚本内容:
#!/bin/bash
#set -x
#******************************************************************************
# @file : ep.sh
# @author : liangcy02
# @date : 2018-08- 1 10:18:43
#
# @brief : entry point for manage service start order
# history : init
#******************************************************************************
: ${SLEEP_SECOND:=2}
wait_for() {
echo Waiting for $1 to listen on $2...
while ! nc -z $1 $2; do echo waiting...; sleep $SLEEP_SECOND; done
}
declare DEPENDS
declare CMD
while getopts "d:c:" arg
do
case $arg in
d)
DEPENDS=$OPTARG
;;
c)
CMD=$OPTARG
;;
?)
echo "unkonw argument"
exit 1
;;
esac
done
for var in ${DEPENDS//,/ }
do
host=${var%:*}
port=${var#*:}
wait_for $host $port
done
eval $CMD
测试脚本
测试 mysql
./ep.sh -d 192.168.3.18:3306 -c 'echo "start mysql service here"'
参数说明: -d 后面跟着 ip地址:端口号 -c 监听到端口启动后,需要执行的命令 这里的测试,就是说监听3.18 的3306端口,如果端口启动了,那就 打印输出 start mysql service here
测试 nacos
./ep.sh -d 192.168.3.18:8848 -c 'echo "start nacos service here"'
编写 docker-compose.yml
关键点
思考问题
我们编写的脚本中 -c 后面要跟启动 服务的命令,但为什么是 bin/docker-startup.sh 这个命令?
答案
因为 entrypoint 指令会覆盖原来Dockerfile 文件的最后一条 entrypoint 指令,关键是这一条指令一般都是启动我们的服务的指令。那这条指令我们怎么找?
①、打开 nacos-docker 在github上的地址:https://github.com/nacos-group/nacos-docker
②、找到 Dockerfile 文件
③、Dockerfile 文件最后一条 entrypoint 指令
具体详细内容
version : '3.8'
services:
ruoyi-nacos:
container_name: ruoyi-nacos
image: nacos/nacos-server
build:
context: ./nacos
environment:
- MODE=standalone
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
- ./ep.sh:/ep.sh
entrypoint: /ep.sh -d ruoyi-mysql:3306 -c 'bin/docker-startup.sh';
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
depends_on:
- ruoyi-mysql
ruoyi-mysql:
container_name: ruoyi-mysql
image: mysql:5.7
build:
context: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
command: [
'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_ROOT_PASSWORD: password
MySQL和Nacos镜像
启动镜像
docker-compose up