使用 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 location中多个if里面proxy_pass的方法
Mar 31 Servers
Nginx反爬虫策略,防止UA抓取网站
Mar 31 Servers
nginx配置文件使用环境变量的操作方法
Jun 02 Servers
配置nginx 重定向到系统维护页面
Jun 08 Servers
nginx共享内存的机制详解
Mar 21 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
nginx 配置指令之location使用详解
May 25 Servers
Win2008系统搭建DHCP服务器
Jun 25 Servers
Windows Server 2012 R2服务器安装与配置的完整步骤
Jul 15 Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 Servers
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
Aug 14 Servers
VMware虚拟机安装 Windows Server 2022的详细图文教程
Sep 23 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
五个PHP程序员工具
2008/05/26 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
JavaScript实现下拉列表
2021/01/20 Javascript
python实现连接mongodb的方法
2015/05/08 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
Python常见数字运算操作实例小结
2019/03/22 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
亿企通软件测试面试题
2012/04/10 面试题
启动一个线程是用run()还是start()
2016/12/25 面试题
地下停车场租赁协议范本
2014/10/07 职场文书
单位计划生育责任书
2015/05/09 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
证婚人致辞精选
2015/07/28 职场文书