一文读懂docker-compose

docker-compose_logo.png

docker-compose文件创建

  1. 直接新建一个文本文档,写入配置后,更改文件名字和文件类型为docker-compose.yml

  2. Linux上直接进入配置文件夹内,使用vi命令进行创建。
    如果当前文件夹内已存在docker-compose.yml文件,那么将直接打开进入编辑页面。
    如果没有,将在你写入配置文件命令并保存后自动创建出docker-compose.yml文件。

    vi docker-compose.yml

    按字母i键进入编辑模式,粘贴完之后按Esc键,退出编辑模式,再输入:wq退出并保存。
    如果输入错误了,可以输入:q退出但不保存。

docker-compose的兼容性与对应的docker版本

查看docker-compose、docker版本

  • 使用下面两个命令直接查看

    docker-compose -v  #查看docker-compose版本
    
    docker -v  #查看docker版本

  • 如果要下载最新版本的Docker Compose,下载并将其保存到/usr/local/bin/docker-compose即可。

docker-compose文件的编写方法

  • 此处演示的是Halo博客使用MySQL数据库的docker-compose.yml文件

  • Services:相当于container

  • Networks:相当于使用的网络

  • Volumes:数据持久化

  • build:构建镜像。可以指定 Dockerfile 的路径或者直接使用已有的镜像。

  • image:使用指定的镜像。

  • ports:指定容器端口映射,格式为 HOST_PORT:CONTAINER_PORT。

  • volumes:指定挂载卷,格式为 HOST_PATH:CONTAINER_PATH。

  • environment:设置环境变量,格式为 KEY=VALUE。

  • networks:指定容器连接的网络。

  • restart:指定容器重启策略,如 no, always, on-failure 等。

  • restart: always 是一个用于在容器停止后自动重新启动容器的指令。当容器出现任何错误或异常情况导致容器停止时,Docker将尝试自动重新启动容器。这个选项确保您的应用程序在意外关闭时能够自动恢复,并继续正常运行。

  • depends_on:指定容器之间的依赖关系。

  • command:覆盖容器默认的启动命令。

  • 用法只选取你需要用的进行设置即可。
    例如本模板文件是一个文件创建两个容器,如果你只需要一个容器,那么多的删除即可。

    version: "3"
    
    services:
      halo:  #定义服务名称
        image: halohub/halo:2.11  # 使用指定的镜像
        container_name: halo  #设置docker容器名
        restart: on-failure:3  #重启策略
        depends_on:
          halodb:
            condition: service_healthy
        networks:  
          halo_network:  #此处是两个容器创建了一个虚拟网络(halo_network)
        volumes:  
          - ./halo2:/root/.halo2  #数据持久化,将本地文件夹路径映射成容器内部文件夹。
        ports:
          - "8090:8090"  #将容器内部的指定端口映射至外部,可通过前面的8090端口进行访问容器页面,此端口可自行修改。
        environment:  #设置指定的环境变量,只对此容器生效。格式为【环境变量名】=【自定义参数】
          - PUID=0
          - PGID=0
        healthcheck:  #容器状态检查
          test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
          interval: 30s
          timeout: 5s
          retries: 5
          start_period: 30s
        command:  #覆盖容器默认的启动命令。
          - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
          - --spring.r2dbc.username=root
          # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
          - --spring.r2dbc.password=o#DwN&JSa56
          - --spring.sql.init.platform=mysql
          # 外部访问地址,请根据实际需要修改
          - --halo.external-url=http://localhost:8090/
    
      halodb:  #定义服务名称
        image: mysql:8.1.0  # 使用指定的镜像
        container_name: halodb  #设置docker容器名
        restart: on-failure:3  #重启策略
        networks:
          halo_network:  #此处是两个容器创建了一个虚拟网络(halo_network)
        command: 
          - --default-authentication-plugin=caching_sha2_password
          - --character-set-server=utf8mb4
          - --collation-server=utf8mb4_general_ci
          - --explicit_defaults_for_timestamp=true
        volumes:
          - ./mysql:/var/lib/mysql  #数据持久化,将本地文件夹路径映射成容器内部文件夹。
          - ./mysqlBackup:/data/mysqlBackup  #数据持久化,将本地文件夹路径映射成容器内部文件夹。
        ports:
          - "3306:3306"  #将容器内部的指定端口映射至外部,可通过前面的8090端口进行访问容器页面,此端口可自行修改。
        healthcheck:  #容器状态检查
          test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
          interval: 3s
          retries: 5
          start_period: 30s
        environment:  #设置指定的环境变量,只对此容器生效。格式为【环境变量名】=【自定义参数】
          # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
          - MYSQL_ROOT_PASSWORD=o#DwN&JSa56
          - MYSQL_DATABASE=halo
    
    networks:  #创建此docker-compose项目的虚拟网络
      halo_network:  #虚拟网络名

docker-compose文件的运行

  • 启动docker-compose文件

    docker-compose up
  • 启动并后台运行docker-compose文件

    docker-compose up -d

功德+1(狗子).gif

👇👇👇