美文网首页Docker轻松入门教程
Docker Compose:简化多容器部署

Docker Compose:简化多容器部署

作者: 字节码在跳舞 | 来源:发表于2024-04-17 17:54 被阅读0次
    1. Docker Compose示例介绍
    2. 使用Docker Compose配置文件启动服务
    3. 优势与劣势

    Docker Compose 用来定义单个Yaml配置文件、运行多个容器的工具。在Yaml中可以配置服务、网络、数据卷,通过一条命令,即通过Yaml配置文件,创建启动所有的服务。

    使用Docker Compose的带来的优势,单个Yaml文件中定义和管理多个容器。简化了多个容器协调的复杂度。更加流畅,提高效率。提高Yaml配置,语法简单,轻松与他人分享。

    平时使用需要掌握Yaml配置文件编写和Docker Compose的使用命令。在Yaml中可以定义应用和数据库,数据队列,缓存等所有有依赖服务。使用命令docker compose up -d一条命令,即可运行多个容器服务。要停止 这些容器,只需要docker compose down即可。

    演示项目:https://gitee.com/ft/hello-go-db

    1. Docker Compose示例介绍

    Docker Compose配置文件有多个版本,每个版本引入了不同的特性和语法,v1版本已经停止了支持,不建议再使用。根据实际情况可以使用最新版本的语法规则编写。最新版的Docker引擎支持较新版本的语法,当前版本为3.8。v3与Dokcer Swarm配置兼容。

    • 验证安装

    确保你的电脑已经安装Docker Compose。

    ➜  ~ docker compose version
    Docker Compose version v2.26.1
    

    可以使用命令docker compose version进行验证。老版本使用的是docker-compose命令。新版本Docker Compose已经内置到Docker命令中。

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    观察这命令,当初安装docker时,使用过。我们已经使用插件的形式(docker-compose-plugin),安装过了。

    • 配置文件

        支持都中文件命名,如下:  
      
            `compose.yaml`
      
            `docker-compose.yaml`
      
            `docker-compose.yml`
      
            `compose.yml`
      

    先结合实例简单介绍下,

    version: '3'
    services:
      app:
        build:
          context: .
          dockerfile: Dockerfile
        expose:
          - 8080
        ports:
          - 8080:8080
        links:
          - db
        depends_on:
          - db
      db:
        image: postgres
        environment:
          POSTGRES_PASSWORD: "abc123"
          POSTGRES_USER: hello
          POSTGRES_DB: hello
    
    
    FROM golang:1.22.2-alpine3.19 as builder
    LABEL authors="ff755"
    ENV GO111MODULE=on
    ENV GOPROXY=https://goproxy.cn
    WORKDIR /app
    COPY . /app
    RUN GOOS=linux GOARCH=amd64 go build -o app
    
    FROM alpine:3.19.1
    WORKDIR /app
    COPY --from=builder /app .
    
    EXPOSE 8080
    CMD sh -c "sleep 5s && ./app"
    

    app服务构建时,使用到的Dockerfile。

    上述docker-compose.yml文件中,定义了一个由两部分构成的多服务应用:app服务和db服务。

    版本声明: 首先,我们声明使用Docker Compose的版本为3,确保与当前版本的Docker引擎兼容,能够充分利用其特性。

    服务定义: 接下来,我们定义了两个核心服务:

    1. app服务

      • 通过Dockerfile构建镜像启动容器

        服务的镜像。具体参数如下:

        • context: . 表示构建上下文目录为当前目录(.),Docker会在此目录查找构建所需的文件。
        • dockerfile: Dockerfile 指定使用当前目录下的Dockerfile作为构建镜像的指令文件。
      • 端口暴露:使用expose关键字声明服务内部使用的端口为8080,表明该服务在容器内部监听此端口。这一步不是必须的,主要用于文档说明,不影响实际网络通信。

      • 端口映射:通过ports关键字将容器内部的8080端口映射到宿主机的同名端口,使得外部可以通过宿主机的8080端口访问到app服务。

      • 服务间链接:使用links关键字指定app服务与db服务之间的链接关系。虽然在Docker Compose v3中,网络默认共享,一般不再需要显式链接,但这里保留了该配置。

      • 依赖关系:使用depends_on关键字确保db服务在app服务启动前启动。注意,这仅保证启动顺序,不代表db服务在app服务启动时已经完全可用。

    2. db服务

      • 使用官方镜像:指定db服务基于官方的PostgreSQL镜像构建,无需额外编写Dockerfile。

      • 环境变量设置environment

        设置必要的环境变量以配置数据库:

        • POSTGRES_PASSWORD: 数据库的密码,设置为abc123
        • POSTGRES_USER: 数据库的用户名,设置为hello
        • POSTGRES_DB: 数据库的名称,设置为hello

    总结来说,这份docker-compose.yml文件描述了一个包含app服务(基于当前目录下的Dockerfile构建,监听并映射8080端口,依赖于db服务)和db服务(使用PostgreSQL镜像,配置了数据库的用户名、密码和数据库名)的应用。使用此配置文件启动应用时,Docker Compose将自动构建app服务的镜像,拉取或启动db服务的镜像,并按依赖关系有序启动两个服务。

    app容器的启动命令写在了在Dockerfile中CMD sh -c "sleep 5s && ./app。休眠5秒,启动./app。因为数据库启动需要一定时间,会出现app连接db失败的情况。必须让db先于app达到可用状态。

    举例说明:

    服务 容器启动时间 服务可用时间
    app 0.1s 0.3s
    db 0.1s 3s

    app可用,即可以通过浏览器进行访问。db可用,即可通过app进行建立与数据库的连接。

    若直接启动,app服务无法成功和db服务建立连接,app启动时间短,此时,db还没有达到可用状态。

    故此处,使用了休眠5秒,使app连接数据库的时间大于db可用的时间。5.3>3s。

    Docker Compose提供了心跳检测,可以结合pg_isready达到相同的效果。

    pg_isready -h localhost -p 5432
    localhost:5432 - 接受连接
    

    当返回接收连接时,app才会开始连接db。之后讲解,先简单了解下。

    2. 使用Docker Compose配置文件启动服务

    启动服务

    在包含docker-compose.yml文件的目录下,执行以下命令启动服务:

    docker-compose up
    

    如果您想在后台(detached mode)启动服务,添加 -d 参数:

    docker-compose up -d
    

    检查服务状态

    docker-compose ps
    

    停止服务

    要停止并删除(如果使用 -d 参数启动)所有服务及其容器,运行:

    docker-compose down
    

    使用以上命令,您可以使用Docker Compose配置文件成功启动了服务。根据需要,您可以编辑docker-compose.yml文件,添加、删除或修改服务,然后重新执行docker-compose up命令来更新服务配置并启动。

    运行演示项目

    ➜  hello-go-db git:(master) docker compose up
    WARN[0000] /root/hello/a/hello-go-db/docker-compose.yaml: `version` is obsolete
    [+] Running 1/2
     ✔ Network hello-go-db_default  Created              0.1s
     ⠴ Container hello-go-db-db-1   Created              0.5s
     ⠋ Container hello-go-db-app-1  Created              0.1s
    Attaching to app-1, db-1
    db-1   | The files belonging to this database system will be owned by user "postgres".
    db-1   | 2024-04-18 08:44:19.084 UTC [1] LOG:  database system is ready to accept connections
    app-1  | db: db
    app-1  | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
    app-1  |
    app-1  | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
    app-1  |  - using env:  export GIN_MODE=release
    app-1  |  - using code: gin.SetMode(gin.ReleaseMode)
    app-1  |
    app-1  | [GIN] 2024/04/18 - 08:44:21 | 200 |     718.089µs |   192.168.31.47 | GET      "/"
    app-1  | strconv.ParseInt: parsing "favicon.ico": invalid syntax
    

    运行日志信息太长,这里提供一个精简后的信息。如后台运行填加参数-d。停止使用命令docker compose down

    3. 优势与劣势

    Docker Compose具备简化多容器部署、快速环境搭建、版本控制、环境一致性、依赖管理和协调、方便的管理命令、跨平台支持、资源隔离和服用等优势。Docker Compose同时具备了一些劣势也较为明显,单机局限性,伸缩性、集群、高可用等不支持或支持太弱。Docker Compose非常适合小型的多容器应用,开发测试阶段和单机生产环境,简化了多容器部署和管理。

    Docker Compose作为一款强大的容器编排工具,凭借其简洁易用的YAML配置文件、丰富的管理命令和跨平台兼容性,极大地简化了多容器应用的部署与管理,尤其在小型、开发环境和简单生产场景中表现出色。

    忍不住要加个关注!不是我吹,但你会后悔没关注的!

    公众号:字节码在跳舞

    相关文章

      网友评论

        本文标题:Docker Compose:简化多容器部署

        本文链接:https://www.haomeiwen.com/subject/infexjtx.html