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

,