Day 15: Docker-compose建立Web专案

Docker-compose

一个专案由多个container组成,如前几天的Web,前端由apache、後端由express、服务器由postgres组成。但是基本上每个Container都各自更新为政,彼此的DockerNet连结依靠着Docker自动生成IP。每次都要写docker run去输入一堆参数。有没有办法让这些参数写成文件化更方便控管呢? 有! 就是Docker-compose!!

https://ithelp.ithome.com.tw/upload/images/20210917/20119044QzGD1NndmT.png

Docker-compose你可以如下图,理解成一个章鱼小帮手,帮你把许许多多的Container建立起来。
https://ithelp.ithome.com.tw/upload/images/20210926/20119044dlYT1QSqIE.jpg

当我们程序修改後执行docker-compose命令可以自动抓到哪一个image改变,并专门为其重新build、run,大大增加了部属的效率。

docker-compose.yml

我们直接来看看Day14的Node前後端分离该怎麽改成用Docker-compose,在根目录下建立一个docker-compose.yml,docker-compose.yml写法范例如下:

version: "3.9"
services:
  frontend:
    build: ./html
    image: myweb:latest
    ports:
      - 8085:80
    container_name: run_myweb
  backend:
    build: ./app
    image: mynode:latest
    ports:
      - 4200:3000
    container_name: run_mynode
  db:
    image: postgres
    ports:
      - 5432:5432
    container_name: my_postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - pgdata:/var/lib/postgresql/data/

volumes:
  pgdata:  

docker-compose是为了取代过去docker run冗长的参数输入过程,在service下每一个都是一个container。如上建立了run_myweb、run_mynode、my_postgres三个container。

docker-compose.yml该如何撰写呢?详细的文件在这里。但是太多了,如下列出一些比较重要的参数:

  • build: 输入一个dockerfile的位置,更多资讯参考这里
  • image: 决定了一个container的base image,如果没有build将会从远端拉下来,如果有build会是build後的image名称。
  • container_name: container的名称
  • environment: build与container的参数类似ENV,接受MAP(- K:V)、ARRAY(K=V)写法
  • env_file: 传入.env的路径让建构的参数更方便修改,多个则用MAP写法
  • ports: 用MAP写法写上对内对外PORT
  • volumes: 决定volumes

假如你的docker-compose.yml有很多环境变数,你可以加入.env档(里面VAR=VALUE)在与docker-compose.yml档同一个目录下,默认会自动抓取变数。
https://ithelp.ithome.com.tw/upload/images/20210927/201190444nkZv0eOjd.png

docker-compose指令:

写好docker-compose.yml档後该如何执行呢? 以下为执行命令

  • docker-compose up 这是建构,会直接扫描当前目录下的docker-compose.yml档并进行build 所有的image并建立好container。
    • -d 背景执行,我们通常会加上这一个参数
    • -f <path.yml> 指定yml
    • --force-rm 强制删除所有container再重run
    • --no-cache 强制重新buiild所有image
  • docker-compose stop/rm/restart/down 停止、删除、重新启动、停止并删除

执行完後会出现三个container包再一起,他们彼此网路是互相连接的,我们称做docker stack
https://ithelp.ithome.com.tw/upload/images/20210926/20119044qbQ9Si7V3T.png

成功抓取网页:
https://ithelp.ithome.com.tw/upload/images/20210926/20119044KHIgDCykYQ.png

详细程序码可以参考Github


<<:  why

>>:  [30天 Vue学好学满 DAY17] Event Bus

创建App-上传图片

创建App-上传图片 本App中会使用多种不同的图片来显示不同的主题,所以上传不同图片来使用! 例如...

css display

昨天有说到div因为block这个元素而占了整行无法并排,今天就来说一下block是甚麽样的元素 d...

离职倒数26天:快乐生活指南

睡觉、运动、读书、写日记、呼吸冥想、跟久未联络的朋友联系,这些常被推崇的快乐生活指南,我这个月都实践...

Day 8 纸上原型 dirty prototype

最近实在是有点折磨,刚把民航局的案子吿一个段落,最近接到一个大案子,每天要腾个一小时来处理;晚上 I...

[Day_14]选择性结构- 多向选择结构、条件判断与运算子「in」

多向选择结构让程序执行路径可以有无限多种选项, 我们可以使用多个 if-elif-else 来达成多...