本文为Docker的中阶应用:
- docker 命令及 Dockerfile 等为 Docker 的基本应用。
- docker-compose 为 Doccker 的中阶应用,您应该先了解 docker 的命令及 Dockerfile 等相关设置。
- docker swam 及 stack 为 Docker 的高阶应用。
如果您对Docker的基本应用还不是很了解,可先参考我的另一篇文章:
前言
我们会用docker --network创建多个container互连,但是如果四个container时,
是不是就要下四次docker run不同container的命令,杀了我吧,
本文介绍透过docker-compose这个yaml档,帮我们定义多个container的创建。
并且了解如何用dokcer-compose -f 参数加载更多个yml设置档。
这篇文章只是提供一个基本的docker-compose使用情境,
您应可以参考相关的docker-compose范本更深入的了解每个设置的意思。
Docker官网compose档的说明,请参考:
https://docs.docker.com/compose/compose-file/
docker-compose参数
这里使用我的D-Laravel v1.0.0为范本 (D-Laravel是一个使用 docker-compose 创建的Laravel框架的开发环境)
D-Laravel v1.0.0版已将sample数据夹内的yaml档独立移出来了,
放入到service数据夹内,例如redis.yml,我们可以自行创建更多的yaml档到service的数据夹用。
进入正题,如果我们想在原有的 docker-compose.yml 档添加更多的 yaml 档怎么做呢?
例如:我们想添加redis的服务. (使用docker-compose官方命令)
参数 | 说明 |
---|---|
-p | 为project-name (默认为数据夹名称),因此不指定时,project-name默认为dlaravel。 |
-f | 定义额外的compose档(默认是docker-compose.yml) |
up -d | Detached mode: 让container在背景运行,并印出新的container名称。 |
小提示: 跟git或Laravel的php artisan一样,我们一样都可以用 help 来查看说明。
试著打运行 docker-compose help up ,即可查看 docker-compose up 的命令说明哦。
一次使用多个yaml档,一次启动多个Container。
(一个yaml档即可设置多个container,但是扩展上灵活,我个可以用 -f 参数更多额外的contaienr)
$docker-compose -p dlaravel -f docker-compose.yml -f service/redis.yml up -d
正常情况下Laravel开发,我们只要用nginx、php-fpm及mysql (docker-compose.yml),
今天突然有个特殊需求,另外需要有redis的开发环境??
不需要打掉旧的docker-compose.yml重写,我们可以用-f ,
添加额外的docker-compose设置,万一那天redis.yml有漏洞,
我们也只需更新redis.yml。
由於启动命令中,我们指定了两个yaml档,其中一个在service的数据夹内,上方-p的参数提到了,不使用-p时,
会使用默认的数据夹名称,结果dlaravel/docker-compose.yml 及dlaravel/service/redis.yml的数据夹是不同层的,
这样造成的 contaiener 网络会是不同的,所以这个命令中添加了-p。
正常情况下,我们只需 docker-compose up -d 即可,docker-compose会聪明的自动找寻目录下的docker-compose.yml,如果找不到会找上一层目录,并以数据夹为默认的project name。
但这个例子中,我们要添加 redis 的服务的yaml档与docker-compose.yml并非同一层数据夹,所以
我们定义了-p(自定义project-name),所有的container就会是相同的project-name及网络
这样就能用-f去指定不同目录下的 yaml 档罗。
注: 我们可以写个简单的bash,就不用每次打这么长的命令启动。
$docker-compose -p dlaravel -f docker-compose.yml -f service/redis.yml up -d
Creating network "dlaravel_dlaravel_net" with the default driver
Creating dlaravel_web_1 ...
Creating dlaravel_db_1 ...
Creating dlaravel_php_1 ...
Creating dlaravel_redis_1 ...
Creating dlaravel_web_1
Creating dlaravel_redis_1
Creating dlaravel_db_1
Creating dlaravel_redis_1 ... done
用 docks ps 查看,cool一行命令同时启动四个container了。
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3e2bfd4945b deviny/fpm:7.1.7 "docker-php-entryp..." 7 seconds ago Up 4 seconds 9000/tcp dlaravel_php_1
634e46d340b1 mysql:5.7.17 "docker-entrypoint..." 7 seconds ago Up 5 seconds 127.0.0.1:3306->3306/tcp dlaravel_db_1
b3840f993f07 redis "docker-entrypoint..." 7 seconds ago Up 3 seconds 6379/tcp dlaravel_redis_1
4697181b8896 nginx "nginx -g 'daemon ..." 7 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp dlaravel_web_1
如果要停止,就原来的启动命令,移除掉-d,并且up改为down。
$docker-compose -p dlaravel -f docker-compose.yml -f service/redis.yml down
$docker-compose -p dlaravel -f docker-compose.yml -f service/redis.yml down
Stopping dlaravel_php_1 ... done
Stopping dlaravel_db_1 ... done
Stopping dlaravel_redis_1 ... done
Stopping dlaravel_web_1 ... done
Removing dlaravel_php_1 ... done
Removing dlaravel_db_1 ... done
Removing dlaravel_redis_1 ... done
Removing dlaravel_web_1 ... done
Removing network dlaravel_dlaravel_net
注: 在上方的命令中为何要有-p的参数,是因为我们的加载了多个yaml档,在不同的目录中。
当yml档在同一层目录下时,这个-p的参数就可以省略了。
No Comment
Post your comment