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(k8s)安装Kafka并使用宿主机连接

    使用Docker(k8s)安装Kafka并使用宿主机连接使用Docker(k8s)安装Kafka并使用宿主机连接安装Docker及docker-compose具体安装方法可以去官网看教程检查docker-compose是否安装成功创建docker-compose.yml文件version:’2’services:zookeeper:image:”zookeeper”hostname:”zookeeper.local”container_name:”zookeeper”#设置网络别名可随

    2022年8月21日
    7
  • docker安装 搭建私库 删除私库镜像 打印私库镜像 的shell脚本[通俗易懂]

    docker安装 搭建私库 删除私库镜像 打印私库镜像 的shell脚本[通俗易懂]#!/bin/bash#本脚本可以打印私有镜像库中所有的镜像#私有镜像库地址HUB_URL=hub.dy.com:5000#取得所有私有镜像库的所有镜像IMAGESLIST=$(curl-shttp://${HUB_URL}/v2/_catalog)#echo${IMAGESLIST}#删除后2个字符IMAGESLIST=${IMAGESLIST::-2}#删除…

    2022年7月18日
    17
  • Docker安装RabbitMQ教程「建议收藏」

    Docker安装RabbitMQ教程「建议收藏」本章教程介绍如何利用Docker快速搭建RabbitMQ环境。目录一、拉取镜像二、运行容器三、访问测试一、拉取镜像dockerpullrabbitmq:3.7.7-management二、运行容器dockerrun-d–namerabbitmq3.7.7-p5672:5672-p15672:15672-v`pwd`/data:/var/lib/rabbitmq–hostnamemyRabbit-eRABBITMQ_DEFAUL..

    2022年5月23日
    38
  • docker vscode远程调试_为什么要使用docker

    docker vscode远程调试_为什么要使用docker### 简介code server是一款开源的桌面软件vs code浏览器实现,可以让你随时随地的写代码,只要打开浏览器就可以进入到工作环境,将代码放在云端十分方便。### 安装流程只需要在docker环境下安装即可,输入如下命令安装即可,第一次安装会慢一点。dockerrun-itd–namemycode-p8081:8080-v/data/mycode:/home/coder/project-uroot-ePASSWORD=123

    2022年8月14日
    11
  • java服务容器_Java容器和Docker这种服务容器差别?

    java服务容器_Java容器和Docker这种服务容器差别?weipeng2kJav 容器技术和 docker 技术可以看做是一个互补的技术 我们在虚拟机基础上创建了多个 docker 容器 而一个 docker 容器在应对一些低流量的系统时 最低还是需要分配 4 核 8G 左右的配置 这其实还是一种浪费 如果虚拟机是大石块 那么 docker 就是小石块 Java 容器技术就是沙子 三者搭配能够更好的提升使用效率

    2026年3月16日
    1
  • 利用群晖nas Docker平台安装qb(qbittorrent)实现PT/BT

    利用群晖nas Docker平台安装qb(qbittorrent)实现PT/BT利用群晖这个低功耗平台挂机上传/下载应该在合适不过了话不多说,我们赶紧开始我使用的是黑裙,系统的版本是DSM6.11、安装Docker(已经安装好的可以直接跳到第二步)点击套件中心→点击左侧全部→滚动到中间位置就能找到“Docker”(鲸鱼游轮的ICO好可爱)当然也可以直接在搜索栏里搜索Docker,都是可以的稍等片刻以后,点击左上角呼出“所有程序”会出现一个Docke…

    2022年10月11日
    5

发表回复

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

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