概念介绍
Docker-Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为 docker-compose.yml
,当然也可以通过环境变量 COMPOSE_FILE
或 -f
参数自定义配置文件。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
安装docker-compose
代码语言:javascript复制sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod x /usr/local/bin/docker-compose
docker-compose --version
代码语言:javascript复制docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项:
- -f --file: FILE指定Compose模板文件,默认为docker-compose.yml
- -p --project-name: NAME 指定项目名称,默认使用当前所在目录为项目名
- --verbose: 输出更多调试信息
- -v,-version: 打印版本并退出
- --log-level LEVEL: 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
常用命令
启动 docker-compose:docker-compose up -d
列出所有容器:docker-compose ps
停止容器:docker-compose stop
停止正在运行的容器,可以通过 docker-compose start
再次启动
查看日志:docker-compose logs
重启所有容器:docker-compose restart
暂停某个容器:docker-compose pause [SERVICE...]
进入某个容器:docker-compose exec [options] SERVICE COMMAND [ARGS...]
选项包括:
- -d 分离模式,后台运行命令。
- –privileged 获取特权。
- –user USER 指定运行的用户。
docker-compose.yml
Compose 允许用户通过一个 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的 docker-compose.yml
,可以使用 .yml
或 .yaml
作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services部分。
注意:yml 语法的格式是非常重要的,缩进也要得当。
代码语言:javascript复制version: '3'
services:
mysql1:
image: mysql
container_name: mysql1
environment:
- MYSQL_ROOT_PASSWORD=123456
ports:
- 39111:3306
mysql2:
image: mysql
container_name: mysql2
environment:
- MYSQL_ROOT_PASSWORD=123456
ports:
- 39112:3306
其中还有一些比较常用的属性
depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
代码语言:javascript复制version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
上述YAML文件定义的容器会先启动 redis 和 db 两个服务,最后才启动 web 服务。
volumes
挂载数据卷
代码语言:javascript复制volumes:
- /opt/data:/var/lib/mysql
volumes_from
挂载数据卷容器
代码语言:javascript复制volumes_from:
- service_name
- container_name
links
链接到其它服务中的容器。在 Redis 搭建主从架构时我便使用到了它。有兴趣的朋友看看我写过的一个 Redis 笔记。
代码语言:javascript复制links:
- db
- db:database
- redis
build
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用up启动时执行构建任务,构建标签是 build,可以指定Dockerfile 所在文件夹的路径。
Compose 将会利用 Dockerfile 自动构建镜像,然后使用镜像启动服务容器。
代码语言:javascript复制build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
代码语言:javascript复制build: ./dir
设定上下文根目录,然后以该目录为准指定Dockerfile。
代码语言:javascript复制build:
context: ../
dockerfile: path/of/Dockerfile
如果同时指定 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 值指定的名字。
版权属于:乐心湖's Blog
本文链接:https://cloud.tencent.com/developer/article/1793382
声明:博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!