3.8 Docker最新入门教程-Docker入门-使用 Docker Compose
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
创建撰写文件
在应用程序项目的根目录下,创建一个名为
docker-compose.yml
.在撰写文件中,我们将从定义模式版本开始。在大多数情况下,最好使用最新的受支持版本。您可以查看 当前架构版本和兼容性矩阵的Compose 文件参考。
version: "3.7"
接下来,我们将定义要作为应用程序的一部分运行的服务(或容器)列表。
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"
首先,让我们为容器定义服务入口和镜像。我们可以为服务选择任何名称。该名称将自动成为网络别名,这在定义我们的 MySQL 服务时会很有用。
version: "3.7"services:app:image: latest
通常,您会看到
command
临近image
定义的值,尽管对排序没有要求。所以,让我们继续将它移到我们的文件中。version: "3.7"services:app:image: node:latestcommand: sh -c "yarn install && yarn run dev"
让我们通过为服务定义 来迁移
-p 3000:3000
命令的一部分。ports
我们将在这里使用 短语法,但也可以使用更冗长 的长语法。version: "3.7"services:app:image: node:12-alpinecommand: sh -c "yarn install && yarn run dev"ports:- 3000:3000
接下来,我们将使用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
最后,我们需要使用
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
我们将首先定义新服务并为其命名,
mysql
以便它自动获取网络别名。我们将继续并指定要使用的镜像。version: "3.7"services:app:# The app service definitionmysql:image: mysql:5.7.25
接下来,我们将定义卷映射。当我们使用 运行容器时
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:
最后,我们只需要指定环境变量即可。
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
文件,我们可以启动它了!
确保没有正在运行的应用程序/数据库,首先运行(
docker ps
和docker rm -f <ids>
)。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 文件中定义的原因)。
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 没有任何内置支持来等待另一个容器完全启动、运行并准备就绪,然后再启动另一个容器。对于基于节点的项目,您可以使用等待端口 依赖项。其他语言/框架也存在类似的项目。
此时,您应该能够打开您的应用程序并看到它正在运行。嘿!我们只有一个命令!
查看应用程序堆栈
如果我们查看 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.基金入门 什么是基金 基金的三大优 ...
- Docker最全教程之树莓派和Docker(十六)
前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...
- 【动力节点】springmvc框架入门教程-从入门到精通
目录 一.Springmvc入门 1.Springmvc是什么 2.Springmvc处理流程 3.入门程序 二.springMVC架构 1.springMVC的架构图 2.架构流程 3.spring ...
- 计算机linux入门教程,Turbolinux入门教程1
原标题:Turbolinux入门教程1 第一课:什么是Linux 简单地说, Linux 是一套免费使用和自由传播的类 Unix 操作系统,它主要用于基于 Intel x86 系列 CPU 的计算机上 ...
- hazelcast入门教程_Hazelcast入门指南第7部分
hazelcast入门教程 这是解释如何使用Hazelcast的系列文章的续篇. 如果一个人没有阅读其他六个帖子,请转到目录并阅读其他帖子. 不同的地图种类 Hazelcast的MultiMap打破了 ...
- hazelcast入门教程_Hazelcast入门指南第6部分
hazelcast入门教程 这是有关Hazelcast的一系列文章中的第六篇. 如果一个人没有看过过去的五年,请到表中的内容后 ,我创建赶上. 本地客户 在上一篇文章之后,我决定要去本地化. 是的,我 ...
- hazelcast入门教程_Hazelcast入门指南第5部分
hazelcast入门教程 这是我撰写的有关Hazelcast的一系列文章的延续. 我强烈建议您阅读其他内容: 第1 部分 , 第2 部分 , 第3 部分和第4部分 . 一气呵成的东西 这篇文章中没有 ...
- hazelcast入门教程_Hazelcast入门指南第2部分
hazelcast入门教程 本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续. 如果尚未阅读第一篇文章,请单击此处 . 分布式馆藏 Hazelcast具有许多可用于存储数据的分 ...
- hazelcast入门教程_Hazelcast入门指南第4部分
hazelcast入门教程 这是我的Hazelcast系列的第四部分. 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 . 记录中 日志记录是任何应用程序的重要功能 ...
- hazelcast入门教程_Hazelcast入门指南第3部分
hazelcast入门教程 这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续. 如果您还没有阅读最后两个,我鼓励阅读它们: Hazelcast入门指南第1部分 Hazelcast ...
最新文章
- 使用Python部署机器学习模型的10个实践经验
- 测试系统存储是大端模式还是小端模式的方法
- 3-spark学习笔记-SparkAPI
- mysql opensuse_opensuse免安装mysql
- linux简单文件管理命令的使用
- 笔试题??智商题??(一)
- XposedNoRebootModuleSample 不需要频繁重启调试的Xposed 模块源码例子
- Mysql 分组后组内排序按字段取最大或最小的数据
- 【CodeVS】 p1696 奇怪的函数
- 推荐几个不错的苹果电脑截图工具
- 计算机win7系统还原,win7还原系统——win7系统还原出厂设置
- 时间计算题100道_这三个马政经计算题,你能对几个?
- Unity3D中玻璃、金属材质制作
- 新生报到小程序,微信小程序新生入学,微信小程序新生报到系统毕业设计作品
- python里的点_Python里面这些点,据说80%的新手都会一脸懵逼
- 最小攻击超过最大攻击_贪婪洞窟攻击力解析 最大攻击与最小攻击对比分析
- 华为认证发布3000元“考证奖励”后,又有啥新动作?
- python画柱形图显示数值_python画柱状图--不同颜色并显示数值的方法
- reverse()和reverse_copy()用法
- 关于64位整型int64_t
热门文章
- java 实现输出: (a) 输出把错别字替换为正确用字的字符串。 (b) 将“桂工同学”替换为自己的姓名。
- 代理模式(Proxy模式)详解
- 企业基于IM部署统一通信系统
- tp5 Loader.php,ThinkPHP5 Loader 类介绍以及使用 | 剑花烟雨江南
- hibernate的Hql语句
- 支付宝免签最新转账,直接H5拉起超低风控!
- 【Photoshop API 】六、 实际案例:在.atn文件中播放所有动作
- 移动端富文本编辑器iOS、Android
- 微信新玩法!这些关键词可触发表情雨
- 和小程序斗智斗勇那些事