文章的wait脚本素材会放在末尾
执行docker-compose.yml文件之后就有mysql的主服务器,还有从服务器,还有tomcat服务,在tomcat中部署一个crm项目,tomcat服务中我们添加了启动顺序,
# 启动顺序
depends_on:
- mysql-master
# 执行命令
command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"./ :表示执行某个命令
-t : 表示等待时间, 0 无限等待, 意思是我等待的服务没启动,就会等到台启动为止,如果不写-t的话默认是15秒,15秒我就收不到响应,文件继续执行后面的服务
mysql-master:3306:要等待的服务
--catalina.sh run :等待的服务给了响应之后就会执行这个文件
在tomcat服务器启动之后就会等待mysql服务器里面的3306给响应为止,只要给了响应就会执行catalina.sh让整个服务运行起来
为什么要设置启动顺序?
因为mysql的主从启动之后,我们的tomcat才能去执行,如果tomcat服务器先启动了,mysql还没有连接上数据库,那么tomcat就会报错的,tomcat服务里面的crm项目需要mysql服务连接数据库获取数据,
 但是这样设置也会有问题,  如果mysql容器一秒启动,但是mysql容器里面的服务要十秒启动,那么tomcat第二秒就去访问mysql的时候就会报错,
容器启动了,不代表里面的访问也启动了!
我们还需要通过脚本让tomcat去监听mysql的服务,tomcat监听到mysql的服务已经完全启动之后在去访问,就不会报错了
解决方案:docker官方推荐使用wait-for-it.sh脚本来解决问题
 什么是wait-for-it.sh?
 wait-for-it.sh脚本用来访问指定的地址和端口,如果收不到响应就等待一段时间再去重试,直到收到响应后,再去做前面指定好的命令
  command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"
  注意事项:注意如果你使用wait-for-it.sh脚本,如果你的基础镜像不包含bash命令(比如alpine镜像)需要安装bash,
我们就需要使用到wait
# 版本号
version: '3'
# 定义服务
services:
  # 服务名
  mysql-master:
    # 容器名称
    container_name: mysql-master
    # 镜像
    image: mysql/mysql-server:5.7
    # 重启
    restart: always
    # 提供伪终端
    tty: true
    # root具备管理员权限
    privileged: true
    # 环境变量
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    # 数据卷(目录映射)
    volumes:
      - /data/mysql-master/conf/my.cnf:/etc/my.cnf
      - /data/mysql-master/data:/var/lib/mysql
    # 网络
    networks:
      mynetwork:
        ipv4_address: 172.19.0.3
  # 服务名
  mysql-slave:
    # 容器名称
    container_name: mysql-slave
    # 镜像
    image: mysql/mysql-server:5.7
    # 重启
    restart: always
    # 提供伪终端
    tty: true
    # root具备管理员权限
    privileged: true
    # 环境变量
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    # 数据卷(目录映射)
    volumes:
      - /data/mysql-slave/conf/my.cnf:/etc/my.cnf
      - /data/mysql-slave/data:/var/lib/mysql
    # 网络
    networks:
      mynetwork:
        ipv4_address: 172.19.0.4
  # 服务名
  tomcat-0:
    # 容器名称
    container_name: tomcat-0
    # 镜像
    image: tomcat:8.5.40
    # 重启
    restart: always
    # 端口映射
    ports:
      - 8080:8080
    # 启动顺序
    depends_on:
      - mysql-master
    # 执行命令
    command: "./wait-for-it.sh -t 0 mysql-master:3306 -- catalina.sh run"
    # 提供伪终端
    tty: true
    # root具备管理员权限
    privileged: true
    # 环境变量
    environment:
      TZ: Asia/Shanghai
    # 数据卷(目录映射)
    volumes:
      - /data/tomcat/webapps:/usr/local/tomcat/webapps
    # 网络
    networks:
      mynetwork:
        ipv4_address: 172.19.0.5
# 定义所需要的网络
networks:
  mynetwork:
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16这是别人写的开源脚本

解压之后的结构目录
 
我们需要用到画红线的文件,我们使用rz上传wait-for-it.sh

上传之后我们还需要给它添加可执行权限
chmod 777 wait-for-it.s
给了它权限之后就变了颜色,就代表是可执行文件了
tomcat要用到wait脚本,我们还要创建一个自定义镜像,把wait脚本放到镜像里面去,每次创建的时候就会自带wait脚本
创建一个Dockerfile,
touch Dockerfile-mytomcat8.5.40
vi 把以下内容放在进去
#1.指定基础镜像,并且必须是第一条指令
FROM tomcat:8.5.40
#2.指明该镜像的作者和其电子邮件
MAINTAINER xyz "xyz@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/tomcat/bin
#4.将wait-for-it.sh复制到镜像中
COPY ./wait-for-it.sh /usr/local/tomcat/bin/
#5.容器启动后无法访问wait-for-it.sh,授权777即可
RUN chmod 777 ./wait-for-it.sh
使用以下命令开始构建
docker build -f Dockerfile-mytomcat8.5.40 -t mytomcat:8.5.40 .

docker images 查看镜像

启动docker-compose.yml
docker-compose up -d
使用docker logs -f tomcat-0 监听一下服务日志

tomcat 没有报错的
我们测试一下wait的作用
停止mysql的主服务器
然后我们去服务crm项目,报错了500,原因是连接不上数据库
 
在去看一下监听的tomcat服务的日志,也在报错
 
我们刚刚把mysql主服务器关闭了,我们现在重启一下tomcat服务看能不能正常启动
docker-compose restart tomcat-0 //重启
重启之后我们重新去监听一下日志,发现卡住了,意思是wait这个脚本在等待mysql主服务器的3306端口发来响应,然后运行。

现在我们启动mysql主服务器
docker-compose start mysql-master
回到日志一看,tomcat服务已经继续运行了

好啦 文章内容到这里就结束了 你学到了吗
觉得有用的记得关注点赞加收藏哦 我的Docker专栏还有其他关于Dokcer的技术点哦~
我敲BUG的Docker专栏:http://t.csdn.cn/ypXDz
  





















