掘金 后端 ( ) • 2024-04-18 18:13
  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 versionDocker 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: helloFROM 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 5432localhost: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配置文件、丰富的管理命令和跨平台兼容性,极大地简化了多容器应用的部署与管理,尤其在小型、开发环境和简单生产场景中表现出色。

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