- Docker Compose示例介绍
- 使用Docker Compose配置文件启动服务
- 优势与劣势
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引擎兼容,能够充分利用其特性。
服务定义: 接下来,我们定义了两个核心服务:
-
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
服务启动时已经完全可用。
-
-
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配置文件、丰富的管理命令和跨平台兼容性,极大地简化了多容器应用的部署与管理,尤其在小型、开发环境和简单生产场景中表现出色。
忍不住要加个关注!不是我吹,但你会后悔没关注的!
公众号:字节码在跳舞
网友评论