一个专案由多个container组成,如前几天的Web,前端由apache、後端由express、服务器由postgres组成。但是基本上每个Container都各自更新为政,彼此的DockerNet连结依靠着Docker自动生成IP。每次都要写docker run
去输入一堆参数。有没有办法让这些参数写成文件化更方便控管呢? 有! 就是Docker-compose!!
Docker-compose你可以如下图,理解成一个章鱼小帮手,帮你把许许多多的Container建立起来。
当我们程序修改後执行docker-compose命令可以自动抓到哪一个image改变,并专门为其重新build、run,大大增加了部属的效率。
我们直接来看看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写法写上对内对外PORTvolumes:
决定volumes假如你的docker-compose.yml有很多环境变数,你可以加入.env
档(里面VAR=VALUE
)在与docker-compose.yml档同一个目录下,默认会自动抓取变数。
写好docker-compose.yml档後该如何执行呢? 以下为执行命令
docker-compose up
这是建构,会直接扫描当前目录下的docker-compose.yml档并进行build 所有的image并建立好container。
-d
背景执行,我们通常会加上这一个参数-f <path.yml>
指定yml--force-rm
强制删除所有container再重run--no-cache
强制重新buiild所有imagedocker-compose stop/rm/restart/down
停止、删除、重新启动、停止并删除执行完後会出现三个container包再一起,他们彼此网路是互相连接的,我们称做docker stack
成功抓取网页:
详细程序码可以参考Github
>>: [30天 Vue学好学满 DAY17] Event Bus
创建App-上传图片 本App中会使用多种不同的图片来显示不同的主题,所以上传不同图片来使用! 例如...
昨天有说到div因为block这个元素而占了整行无法并排,今天就来说一下block是甚麽样的元素 d...
睡觉、运动、读书、写日记、呼吸冥想、跟久未联络的朋友联系,这些常被推崇的快乐生活指南,我这个月都实践...
最近实在是有点折磨,刚把民航局的案子吿一个段落,最近接到一个大案子,每天要腾个一小时来处理;晚上 I...
多向选择结构让程序执行路径可以有无限多种选项, 我们可以使用多个 if-elif-else 来达成多...