Docker Compose详解
#docker版本号配置
#若未指定版本号,默认使用的不是最新版本。
#需同时指定主版本号和次版本号,比如version, '3',使用的是3.0的版本,不是最新版本。
version: '3.8'
#服务配置
service:
nginx:
#${TAG}调用的是.env中的数据
image: 'nginx:${TAG}'
#environment可以直接定义容器中的环境变量,布尔值0,1,true,false,yes,no都需要引号引起来,确保不会被YAML解析成True或False
environment:
- DEBUG=${DEBUG}
#也可以直接调用多个.env文件
- .env
- .env.overrid
#同样是调用环境配置文件,但优先级不如environment高,而environment又不如[docker compose up -e]
env_file:
- nginx.env
#没有profiles属性的服务在运行【docker compose up】时,会正常启动,有profiles属性的服务只有在启动配置文件后,服务才会启动。
profiles: ["frontend"]
#依赖服务,在启动Nginx之前,会先启动redis和mysql服务
#
depends_on:
- redis
- mysql
#调用其他compose文件,文件中可以存放端口号镜像数据卷环境配置等通用数据。
extends:
#定义文件位置
file: common-service.yml
#定义服务名称
service: webapp
#可以覆盖镜像声明的默认指令,类似Dockerfile中的CMD指令
command: bundle exec thin -p 3000
#该属性可以将两个服务链接在一起,:前是服务名称,:后是服务别称,服务之间不需要网络配置,便能通过服务别称或者服务名称访问该服务。
links:
- "php:phpLink"
- redis
networks:
- sail
php:
#Dockerfile文件的相对路径地址
build: .
depends_on:
- redis
- mysql
ports:
- "80:80"
volumes:
- .:/var/www/html
- db-data:/etc/php.conf
networks:
- sail
profiles:
- debug
depends_on:
mysql:
#该属性有三个选项:service_started与-mysql作用一致;service_healthy表示在依赖服务启动之前,依赖服务必须是健康的;service_completed_successfully表示在依赖服务启动之前,依赖服务必须是运行成功的。
condition: service_started
#设定为true,会在依赖项服务更新后重新启动该服务。
restart: true
#默认为true,设定为false时,仅在依赖服务未启动或不可用时向你发出警告。
required: true
command: [ "bundle", "exec", "thin", "-p", "3000" ]
#多用在开发期间
develop:
#监听代码变化,当本地代码更改时,会同步到服务中去
watch:
#该属性有三个选项:sync确保本地文件做出改变时,自动更新服务容器内的相应文件;rebuild本地文件改变,compose会构建新镜像并替换正在运行的服务容器;sync+restart会与服务容器同步并重新启动。
- action: sync
#本地文件所在位置
path: ./
#服务容器内文件所在位置
target: /src/web
#忽略那些不需要修改变动的文件
ignore:
- node_modules/
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- .:/var/lib/mysql
networks:
- sail
secrets:
- my_secret
redis:
image: redis
ports:
- "5379:5379"
networks:
- sail
#网络配置
networks:
#网络名称
sail:
#别名
name: my-network
#驱动程序
driver:bridge
#该属性为true,则不会新建网络,而是加入预先存在的网络
external: true
#该属性为true,其他容器也能访问该网络,并能与网络上的服务相互通信
attachable: true
#数据卷配置
volumes:
db_data:
#为true代表该卷已存在,不会创建新卷
external: true
#自定义名称
name: "my-app-data"
#秘钥配置
secrets:
my_secret:
file: ./my_secret.txt
#compose指令
#启动
docker compose up
#列出镜像
docker images ls
#检查镜像
docker inspect <tag or id>
#停止
docker compose down
#停止并删除容器及数据
docker compose down --volumes
#后台运行
docker compose up -d
#后台状态关闭
docker compose stop
#查看运行情况
docker compose ps
#查看服务可以使用哪些环境变量
docker compose run <service名称> env
#临时配置环境变量并执行
docker compose run -e <环境变量> <service名称> <service指令>
#示例如下,修改环境变量debug,并借助服务内的python执行console.py文件
docker compose run -e DEBUG=1 web python console.py
#调用环境文件修改服务环境变量,该方法可以用在生产(.env.prod)和测试(.env.test)环境上,本地测试访问test,上线后调用prod,若未使用--env-file,则会调用默认的.env文件
docker compose --env-file ./config/.env up
#调用多个环境配置文件,若两文件中存在相同配置,后面的文件会覆盖前面的文件
docker compose --env-file .env --env-file .env.override up
#单独配置某个环境变量,该变量会覆盖环境配置文件
docker compose --env-file .env up -e DATABASE_PASSWORD=123456
#环境变量配置语法
VAR=VAL #值为VAL
VAR="VAL" #值为VAL
VAR='VAL' #值为VAL
VAR=VAL # COMMOENT #值为VAL
VAR=VAL# COMMOENT #值为VAL# COMMOENT
VAR='$OTHER' #值为$OTHER
VAR='${OTHER}' #值为${OTHER}
VAR='Let\s go!' #值为Let's go
VAR="{\"hello\": \"json\"}" #值为{"hello": "json"}
VAR="some\tvalue" #值为some value
VAR='some\tvalue' #值为some\tvalue
VAR=some\tvalue #值为some\tvalue
#compose文件中调用环境变量的语法
${VAR} #值为VAR
${VAR:-default} #如果设置了非空的值,值为VAR,否则值为default
${VAR-default} #如果设置了值,值为VAR,否则值为default
${VAR:?error} #如果设置了非空的值,值为VAR,否则错误退出
${VAR?error} #如果设置了值,值为VAR,否则错误退出
${VAR:+replacement} #如果设置了非空的值,值为replacement,否则值为空
${VAR+replacement} #如果设置了值,值为replacement,否则值为空
#启动特定配置文件
docker compose --profile [配置文件] up
COMPOSE_PROFILES=[配置文件] docker compose up
#启动多个配置文件
docker compose --profile frontend --profile debug up
COMPOSE_PROFILES=frontend,debug docker compose up
#当通过指令明确指定某个服务启动时,若该服务中存在profile,那么profile文件也会被启动。
docker compose run <service服务>
#当通过指令明确指定某个服务启动时,若该服务中存在depends_on依赖服务,那么会自动启动该依赖服务,但若是该依赖服务中又存在profile文件,那么该服务将会启动失败,但若该服务中也存在profile文件,且与依赖服务中的profile文件一致,则可以正常启动。
docker compose up <service服务>
#调用多个compose.yml文件执行某些操作,
docker compose -f compose1.yml -f compose2.yml run <service服务> <service服务指令>
#示例如下,compose文件只包含正常环境配置,dcompose.admin包含了数据库环境配置,要数据库备份时,运行两个compose文件开启dbadmin服务来执行数据库备份操作。
docker compose -f compose.yml -f dcompose.admin.yml run dbadmin db-backup
#停止销毁重建服务,多用在程序代码更新时
docker compose build <服务名称>
#--no-deps可防止compose重新创建任何依赖
docker compose up --no-deps -d <服务名称>
#构建compose项目并启动文件监视模式,多用在开发阶段,与watch属性搭配使用。
docker compose watch