Docker Compose详解

Docker Compose详解使用 DockerCompos 预计阅读时间 11 分钟 DockerCompos 是一种用于帮助定义和共享多容器应用程序的工具 使用 Compose 我们可以创建一个 YAML 文件来定义服务 并且使用一个命令 可以启动所有内容或将其全部关闭 使用 Compose 的最大优势是您可以在一个文件中定义您的应用程序堆栈 将其保存在项目 repo 的根目录中 它现在是版本控制的 并且可以轻松地让其他人为您的项目做出贡献 有人只需要克隆您的存储库并启动撰写应用程序 事实上 你现在可能会在 GitHub Gi

使用 Docker Compose

预计阅读时间:11分钟

Docker Compose是一种用于帮助定义和共享多容器应用程序的工具。使用 Compose,我们可以创建一个 YAML 文件来定义服务,并且使用一个命令,可以启动所有内容或将其全部关闭。

使用 Compose的最大优势是您可以在一个文件中定义您的应用程序堆栈,将其保存在项目 repo 的根目录中(它现在是版本控制的),并且可以轻松地让其他人为您的项目做出贡献。有人只需要克隆您的存储库并启动撰写应用程序。事实上,你现在可能会在 GitHub/GitLab 上看到不少项目正是这样做的。

那么,我们如何开始呢?

安装 Docker Compose

如果您为 Windows 或 Mac 安装了 Docker Desktop/Toolbox,那么您已经拥有 Docker Compose!Play-with-Docker 实例也已经安装了 Docker Compose。如果您在 Linux 机器上,则需要安装 Docker Compose。

安装后,您应该能够运行以下命令并查看版本信息。

$ docker-compose version 

创建 Compose 文件

  1. 在 app 项目的根目录下,创建一个名为 docker-compose.yml.
  2. 在撰写文件中,我们将从定义模式版本开始。在大多数情况下,最好使用支持的最新版本。您可以查看Compose 文件参考。
 version: "3.7" 
  1. 接下来,我们将定义我们希望作为应用程序的一部分运行的服务(或容器)列表。
 version: "3.7" services: 

现在,我们将开始一次将一个服务迁移到 compose 文件中。

定义应用服务

记住,这是我们用来定义应用容器的命令。

$ docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ --network todo-app \ -e MYSQL_HOST=mysql \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=secret \ -e MYSQL_DB=todos \ node:12-alpine \ sh -c "yarn install && yarn run dev" 

如果您使用的是 PowerShell,请使用以下命令:

PS> docker run -dp 3000:3000 ` -w /app -v "$(pwd):/app" ` --network todo-app ` -e MYSQL_HOST=mysql ` -e MYSQL_USER=root ` -e MYSQL_PASSWORD=secret ` -e MYSQL_DB=todos ` node:12-alpine ` sh -c "yarn install && yarn run dev" 
  1. 首先,让我们为容器定义服务入口和镜像。我们可以为服务选择任何名称。该名称将自动成为网络别名,这在定义我们的 MySQL 服务时会很有用。
 version: "3.7" services: app: image: node:12-alpine 
  1. 通常,您会看到command接近image定义的内容,尽管对订购没有要求。所以,让我们继续把它移到我们的文件中。
 version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" 
  1. 让我们通过定义服务来迁移-p 3000:3000命令的一部分ports。我们将在这里使用 短语法,但也有更详细 的长语法可用。
 version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 
  1. 接下来,我们将使用and定义迁移工作目录 ( -w /app) 和卷映射 ( )。Volumes 也有短句和长句。-v "$(pwd):/app"working_dirvolumes

Docker Compose 卷定义的一个优点是我们可以使用当前目录的相对路径。

 version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app 
  1. 最后,我们需要使用environment密钥迁移环境变量定义。
 version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos 

定义 MySQL 服务

现在,是时候定义 MySQL 服务了。我们用于该容器的命令如下:

$ docker run -d \ --network todo-app --network-alias mysql \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7 

如果您使用的是 PowerShell,请使用以下命令:

