使用 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处理http请求实现过程解析
Mar 31 Servers
Linux安装Nginx步骤详解
Mar 31 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
制作能在nginx和IIS中使用的ssl证书
Jun 21 Servers
Nginx配置之实现多台服务器负载均衡
Aug 02 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
Nginx限流和黑名单配置
May 20 Servers
Nginx开源可视化配置工具NginxConfig使用教程
Jun 21 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 Servers
彻底卸载VMware虚拟机的超详细步骤记录
Jul 15 Servers
Apache自带的ab压力测试工具的实现
Jul 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读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
vue实现购物车案例
2020/05/30 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
python操作CouchDB的方法
2014/10/08 Python
Python读取word文本操作详解
2018/01/22 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
应届生新闻编辑求职信
2013/11/19 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
建议书的格式
2014/05/12 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
民主评议党员工作总结
2014/10/20 职场文书
大学生见习报告总结
2014/11/04 职场文书
2014年维稳工作总结
2014/11/18 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
单位证明范文
2015/06/18 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS
PHP控制循环操作的时间
2021/04/01 PHP
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL