Docker Compose简介

一、docker-compose基础概念

docker-compose项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排。

docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)

  • docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
  • 一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
  • 一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。

docker-compose的工程配置文件默认为docker-compose.yml。可以通过环境变量COMPOSE_FILE -f 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。

2、为什么要使用docker-compose

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,

  • 例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

  • docker-compose项目由pypthon编写,调用docker服务提供的API来对容器进行管理,因此, 只要所操作的平台支持docker-API,就可以在其上利用compose来进行编排管理。
  • 简单来说:就是来管理多个容器的,定义启动顺序的,合理编排,方便管理

3、compose的安装

在 Linux 上的也安装十分简单,从 GitHub Release处直接下载编译好的二进制文件即可。

(1)先把docker-compose文件下载到当前目录:

wget https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64

(2)然后拷贝到/usr/bin/ 。

sudo cp -arf docker-compose-linux-x86_64 /usr/bin/docker-compose

sudo chmod +x /usr/bin/docker-compose

4、使用

docker-compose.yml 文件用于定义和运行多个 Docker 容器的应用,常用的配置指令:

1. 版本声明

docker-compose.yml 文件开头,需要声明所使用的 Compose 文件版本,不同版本支持的功能有所差异。

version: '3'
  • Version 1:是最早的版本,语法简单,主要用于在单机环境下定义和运行多个容器,适用于非常简单的 Docker 应用,不支持网络、数据卷等高级配置,也没有服务依赖、部署配置等复杂功能。
  • Version 2.x:在 Version 1 的基础上增加了网络和数据卷的显式定义、服务依赖管理、环境变量扩展等功能,支持使用 networksvolumes 关键字来创建和管理网络与数据卷,通过 depends_on 定义服务之间的依赖关系,适用于需要更复杂配置的单机应用。
  • Version 3.x:主要是为了支持 Docker Swarm 集群模式而设计,在 Version 2.x 的基础上进一步增强。引入了 deploy 关键字,可用于定义服务的部署配置,如副本数量、资源限制、更新策略等,同时对网络和数据卷的配置进行了优化,支持更灵活的配置方式,既适用于单机环境,也适用于 Docker Swarm 集群环境,适合需要进行大规模部署和管理的应用。

2. 服务定义(services

services 部分用于定义各个容器化服务的配置,每个服务都有自己的配置项。

image

指定服务使用的 Docker 镜像。

services:
  web:
    image: nginx:latest

注意services 部分用来定义应用程序里的各个服务,这些服务名称可以依据实际情况灵活命名比如web

build

若要构建自定义镜像,可以使用 build 指令指定构建上下文和 Dockerfile。

services:
  app:
    build:
      context: ./app  # 指定 Dockerfile 所在目录
      dockerfile: Dockerfile  # 指定 Dockerfile 文件名
container_name

为容器指定自定义名称。

services:
  db:
    image: mysql:8.0
    container_name: my-mysql-ct
restart

定义容器的重启策略。

services:
  redis:
    image: redis:alpine
    restart: always  # 总是重启

常见的重启策略有:

  • no:默认值,不自动重启。
  • always:无论容器因何原因停止,都会自动重启。
  • on-failure:容器因非零退出状态码停止时重启。
  • unless-stopped:除非手动停止,否则容器会一直重启。
environment

设置容器内的环境变量。

.env 文件加载环境变量

可以把环境变量存放在 .env 文件中,然后在 docker-compose.yml 里引用这些变量。

  • 创建 .env 文件:在 docker-compose.yml 文件所在的目录下创建一个 .env 文件,内容如下:
DB_HOST=localhost
DB_PORT=5432
  • docker-compose.yml 中引用
version: '3'
services:
  app:
    image: my-app
    environment:
      - DB_HOST
      - DB_PORT

这样,app 服务的容器会从 .env 文件中读取 DB_HOSTDB_PORT 的值并设置为环境变量

ports

将容器内的端口映射到宿主机的端口。

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"  # 宿主机 8080 端口映射到容器 80 端口
volumes

将宿主机的目录或文件挂载到容器内。

services:
  app:
    image: python:3.9
    volumes:
      - ./app:/app  # 宿主机当前目录下的 app 目录挂载到容器的 /app 目录
depends_on

定义服务之间的依赖关系,确保依赖的服务先启动。

services:
  web:
    image: nginx:latest
    depends_on:
      - app
  app:
    image: python:3.9
networks

指定服务要连接的网络。

services:
  web:
    image: nginx:latest
    networks:
      - my-network
networks:
  my-network:
  external: true
  

3. 网络定义(networks

networks 部分用于定义 Docker 网络,可指定网络驱动和其他配置。

networks:
  my-network:
    driver: bridge  # 使用桥接网络

4. 数据卷定义(volumes

volumes 部分用于定义 Docker 数据卷,可实现数据的持久化存储。

volumes:
  my-volume:
    driver: local  # 使用本地驱动

5. 其他高级配置

command

覆盖容器启动时默认执行的命令。

services:
  app:
    image: python:3.9
    command: python app.py
deploy

在 Docker Swarm 模式下,deploy 用于定义服务的部署配置,如副本数量、资源限制等。

services:
  web:
    image: nginx:latest
    deploy:
      replicas: 3  # 部署 3 个副本
      resources:
        limits:
          cpus: '0.50'
          memory: 512M

以上就是 docker-compose.yml 文件中常见的配置指令,你可以根据实际需求组合使用这些指令来定义和管理复杂的 Docker 应用。

6.下面是一个完整的yml 配置

version: '3'
networks:
  # 指定要连接的已有网络,需确保该网络已存在
  lishibiao_network:
    external: true
volumes:
  # 引用提前创建的数据卷,需替换为实际的数据卷名称
  mysql-data:
    external: true
services:
  db:
    image: mysql:8.0
    container_name: mysql-ct-3
    restart: always
    environment:
      # MySQL 初始化所需的基本环境变量
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: zyy
      MYSQL_USER: root
      MYSQL_PASSWORD: 123456
    volumes:
      # 挂载提前创建的数据卷到 MySQL 数据存储目录
      - mysql-data:/var/lib/mysql
    ports:
      # 映射 MySQL 端口到宿主机
      - "3306:3306"
    networks:
      # 连接到指定网络
      - lishibiao_network
  app:
    image: zyy:3.0
    container_name: my-zyy-app-7  # 替换为实际的 app 容器名称
    depends_on:
      - db
    networks:
      - lishibiao_network
    volumes:
         # 挂载宿主机上的 JAR 文件到容器内的指定路径
      - /home/docker-zyy/zyy-0.0.1-SNAPSHOT.jar:/app/zyy.jar
      # 挂载应用配置文件到容器内指定位置,按实际情况修改路径
      - /home/docker-zyy/application.properties:/app/config/application.properties 
    ports:
      # 端口映射,将宿主机的 8903 端口映射到容器内的 8903 端口,可按需修改
      - "8903:8903"
    command: java -jar /app/zyy.jar -Dspring.config.location=/app/config/application.properties
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值