使用 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反向代理时如何保持长连接
Mar 31 Servers
如何利用map实现Nginx允许多个域名跨域
Mar 31 Servers
apache基于端口创建虚拟主机的示例
Apr 24 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
CentOS7安装GlusterFS集群以及相关配置
Apr 12 Servers
nginx location 带斜杠【 / 】与不带的区别
Apr 13 Servers
服务器间如何实现文件共享
May 20 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
May 20 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
Linux中各个目录的作用与内容
Jun 28 Servers
win7配置本地ftp服务器的图文教程
Aug 05 Servers
ubuntu20.04虚拟机无法上网的问题及解决
Dec 24 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
python实现批量解析邮件并下载附件
2018/06/19 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
火山动力Java笔试题
2014/06/26 面试题
商务主管岗位职责
2013/12/08 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
银行求职信怎么写
2019/06/20 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
优化Mysql查询的示例
2022/04/26 MySQL
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS