多容器应用实例
services:
app:
#getstart:net-mysql是根据docker文档中的一个例子自己重新构建的镜像,因为这个镜像总是需要很多的依赖,每次运行都因为各种原因卡住不动,所以我在一次成功运行后,用docker commit提交了一个新版本镜像。虽然这个镜像比官方的大很多,不过不会出现每次都因为解决依赖问题等几个小时。
image: getstart:net-mysql
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
#这里的“-”表示这个值是个数组,也就是这里可以写多行,每行都以“-”开头。
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
depends_on:
mysql:
condition: service_healthy
#如上面解释“-”一样,这里也可以是字典(键-值对),mysql就是“键”,而“condition: service_healthy”就是“值”,这里也可以写成上面的数组形式,不过就没办法写condition了。这里的意思是“该镜像的启动依赖于mysql镜像启动的健康检查是否成功,在其成功后启动该镜像”
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
healthcheck:
#这里是健康检查,test周期执行命令“mysqladmin ping -h localhost”,执行成功了,healthcheck就代表成功了,上面condition的条件就达成了。
test: ["CMD","mysqladmin","ping","-h","localhost"]
interval: 10s
timeout: 5s
retries: 3
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
external: true
PS1:该格式的缩进很重要,我起初以为volumes是mysql镜像里面的成员,结果用了缩进,后来排查了很久才发现volumes是顶级缩进和services是同一级别。其它缩进也是一样,弄错了docker compose就读不出来。
PS2:还有一个就是docker compose是有两个版本的,一个是docker-compose工具,还有一个是”docker compose”命令,compose工具是要单独安装的,他们的功能差不多,但是也有略微不同(网上是这么说的,我没研究有什么不同,也没去安装),而docker compose命令是docker的子命令。在启动compose文件时,要使用docker compose -f xxxx.yml up -d。相应的还有docker compose -f xxxx.yml down、docker compose -f xxxx.yml logs、docker compose -f xxxx.yml ps等等。