ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker Compose 入门指南:从安装到用 compose.yaml 定义并运行多容器应用

Docker Compose 入门指南:从安装到用 compose.yaml 定义并运行多容器应用 Docker Compose 入门指南从安装到用 compose.yaml 定义并运行多容器应用【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/composeDocker Compose 是一个用于在 Docker 上定义并运行多容器应用的工具其核心理念是基础设施即代码用一份 Compose 文件描述组成应用的若干容器及其关系然后用docker compose up一条命令完成应用的创建与启动。本文以本仓库Docker Compose 的 Go 语言实现当前源码模块路径为github.com/docker/compose/v5为对象介绍它的定位、安装方式、三步快速上手流程并结合仓库源码与 CLI 参考文档docs/reference/compose.md深入讲解常用子命令、全局参数与COMPOSE_*环境变量体系。读完你将掌握从零搭建并管理一套多容器本地开发/测试环境的标准姿势。Docker Compose 是什么以及这个仓库是什么Compose 文件基于由开源组织维护的 Compose 规范Compose file format定义用于描述一个应用由哪些容器服务组成、各自如何配置。一旦拥有 Compose 文件只需执行$ docker compose up即可一次完成整个应用的创建与启动。这是 Docker Compose 相对手工docker run的最大价值将多容器的编排配置声明化、可版本化、可复现。从仓库实现看本目录是 Docker Compose CLI 的完整 Go 源码CLI 根命令在 cmd/compose/compose.go 中通过 cobra 组装其 Long 描述正是 Define and run multi-container applications with Docker主入口 cmd/main.go 同时支持两种运行形态作为 Docker CLI 插件运行plugin.Run或在独立二进制模式下自动补全docker前缀再执行YAML 解析并非手写而是依赖规范官方的 Go 库github.com/compose-spec/compose-go/v2见 go.mod保证与 Compose Spec 同步。关于 Docker Swarm 的说明Docker Swarm 曾依赖旧的 compose 文件格式但并未采纳新的 Compose 规范因此缺少 compose 语法的一些较新增强特性。自被 Mirantis 收购后 Swarm 不再由 Docker Inc. 维护部分 Docker Compose 能力对 Swarm 用户不可用。若你的目标是 Swarm 集群需要注意这一差异。获取与安装 Docker ComposeWindows 与 macOS随 Docker Desktop 内置在 Windows 与 macOS 上Docker Compose 已包含在 Docker Desktop 中安装 Docker Desktop 后即可直接使用docker compose子命令无需额外安装。Linux以 Docker CLI 插件形式安装Linux 上可以从本仓库的 release 页面下载对应平台的二进制文件。安装步骤为将对应平台的二进制重命名为docker-compose复制到$HOME/.docker/cli-plugins仅对当前用户生效若为系统内所有用户安装可放入以下任一目录/usr/local/lib/docker/cli-plugins或/usr/local/libexec/docker/cli-plugins/usr/lib/docker/cli-plugins或/usr/libexec/docker/cli-plugins某些情况下还需要为文件添加可执行权限即chmod x。插件机制在源码中可以得到印证main()调用plugin.Run(...)并传入插件元数据metadata.Metadata{Vendor: Docker Inc., Version: internal.Version}见 cmd/main.goDocker CLI 会自动从上述cli-plugins目录发现名为docker-compose的插件二进制从而将compose注册为子命令。从源码自行构建可选若想从本仓库直接编译可参照 BUILDING.md 与 Makefile$ make # 编译产出 ./bin/build/docker-compose $ make install # 安装到 ~/.docker/cli-plugins/docker-compose $ make cross # 交叉编译 Windows/macOS/Linux 三种平台版本号通过编译期注入GO_LDFLAGS -w -X ${PKG}/internal.Version${VERSION}默认值为dev见 internal/variables.go。运行docker compose version可查看当前版本信息支持--short与--format json实现在 cmd/compose/version.go。快速开始三步定义并运行你的第一个应用使用 Docker Compose 是一个三步过程用Dockerfile定义应用的环境使应用可以随时随地复现在compose.yaml中定义组成应用的各服务使它们可以在隔离环境中一起运行执行docker compose up由 Compose 启动并运行整个应用。一个最小但完整的 Compose 文件如下services: web: build: . ports: - 5000:5000 volumes: - .:/code redis: image: redis该示例包含两种最常见的服务定义方式字段作用示例含义build: .从当前目录的 Dockerfile 构建镜像web服务镜像由本地构建而来image: redis直接使用已有/远端镜像redis服务从 Docker Hub 拉取redis镜像ports: 5000:5000端口映射主机:容器将容器 5000 端口暴露到宿主机 5000volumes: .:/code挂载卷宿主机路径:容器路径将当前目录挂载进容器/code实现代码热同步仓库中用于单元测试的示例模型同样遵循这一结构例如 pkg/compose/testdata/compose.yaml 就是仅由service1nginx与service2mysql两个镜像服务组成的极简项目而docs/reference/docker_compose_up.yaml等参考文件展示了up等命令的完整 YAML 用法。启动后常用配套命令有docker compose ps查看容器状态、docker compose logs查看日志、docker compose down停止并移除容器与网络等完整清单见下节。docker compose 命令总览子命令与全局选项根命令用法为docker compose [-f arg...] [options] [COMMAND] [ARGS...]全局可用的子命令如下来源docs/reference/compose.md每个子命令都有独立参考页例如 compose_up.md、compose_down.md子命令说明attach将本地标准输入/输出/错误流附加到服务正在运行的容器bridge将 compose 文件转换为另一种模型build构建或重建服务镜像commit从服务容器变更创建新镜像config以规范格式解析、解析变量并渲染 compose 文件cp在服务容器与本地文件系统间复制文件/目录create为服务创建容器不启动down停止并移除容器、网络events实时接收来自容器的事件exec在运行中的容器内执行命令export将服务容器文件系统导出为 tar 归档images列出已创建容器所使用的镜像kill强制停止服务容器logs查看容器输出ls列出正在运行的 compose 项目pause暂停服务port打印某端口绑定对应的公共端口ps列出容器publish发布 compose 应用OCI 制品pull拉取服务镜像push推送服务镜像restart重启服务容器rm移除已停止的服务容器run在服务上运行一次性命令scale扩缩容服务实例数start启动服务stats实时展示容器资源使用统计stop停止服务top展示容器内运行中的进程unpause恢复暂停的服务up创建并启动容器version显示 Docker Compose 版本信息volumes列出卷wait阻塞直到全部或指定服务容器停止watch监视构建上下文文件变更时重建/刷新容器全部子命令在根命令构建处逐一注册见 cmd/compose/compose.go其中既有面向日常生命周期的up/down/start/stop/restart也有run/exec/cp/attach等调试手段以及watch/publish/scale/bridge等较新的扩展能力。全局选项作用于所有子命令的根级选项如下选项类型默认说明--all-resourcesbool包含所有资源即使未被服务使用--ansistringauto控制何时输出 ANSI 控制字符never/always/auto--compatibilitybool以向后兼容模式运行 compose--dry-runbool以试运行模式执行命令--env-filestringArray指定备用的环境文件-f,--filestringArrayCompose 配置文件路径--parallelint-1最大并发度-1 表示不限制--profilestringArray启用指定 profile--progressstring进度输出类型auto、tty、plain、json、quiet--project-directorystring指定备用工作目录默认第一个 Compose 文件所在目录-p,--project-namestring项目名称这些选项在 cmd/compose/compose.go 的addProjectFlags与RootCommand中有对应实现其中--progress的输出模式tty/plain/json/quiet由selectEventProcessor按是否为终端自动选择--ansi模式还会遵循NO_COLOR约定当设置了非空NO_COLOR时强制关闭颜色。用 -f 定位 Compose 文件合并、搜索与远端资源-f标志用于指定一个或多个 Compose 配置文件的路径来源详见 docs/reference/compose.md 的 Examples 章节指定单个文件文件不必位于当前目录。例如从任意目录对sandbox/rails下的项目执行docker compose -f ~/sandbox/rails/compose.yaml pull db。指定多个文件并合并docker compose -f compose.yaml -f compose.admin.yaml run backup_db。Compose 会按命令行顺序把多个文件合并为一份配置后出现的文件会覆盖并追加先前的字段。例如compose.yaml定义了带image/ports/volumes的webapp服务compose.admin.yaml中同名服务的build与environment字段会合并进该服务形成最终的webapp定义。路径基准使用多个文件时所有相对路径都以第一个-f指定的文件为准可用--project-directory覆盖该基准。从 stdin 读取文件名传-短横线可从标准输入读取配置此时所有路径相对当前工作目录。省略 -f 时的自动查找-f是可选的。不提供时Compose 会从工作目录向上遍历父目录寻找compose.yaml或docker-compose.yaml。这一默认行为也可通过COMPOSE_FILE环境变量改写。此外新版还支持从远端加载 compose 资源OCI 制品docker compose -f oci://registry.example.com/my-compose-project:latest up可将 compose 配置作为 OCI artifact 分发与版本化也可与本地文件混用-f oci://... -f compose.override.yaml up。发布端使用docker compose publish命令。相关远端加载器实现在 pkg/remotegit.go与oci.go并由 cmd/compose/compose.go 中的remoteLoaders按需初始化。Git 仓库支持 HTTPShttps://github.com/user/repo.git、SSHgitgithub.com:user/repo.git等多种 URL 格式可指定分支、标签或提交main、v1.0.0、abc123还可通过#main:path/to/compose.yaml定位仓库内子目录的 compose 文件。使用 git 资源时 Compose 会先克隆仓库再读取指定文件。项目名称的解析优先级-p、COMPOSE_PROJECT_NAME 与 name:每个配置都拥有一个项目名称project name。Compose 按以下优先级确定项目名命令行-p标志COMPOSE_PROJECT_NAME环境变量配置文件中的顶层name:变量若用多个-f文件取最后一个文件的name:包含配置文件的项目目录的basename若有多个-f文件取第一个文件所在目录的 basename若未指定配置文件则取当前目录的 basename。项目名称只能包含小写字母、十进制数字、短横线与下划线且必须以小写字母或十进制数字开头。当目录 basename 违反该约束时必须改用上面其他机制显式命名。项目名直接决定容器与网络等资源的前缀例如$ docker compose -p my_project ps -a NAME SERVICE STATUS PORTS my_project_demo_1 demo running从源码看-p与COMPOSE_PROJECT_NAME的读取在 cmd/compose/compose.go 的toProjectName中实现常量ComposeProjectName COMPOSE_PROJECT_NAME也在该文件顶部集中定义cmd/compose/compose.go。用 profiles 启用可选服务使用--profile可指定一个或多个激活的 profile。例如$ docker compose --profile frontend up会启动带frontendprofile 的服务以及所有未声明 profile 的服务。也可一次启用多个$ docker compose --profile frontend --profile debug up此外COMPOSE_PROFILES环境变量也能达到同样效果。profile 适合管理开发/测试/生产或按需加载的可选服务默认不参与启动。配置并行度--parallel 与 COMPOSE_PARALLEL_LIMIT--parallel用于限制并发执行 Docker Engine 调用的最大数量。例如$ docker compose --parallel 1 pull会逐条拉取 Compose 文件定义的可拉取镜像也可用于控制构建并发。该值同样可由COMPOSE_PARALLEL_LIMIT环境变量设置。源码中resolveMaxConcurrencycmd/compose/compose.go的规则是环境变量生效除非用户在命令行显式传了--parallel解析失败非整数会直接报错。用环境变量配置 Docker Compose许多 compose 选项都可以通过环境变量设置命令行显式传参时对应的环境变量将被忽略。常用映射关系如下环境变量等价于COMPOSE_FILE-fCOMPOSE_PROJECT_NAME-pCOMPOSE_PROFILES--profileCOMPOSE_PARALLEL_LIMIT--parallel在源码 cmd/compose/compose.go 中还集中定义了一批COMPOSE_*常量用途如下COMPOSE_IGNORE_ORPHANStrue停止检测属于当前项目但未在 Compose 文件中声明的孤儿容器COMPOSE_REMOVE_ORPHANS对应up/create的--remove-orphans行为COMPOSE_MENUfalse关闭在前台docker compose up时渲染的辅助菜单也可用docker compose up --menufalse当输出不是终端时菜单自动禁用逻辑见 cmd/compose/up.go 的resolveNavigationMenuCOMPOSE_ENV_FILES未显式使用--env-file时指定默认的环境文件列表COMPOSE_PROGRESS未显式使用--progress时设置进度输出类型COMPOSE_ANSI未显式使用--ansi时控制 ANSI 输出COMPOSE_STATUS_STDOUT控制状态信息写入 stdout。用 Dry Run 模式预演命令避免误操作--dry-run允许在不改变应用栈真实状态的前提下测试命令展示 Compose 实际会执行的每一步。例如$ docker compose --dry-run up --build -d [] Pulling 1/1 ✔ DRY-RUN MODE - db Pulled [] Running 10/8 ✔ DRY-RUN MODE - build service backend ✔ DRY-RUN MODE - writing image dryRun-754a08ddf8bcb1cf22f310f09206dd783d42f7dd ✔ DRY-RUN MODE - naming to nginx-golang-mysql-backend ✔ DRY-RUN MODE - Network nginx-golang-mysql_default Created ✔ DRY-RUN MODE - Container nginx-golang-mysql-db-1 Created ✔ DRY-RUN MODE - Container nginx-golang-mysql-backend-1 Created ✔ DRY-RUN MODE - Container nginx-golang-mysql-proxy-1 Created ✔ DRY-RUN MODE - Container nginx-golang-mysql-db-1 Healthy ✔ DRY-RUN MODE - Container nginx-golang-mysql-backend-1 Started ✔ DRY-RUN MODE - Container nginx-golang-mysql-proxy-1 Started由上例可见up --build的真实执行顺序先拉取db服务镜像 → 构建backend→ 依次创建各容器 →db启动并进入 healthy →backend、proxy等待依赖健康后再启动。需要注意Dry Run 对几乎所有会改变应用栈状态的命令都有效但对ps、ls、logs这类不改变状态的命令没有意义。该能力由--dry-run全局标志触发在 cmd/compose/compose.go 的PersistentPreRunE中通过compose.WithDryRun注入后端。参与开发与问题反馈若希望参与 Docker Compose 的开发请阅读 CONTRIBUTING.md。构建、单元测试make test与端到端测试make e2e需要本地运行 Docker Engine的具体命令可参考 BUILDING.md 与 Makefile单元测试用例分布在 cmd/compose 与 pkg/compose 的*_test.go文件中例如up的端到端场景可查看 pkg/e2e/up_test.go。若发现问题可在项目的 issue 追踪器中提交报告。Legacy关于 Python 版 v1Docker Compose 早期存在 Python 实现的 v1 版本本仓库的 Go 实现则从 v2 时代起成为主流。v1 代码仍可在仓库的v1分支中获取日常使用请以当前 Go 实现v2 起为准其命令行形态即docker compose子命令或独立的docker-compose二进制。总的来说从三步上手到命令行全览再到-f文件合并、项目名优先级、profiles、并行度与 dry-run 预演这套工作流让多容器应用的本地开发、测试与交付变得声明式、可复现且易于自动化——这正是 Docker Compose 长期被广泛采用的根本原因。【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表