使用 Docker Compose 构建复杂的多容器App


Posted in Servers onApril 30, 2022

1 为什么需要 Docker Compose

在构建容器过程中,一般需要重复运行一些命令, 如 docker builddocker run 等等,这些命令有时冗长而复杂,逐个重复运行这些命令十分繁琐,对于多容器的复杂应用尤其如此。使用 Docker Compose 工具能极大地简化容器的创建、管理和维护。

2 什么是 Docker Compose

Docker Compose 工具相当于 C/C++ 的 make 工具,使用 make 需要 Makefile,所有的编译链接设置都在Makefile 中指定,不需要为了运行程序而每次都在终端手动输入长串的指令。

Docker Compose 同样也需要一个配置文件: docker-compose.yaml(文件扩展名也可以是 yml).

YAML 是一种人类可读的数据序列化语言,通常用于配置文件和存储或传输数据的应用程序,YAML 使用 python 那样的缩进以指示嵌套关系。缩进通常使用两个空格,但是实际上没有限制,同 python,使用 # 表示注释。

3 Docker Compose 的使用

如下是一个 Mern Stack App 项目结构:

使用 Docker Compose 构建复杂的多容器App

docker-compose.yaml 文件内容如下:

# docker compose 规范的版本,下面的网站可查
# https://docs.docker.com/compose/compose-file/compose-versioning/
version: "3.8"  
# 此 mern 将创建3个容器,下面的3个服务
# mongodb, backend, frontend 将自动被翻译成3个容器
services:  
  mongodb:
  	# 从 hub.docker.com 获取官方image
    image: "mongo" 
	# 命名卷: 持久化保存数据库数据
    volumes:
      - data:/data/db
    
    # 环境变量,在文件 ./env/mongo.env 里保存
    env_file:
      - ./env/mongo.env
  backend:
    build: ./backend
    ports:
      - "80:80"
    volumes:
      # 命名卷
      - logs:/app/logs
      # 绑定挂载,不同于命令,此文件中可以使用相对路径,
      # 手动运行命令则需绝对路径
      - ./backend:/app
      # 匿名卷
      - /app/node_modules
    env_file:
      - ./env/backend.env
    depends_on:
      - mongodb
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend/src:/app/src
	
	# stdin_open 和 tty 对应手动执行命令时的 -it
    stdin_open: true
    tty: true
    
    # 仅仅在容器 backend 运行后,才会运行此 frontend
    depends_on:
      - backend
      - 
# 这里是整个 App 的命名卷
# 匿名卷和 bind-mounts 不能在这里指定
volumes:
  data:
  logs:

3.1 启动容器

docker-compose up

docker-compose up 默认以附加模式运行,如果需要以分离模式运行则在命令后加 -d:

docker-compose up -d

也因为此原因,docker-compose.yaml 里没有设置 -d 的选项。

3.2 停止并删除容器

docker-compose down
  • 使用 Docker Compose, Dockerfile 文件仍然必不可少。 Docker Compose创建一个默认网络并将所有容器添加到该网络,故 docker-compose.yaml 里不需要指定网络。
  • docker-compose down 将停止并删除容器,因此 docker-compose.yaml 没有选项 --rm

不管是单容器还是多容器,使用 Docker Compose 能极大简化容器的创建、管理和维护,由此可见,Docker Compose 是一个强大的非常有用的工具。

到此这篇关于使用 Docker Compose 构建复杂的多容器 App的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
基于Nginx实现限制某IP短时间访问次数
Mar 31 Servers
Nginx+SpringBoot实现负载均衡的示例
Mar 31 Servers
小程序后台PHP版本部署运行 LNMP+WNMP
Apr 01 Servers
Nginx下配置Https证书详细过程
Apr 01 Servers
Nginx+Windows搭建域名访问环境的操作方法
Mar 17 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
从零开始在Centos7上部署SpringBoot项目
Apr 07 Servers
Apache Hudi 加速传统的批处理模式
Apr 24 Servers
nginx配置限速限流基于内置模块
May 02 Servers
聊聊配置 Nginx 访问与错误日志的问题
May 25 Servers
GPU服务器的多用户配置方法
Jul 07 Servers
搭建Yolov5服务器
KVM基础命令详解
Apr 30 #Servers
Win10 Anaconda安装python-pcl
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 #Servers
解决IIS7下无法绑定https主机的问题
IIS服务器中设置HTTP重定向访问HTTPS
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
You might like
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python SQLite3简介
2018/02/22 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
深入了解python中元类的相关知识
2019/08/29 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
数据库什么时候应该被重组
2012/11/02 面试题
中秋节超市促销方案
2014/01/30 职场文书
网管求职信
2014/03/03 职场文书
安全技术说明书
2014/05/09 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
杨善洲电影观后感
2015/06/04 职场文书
你会写请假条吗?
2019/06/26 职场文书