3.8 使用 Docker Compose

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

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

那么,我们如何开始呢?

安装 Docker Compose

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

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

$ docker compose version

创建撰写文件

  1. 在应用程序项目的根目录下,创建一个名为docker-compose.yml.

  2. 在撰写文件中,我们将从定义模式版本开始。在大多数情况下,最好使用最新的受支持版本。您可以查看 当前架构版本和兼容性矩阵的Compose 文件参考。

     version: "3.7"
    
  3. 接下来,我们将定义要作为应用程序的一部分运行的服务(或容器)列表。

     version: "3.7"services:
    

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

定义应用服务

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

$ 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:latest \sh -c "yarn config set registry https://registry.npm.taobao.org/ && 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 config set registry https://registry.npm.taobao.org/ && yarn install && yarn run dev"
  1. 首先,让我们为容器定义服务入口和镜像。我们可以为服务选择任何名称。该名称将自动成为网络别名,这在定义我们的 MySQL 服务时会很有用。

     version: "3.7"services:app:image: latest
    
  2. 通常,您会看到command临近image定义的值,尽管对排序没有要求。所以,让我们继续将它移到我们的文件中。

     version: "3.7"services:app:image: node:latestcommand: sh -c "yarn install && yarn run dev"
    
  3. 让我们通过为服务定义 来迁移-p 3000:3000命令的一部分。ports我们将在这里使用 短语法,但也可以使用更冗长 的长语法。

     version: "3.7"services:app:image: node:12-alpinecommand: sh -c "yarn install && yarn run dev"ports:- 3000:3000
    
  4. 接下来,我们将使用working_dir和volumes定义迁移工作目录(-w/app)和volumes映射(-v“$(pwd):/app”)。卷也有短和长语法。

     version: "3.7"services:app:image: node:12-alpinecommand: sh -c "yarn install && yarn run dev"ports:- 3000:3000working_dir: /appvolumes:- ./:/app
    
  5. 最后,我们需要使用environment密钥迁移环境变量定义。

    version: "3.7"services:app:image: node:latestcommand: sh -c "yarn config set registry https://registry.npm.taobao.org/ && yarn install && yarn run dev"ports:- 3000:3000working_dir: /appvolumes:- ./:/appenvironment:MYSQL_HOST: mysqlMYSQL_USER: rootMYSQL_PASSWORD: secretMYSQL_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.25

如果您使用的是 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.25
  1. 我们将首先定义新服务并为其命名,mysql以便它自动获取网络别名。我们将继续并指定要使用的镜像。

     version: "3.7"services:app:# The app service definitionmysql:image: mysql:5.7.25
    
  2. 接下来,我们将定义卷映射。当我们使用 运行容器时docker run,会自动创建指定的卷。但是,使用 Compose 运行时不会发生这种情况。我们需要在顶级 volumes:部分定义卷,然后在服务配置中指定挂载点。通过仅提供卷名,将使用默认选项。不过还有更多选项可用。

     version: "3.7"services:app:# The app service definitionmysql:image: mysql:5.7.25volumes:- todo-mysql-data:/var/lib/mysqlvolumes:todo-mysql-data:
    
  3. 最后,我们只需要指定环境变量即可。

     version: "3.7"services:app:# The app service definitionmysql:image: mysql:5.7.25volumes:- todo-mysql-data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: secretMYSQL_DATABASE: todosvolumes:todo-mysql-data:
    

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

version: "3.7"services:app:image: node:12-alpinecommand: sh -c "yarn install && yarn run dev"ports:- 3000:3000working_dir: /appvolumes:- ./:/appenvironment:MYSQL_HOST: mysqlMYSQL_USER: rootMYSQL_PASSWORD: secretMYSQL_DB: todosmysql:image: mysql:5.7.25volumes:- todo-mysql-data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: secretMYSQL_DATABASE: todosvolumes:todo-mysql-data:

运行应用程序堆栈

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

  1. 确保没有正在运行的应用程序/数据库,首先运行(docker psdocker rm -f <ids>)。

  2. docker compose up使用命令启动应用程序堆栈。我们将添加-d标志以在后台运行所有内容。

     $ docker compose up -d
    

    当我们运行它时,我们应该看到这样的输出:

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

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

  3. 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 mysqlapp_1    | Listening on port 3000
    

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

    提示:在启动应用程序之前等待数据库

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

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

查看应用程序堆栈

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

如果您向下旋转应用程序,您将看到我们在 compose 文件中定义的两个容器。名称也更具描述性,因为它们遵循<service-name>-<replica-number>. 所以,很容易快速看出哪个容器是我们的app,哪个容器是mysql数据库。

全部删除

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

警告

删除卷

默认情况下,运行docker compose down时不会删除撰写文件中的命名卷。如果要删除卷,则需要添加--volumes标志。

当您删除应用程序堆栈时,Docker 仪表板不会删除卷。

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