PS> docker run -d ` --network todo-app --network-alias mysql ` -v todo-mysql-data:/var/lib/mysql ` -e MYSQL_ROOT_PASSWORD=secret ` -e MYSQL_DATABASE=todos ` mysql:5.7 
  1. 我们将首先定义新服务并为其命名,mysql以便它自动获取网络别名。我们将继续并指定要使用的图像。
 version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 
  1. 接下来,我们将定义卷映射。当我们使用 运行容器时docker run,会自动创建命名卷。但是,在使用 Compose 运行时不会发生这种情况。我们需要在顶层 volumes:部分定义卷,然后在服务配置中指定挂载点。通过仅提供卷名,使用默认选项。不过,还有更多选择。
 version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data: 
  1. 最后,我们只需要指定环境变量。
 version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data: 

此时,我们的完成docker-compose.yml应该是这样的:

version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data: 

运行应用程序栈

现在我们有了我们的docker-compose.yml文件,我们可以启动它了!

  1. 确保没有其他 app/db 副本首先运行(docker ps和docker rm -f <ids>)。
  2. docker-compose up使用命令启动应用程序堆栈。我们将添加-d标志以在后台运行所有内容。
 docker-compose up -d 

当我们运行它时,我们应该看到如下输出:

 Creating network "app_default" with the default driver Creating volume "app_todo-mysql-data" with default driver Creating app_app_1 ... done Creating app_mysql_1 ... done 

您会注意到该卷以及一个网络已创建!默认情况下,Docker Compose 会自动为应用程序堆栈创建一个网络(这就是我们没有在 compose 文件中定义的原因)。

  1. docker-compose logs -f让我们使用命令查看日志。您将看到每个服务的日志交错到一个流中。当您想要查看与时间相关的问题时,这非常有用。标志“-f跟随”日志,因此会在生成时为您提供实时输出。

如果您已经运行了该命令,您将看到如下所示的输出:

 mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000 

服务名称显示在行首(通常是彩色的)以帮助区分消息。如果要查看特定服务的日志,可以将服务名称添加到 logs 命令的末尾(例如, docker-compose logs -f app)。

提示:在启动应用程序之前等待 DB

当应用程序启动时,它实际上会等待 MySQL 启动并准备好,然后再尝试连接它。Docker 没有任何内置支持来等待另一个容器完全启动、运行和准备好,然后再启动另一个容器。对于基于节点的项目,您可以使用等待端口 依赖项。其他语言/框架也存在类似的项目。

  1. 此时,您应该能够打开您的应用程序并看到它正在运行。嘿!我们只需要一个命令!

在 Docker Dashboard 中查看应用程序堆栈

如果我们查看 Docker Dashboard,我们会看到有一个名为app的组。这是来自 Docker Compose 的“项目名称”,用于将容器组合在一起。默认情况下,项目名称只是其所在目录的名称 docker-compose.yml。

带有应用程序项目的 Docker 仪表板

如果您旋转应用程序,您将看到我们在 compose 文件中定义的两个容器。这些名称也更具描述性,因为它们遵循. 所以,很容易快速看出我们的应用是什么容器,哪个容器是mysql数据库。

扩展了应用项目的 Docker 仪表板

全部卸下来

当您准备好将其全部拆除时,只需运行docker-compose down或点击整个应用程序的 Docker Dashboard 上的垃圾桶即可。容器将停止,网络将被删除。

一旦拆除,您可以切换到另一个项目,运行docker-compose up并准备为该项目做出贡献!真的没有比这更简单的了!

回顾

在本节中,我们了解了 Docker Compose 以及它如何帮助我们显着简化多服务应用程序的定义和共享。我们通过将我们使用的命令翻译成适当的撰写格式来创建一个撰写文件。

至此,我们开始结束本教程。然而,我们想要介绍一些关于镜像构建的最佳实践,因为我们一直在使用的 Dockerfile 存在一个大问题。那么,让我们来看看吧!

高级用法:Docker Compose 高级用法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233839.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月17日 下午2:01
下一篇 2025年6月17日 下午2:22


相关推荐

  • docker导出容器为镜像_docker如何将容器打包成镜像

    docker导出容器为镜像_docker如何将容器打包成镜像1、docker镜像、容器导出方式dockersave#IDor#Namedockerexport#IDor#Name2、save和export区别(1)、对于DockerSave方法,会保存该镜像的所有历史记录(2)、对于DockerExport方法,不会保留历史记录,即没有commit历史(3)、dockersave保存的是镜像(image),dockerexport保存的是容器(container);(4)、dockerload用来载入镜像包,dock

    2025年9月18日
    5
  • 群晖docker mysql_Watchtower – 群晖自动更新 Docker 映像与容器

    群晖docker mysql_Watchtower – 群晖自动更新 Docker 映像与容器群晖的Docker功能非常丰富,不过也有不完美的地方,映像和容器更新比较麻烦,比如我的Docker容器运行了十几个,如果通过手动更新非常繁琐,容器还需要重新配置本文就介绍如何通过watchtower全自动更新Docker映像,并保留原始配置重新运行容器。watchtower是一个可以监控正在运行的容器镜像是否有更新的工具,当本地镜像与远端镜像有差异的时候,可以自动使用当前容器的运行参数以新镜像重…

    2025年6月13日
    5
  • docker的常用命令汇总_常用docker命令

    docker的常用命令汇总_常用docker命令文章目录Docker命令总结Docker命令总结还在百度Docker命令?推荐一套我用起来特顺手的命令!简介:Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。Docker镜像官网阿里云镜像中心Docker环境安装:#安装yum-utilsyuminstall-yyum-utilsdevice-mapper-persistent-dat

    2026年1月17日
    4
  • es集群搭建_k8s和docker搭建es集群

    es集群搭建_k8s和docker搭建es集群单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。ES集群搭建_使用docker-海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点-单点故障问题:将分片数据在不同节点备份(replica)ES集群介绍为什么需要集群ES集群相关概念搭建ES集群集群职责划分集群脑裂问题…

    2022年10月12日
    7
  • docker镜像导入导出_导出docker镜像

    docker镜像导入导出_导出docker镜像简介当服务器无法访问公网的时候,又要pull镜像,这个时候可以将其他服务上的镜像导出,然后再导入到要用的服务器。方法一:1.保存save-加载load格式:dockersaveIMAGE(镜像)使用dockerimages查看本机已有的镜像(也可以使用dockercommit命令把一个正在运行的容器保存为镜像),如:导出:格式:dockersaveimagesID>/存放位置/打包文件名.tardockersave42cdba9f1b08

    2025年9月18日
    7
  • docker部署redis哨兵集群_redis部署安装

    docker部署redis哨兵集群_redis部署安装Docker安装Docker部署redis在dockerhub上可以看到有redis的官方镜像不去网站,也可以通过如下命令查看有那些镜像可用Dockersearch命令dockersearchredis拉取redis镜像Dockerpull命令这里我们拉取官方的最新版本的镜像:dockerpullredis:latest查看本地镜像Dockerimages命令有redis和hello-world运行容器Dockerrun命令d

    2022年10月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号