docker-compose.yml文件模版介绍
模板文件是使用 Compose
的核心,涉及到的指令关键字也比较多。默认的模板文件名称为 docker-compose.yml
,格式为 YAML 格式。
version: "3" services: webapp: image: mysql ports: - "80:80" volumes: - "/data"
YAML文件中的image代表使用Docker仓库中已经存在的镜像,我们之前使用都需要先构建一个镜像,然后在文件里面指定这个镜像才可以运行。
这样比较麻烦,有一个命令比较方便
Build
表示:通过Docker-compose在启动容器之前根据dockerfile构建镜像,然后根据镜像启动容器
version: '3' services: webapp: build: ./dir
使用 context
指令指定 Dockerfile
所在文件夹的路径
使用 dockerfile
指令指定 Dockerfile
文件名,如果不指定文件名默认就是寻找Dockerfile
command
覆盖容器启动后默认执行的命令
command: echo "hello world"
container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号
这样的格式
container_name: mysqltest
不推荐使用
depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 mysql再启动 tomcat
version: '3' services: web: build: ./ depends_on: - mysql - tomcat tomcat: image: tomcat01 mysql: image: mysql01
web服务会等待mysql、tomcat服务启动的差不多了再启动,不会等到被依赖服务完全启动再启动
environment
设置环境变量。可以使用数组或字典两种格式
env_file
跟environment作用类似,也是设置环境变量,不过这个是指定文件的形式
env_file: .env env_file: - ./common.env #文件的路径 - ./apps/web.env - /opt/secrets.env
相比environment把环境比阿里直接写在yaml中安全一点
expose
暴露端口
本来在Dockerfile中暴露端口,这个命令意思可以不用在Dockerfile中填写端口,一般不用
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose
将会尝试拉取这个镜像,相当于docker run images(镜像名)
networks
用来指定启动的容器使用的网桥(网络),相当于docker run --network
每个容器指定同一个网桥,那么只要进入一个容器的内部,使用另外一个容器的ip就可以访问到
docker network ls #查看Docker中的网桥
查看网桥的详细信息
ports
暴露宿主端口:容器端口的信息,相当于docker run -p
volumes
暴露宿主路径:容器路径的信息,相当于docker run -v
restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always
或者 unless-stopped
相当于docker run --restart=always
总结
掌握以上命令之后,如果需要在文件中跑一个es服务,自己写命令可能一点头绪都没有,可以按照这种运行命令改编
docker run -p 6379:6379 -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
改编之后YAML文件
redis: image: redis:5.6 ports: -3306:3306 volumes: - /mydata/redis/data:/data - /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf environment: - /usr/local/etc/redis/redis.conf --appendonly yes