个人写的小程序,有需求的可以看看:
热门头像|个性头像|高清头像|性感壁纸|美女壁纸|炫酷壁纸|省电壁纸|唯美壁纸
海量资源 应用尽有 免费下载


3.8 Docker最新入门教程-Docker入门-使用 Docker Compose相关推荐

  1. 基金投资入门教程-----基金入门

    基金投资入门教程-----基金入门 基金投资入门教程-----基金入门 1.基金入门 什么是基金 基金的三大优势 基金的风险 基金投资入门教程-----基金入门 1.基金入门 什么是基金 基金的三大优 ...

  2. Docker最全教程之树莓派和Docker(十六)

    前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...

  3. 【动力节点】springmvc框架入门教程-从入门到精通

    目录 一.Springmvc入门 1.Springmvc是什么 2.Springmvc处理流程 3.入门程序 二.springMVC架构 1.springMVC的架构图 2.架构流程 3.spring ...

  4. 计算机linux入门教程,Turbolinux入门教程1

    原标题:Turbolinux入门教程1 第一课:什么是Linux 简单地说, Linux 是一套免费使用和自由传播的类 Unix 操作系统,它主要用于基于 Intel x86 系列 CPU 的计算机上 ...

  5. hazelcast入门教程_Hazelcast入门指南第7部分

    hazelcast入门教程 这是解释如何使用Hazelcast的系列文章的续篇. 如果一个人没有阅读其他六个帖子,请转到目录并阅读其他帖子. 不同的地图种类 Hazelcast的MultiMap打破了 ...

  6. hazelcast入门教程_Hazelcast入门指南第6部分

    hazelcast入门教程 这是有关Hazelcast的一系列文章中的第六篇. 如果一个人没有看过过去的五年,请到表中的内容后 ,我创建赶上. 本地客户 在上一篇文章之后,我决定要去本地化. 是的,我 ...

  7. hazelcast入门教程_Hazelcast入门指南第5部分

    hazelcast入门教程 这是我撰写的有关Hazelcast的一系列文章的延续. 我强烈建议您阅读其他内容: 第1 部分 , 第2 部分 , 第3 部分和第4部分 . 一气呵成的东西 这篇文章中没有 ...

  8. hazelcast入门教程_Hazelcast入门指南第2部分

    hazelcast入门教程 本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续. 如果尚未阅读第一篇文章,请单击此处 . 分布式馆藏 Hazelcast具有许多可用于存储数据的分 ...

  9. hazelcast入门教程_Hazelcast入门指南第4部分

    hazelcast入门教程 这是我的Hazelcast系列的第四部分. 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 . 记录中 日志记录是任何应用程序的重要功能 ...

  10. hazelcast入门教程_Hazelcast入门指南第3部分

    hazelcast入门教程 这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续. 如果您还没有阅读最后两个,我鼓励阅读它们: Hazelcast入门指南第1部分 Hazelcast ...

最新文章

  1. 使用Python部署机器学习模型的10个实践经验
  2. 测试系统存储是大端模式还是小端模式的方法
  3. 3-spark学习笔记-SparkAPI
  4. mysql opensuse_opensuse免安装mysql
  5. linux简单文件管理命令的使用
  6. 笔试题??智商题??(一)
  7. XposedNoRebootModuleSample 不需要频繁重启调试的Xposed 模块源码例子
  8. Mysql 分组后组内排序按字段取最大或最小的数据
  9. 【CodeVS】 p1696 奇怪的函数
  10. 推荐几个不错的苹果电脑截图工具
  11. 计算机win7系统还原,win7还原系统——win7系统还原出厂设置
  12. 时间计算题100道_这三个马政经计算题,你能对几个?
  13. Unity3D中玻璃、金属材质制作
  14. 新生报到小程序,微信小程序新生入学,微信小程序新生报到系统毕业设计作品
  15. python里的点_Python里面这些点,据说80%的新手都会一脸懵逼
  16. 最小攻击超过最大攻击_贪婪洞窟攻击力解析 最大攻击与最小攻击对比分析
  17. 华为认证发布3000元“考证奖励”后,又有啥新动作?
  18. python画柱形图显示数值_python画柱状图--不同颜色并显示数值的方法
  19. reverse()和reverse_copy()用法
  20. 关于64位整型int64_t

热门文章

  1. java 实现输出: (a) 输出把错别字替换为正确用字的字符串。 (b) 将“桂工同学”替换为自己的姓名。
  2. 代理模式(Proxy模式)详解
  3. 企业基于IM部署统一通信系统
  4. tp5 Loader.php,ThinkPHP5 Loader 类介绍以及使用 | 剑花烟雨江南
  5. hibernate的Hql语句
  6. 支付宝免签最新转账,直接H5拉起超低风控!
  7. 【Photoshop API 】六、 实际案例:在.atn文件中播放所有动作
  8. 移动端富文本编辑器iOS、Android
  9. 微信新玩法!这些关键词可触发表情雨
  10. 和小程序斗智斗勇那些事