下载完docker-compose后,如果想使用docker-compose命令开头,需要创建软连接
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
1.docker-compose.yml文件编排
一个 docker-compose.yml 文件的顶层元素有:version、name、service、networks、volumes、configs、secrests,涉及的配置非常多,这里只是稍微讲一下一些比较常用的
1.1 version
version: "3.0"
version 元素是编排文件的格式版本,而非Docker Compose 或 Docker 引擎的版本号
services
services元素用于定义不同的应用服务,在编排文件中是必需的,是我们定义容器怎么启动编排、怎么依赖的地方。
- build
build元素声明怎么通过源代码从本地创建一个镜像。
可以将build指定为定义上下文路径的单个字符串,这个路径字符串以是绝对路径或者相对路径的方式指向Dockerfile文件或者Dockerfile所在的文件夹,不推荐使用绝对路径,因为这样会影响编排文件的可移植性。
services:
serviceA: # serviceA 是简略版构建,serviceB是详细构建
build: ../webapp
serviceB:
build:
context: ../../backend # 上下文路径,相对于compose.yaml
dockerfile: ./service.dockerfile # Dockerfile文件路径,相对于context,这种方式可以指定dockerfile文件名
args:
type:cdc3b19 #添加构建参数,构造参数必须是Dockerfile已经定义的
labels:
description: "service B" #设置构建镜像的标签。
target: publish # 多层构建,可以指定构建哪一层
- image
指定构建容器使用的镜像,如果本地镜像不存在,则会根据pull_policy配置拉取镜像,如果build和image同时存在,build优先(如果本地之前已经build过一次,将会使用pull_policy的默认规则进行构建),构建完将使用image指定的名字和标记对其进行标记。
services:
nginx:
image: custom/nginx
build: .
构建出的镜像名称叫做 custom/nginx
- pull_policy
编码文件拉取镜像的策略- always:从仓库拉取,不使用本地缓存
- never:只要本地缓存,不从仓库拉取,如果本地没有镜像则报错
- missing:优先使用本地,否则从仓库拉取,这个是默认值
- build:从本地源码构建,就算镜像存在也会
version: '3.4'
name: test
services:
flaskdemo:
container_name: flask_test_bs
image: flask_demo-flaskdemo # 本地已经有这个镜像了
pull_policy: build 但是仍会重新build,并且镜像名是flask_demo-flaskdemo
build:
context: .
dockerfile: ./Dockerfile
ports:
- 5000:5000
- environment
设置环境变量,相当于docker run -e
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root #字典格式
- depends_on
配置服务依赖关系,当前服务启动时会先启动被依赖的服务,必须等到被依赖的服务进行"ready"状态,当前服务才会启动,当前服务停止后被依赖的服务才会停止。可以以短语法和长语法两种方式书写
services:
web:
build: .
depends_on:
-db
-redis
redis:
image: redis
db:
image: postgres
- network_mode
设置网络模式 (默认是bridge)- none 禁用所有容器的网络
- host 它使容器可以原始访问主机的网络接口
- service:{name} 它只允许容器访问指定服务
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
- networks
配置容器连接的网络,需要引用顶级 networks 下的条目,同一网络上的其他容器可以使用服务名称来连接到对应容器的服务,也可以设置别名,通过别名来连接。
services:
some-service:
networks:
-some-network
-other-network
networks:
some-network:
other-network:
- ports
配置端口映射 - volumes
指定宿主机目录和容器目录映射,如果一个主机目录只是由单个服务使用,可以直接在服务定义里面配置,如果一个路径要跨多个服务复用,则必须在顶层的volumes中配置
volumes:
# 只需指定一个路径,让引擎创建一个卷
- /var/lib/mysql
# 指定绝对路径映射
- /opt/data:/var/lib/mysql
# 相对于当前compose文件的相对路径
- ./cache:/tmp/cache
# 用户家目录相对路径
- ~/configs:/etc/configs/:ro
# 命名卷
- datavolume:/var/lib/mysql
- scale
配置一个服务启动容器的个数,不过这个指令已经被deploy指令中的replicas替代了,虽然还可以使用,但是会产生警告。
services:
redis:
image: redis:alpine
scale: 2
或者
services:
mysql:
image: redis:alpine
deploy:
replicas: 2
- networks
网络是允许服务彼此通信的层,可以通过在顶层下指定网络名称来创建网络,服务可以通过在服务下指定网络名称来连接到网络,连接到相同网络的服务能够进行相互通讯。如果没有显式配置网络,则compose在编排的时候会创建默认网络。
version: '3.4'
name: test
services:
flaskdemo:
container_name: flask_test_bs
image: flask_demo-flaskdemo
# pull_policy: build
build:
context: .
dockerfile: ./Dockerfile
ports:
- 5000:5000
networks:
- webapi-net
redis:
image: "redis:alpine"
networks:
- webapi-net
scale: 2
networks:
webapi-net:
运行 docker compose config 显示
docker compose常用命令
-
docker compose config
config命令用于验证Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因,并不会执行真正的操作 -
docker compose up
它会尝试自动完成构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作。依赖的服务都也会被自动启动,除非依赖的服务已经处于运行状态。
大部分时候都可以直接通过该命令来启动一个项目。默认情况,docker-compose up 启动的容器都在前台, 使用 docker-comose up -d,后台运行所有容器
`
–force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
–no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
–scale 在启动的时候设置一个服务启动多少个容器,会覆盖compose.yaml文件中的设置
–no-build 不自动构建缺失的服务镜像。 -
docker compose down
down命令默认会停止并移除 up 命令所启动的容器和创建的网络,但不会移除数据卷 -
docker compose ps -a
列出项目中的所有容器 -
docker compose exec -it 服务名 /bin/bash
进入容器内部 -
docker compose start/stop/restart/pause/unpause/rm services
注意区分service和容器名
启动/停止/重启/暂停/恢复暂停/删除服务 -
docker compose logs -f 【service】
查看容器日志