在使用docker-compose时,由于所有的容器都在同一个配置文件中定义,可以很方便地进行管理和部署,从而提高了开发效率和部署效率。同时,docker-compose还可以帮助我们管理容器之间的依赖关系,使得多个容器可以协同工作,从而构建一个完整的应用。
需要注意的是,docker-compose与docker有版本对应关系,因此在使用docker-compose时需要选择与已安装的docker版本相对应的docker-compose版本,否则可能会出现不兼容或无法正常工作的问题。建议使用与docker版本相匹配的最新版本的docker-compose。
1 安装
源码安装和pip安装是两种常见的安装方式,无论使用哪种安装方式,都需要注意docker-compose与docker的版本对应关系,以确保其能够正常运行。
1. 源码安装
源码安装通常需要从官方网站或其他可信源下载docker-compose的源代码,并按照相应的指示进行编译和安装。这种安装方式可以确保获得最新版本的docker-compose,并且可以根据自己的需求进行编译和定制。但是,源码安装需要一定的技术水平和时间成本,可能不适合所有人使用。
# daocloud下载docker-compose文件
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 测试安装结果
docker-compose --version
2. pip安装
pip安装则是使用Python的包管理器pip来安装docker-compose。这种安装方式简单方便,可以快速获得最新版本的docker-compose。但是,pip安装可能会受到Python环境和依赖库的影响,需要确保系统中已经安装了必要的Python环境和依赖库。
sudo pip install docker-compose
2 使用示例
version: "3" # 使用Docker Compose文件格式版本3
services: # 定义服务列表
redis: # 定义redis服务
image: redis:alpine # 使用redis官方提供的alpine镜像
ports:
- "6379" # 将redis容器的6379端口映射到主机的6379端口上
networks:
- frontend # 定义容器使用的网络
deploy: # 定义服务的部署方式
replicas: 2 # 定义容器副本数为2
update_config: # 定义更新策略
parallelism: 2 # 最多同时更新2个容器
delay: 10s # 每次更新之间的时间间隔为10秒
restart_policy: # 定义重启策略
condition: on-failure # 容器失败时自动重启
db: # 定义db服务
image: postgres:9.4 # 使用postgres官方提供的9.4版本镜像
volumes:
- db-data:/var/lib/postgresql/data # 将主机上的db-data卷挂载到容器的/var/lib/postgresql/data目录上
networks:
- backend # 定义容器使用的网络
deploy: # 定义服务的部署方式
placement:
constraints: [node.role == manager] # 定义容器部署的约束条件,只能在manager节点上部署
networks: # 定义网络列表
frontend: # 定义名为frontend的网络
backend: # 定义名为backend的网络
volumes: # 定义卷列表
db-data: # 定义名为db-data的卷
执行 docker-compose up 命令来启动并运行整个应用程序。
3 配置详解
在 Docker Compose 中,通过编写一个 YAML 文件来描述容器的配置和启动方式。以下是一些常用的配置选项及其作用:
version
指定 Compose 的版本,也可以理解为 Docker Compose 支持的配置语法的版本。
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
- context:上下文路径。
- dockerfile:指定构建镜像的 Dockerfile 文件名。
- args:添加构建参数,这是只能在构建过程中访问的环境变量。
- labels:设置构建镜像的标签。
- target:多层构建,可以指定构建哪一层。
command
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
depends_on
设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose:
- "3000"
- "8000"
healthcheck
用于检测 docker 服务是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
network_mode
设置网络模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
ulimits
覆盖容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000