by Devin Yang

建立于: 7年前 ( 更新: 1年前 )

本文为Docker的中阶应用:

-  docker 命令及 Dockerfile 等为 Docker 的基本应用。
-  docker-compose 为 Doccker 的中阶应用,您应该先了解 docker 的命令及 Dockerfile 等相关设置。
-  docker swam 及 stack 为 Docker 的高阶应用。


如果您对Docker的基本应用还不是很了解,可先参考我的另一篇文章:

Devin Yang的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 -dDetached 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的参数就可以省略了。 

Tags: docker d-laravel docker-compose laravel

Devin Yang

文章内容无法一一说明,如果您有什么不了解处,欢印提问哦:)

No Comment

Post your comment

需要登入才可留言!

类似文章


docker,goaccess,config

phpenv实战GoAccess即实网站解析(docker版)

在开始前我先说一下,GoAcess也能产出静态数据只要您有log,因为我觉的即时感觉比较炫,所以本文将专注在GoAccess即时显示的部分进行介绍。虽然Google Analytics(GA)很好用,但试试另一种GA感觉也很不错,例如您想了解网站使用者用什么浏览器访网站。

certbot,docker,ftp

curlftpfs介绍及手动证书申请

情境分享,设想您有WebHosting,他只提供FTP连线,然后您想手动的方式申请证书。在本篇分享我如何使用Docker安装curlftpfs,并且挂载远程主机FTP数据夹,然后在容器内运行certbot申请SSL证书。撇除证书申请不说,我初次发觉到curlftpfs这个命令时,觉的满有意思的,特别是如果你用的是MacOS用户,手边没有一个满意的FTP软体时。您跟我一样喜欢在命令行上打滚,或许您应该也会喜欢这个命令。🤭

openspeedtest,docker,phpenv

用phpenv跑openspeedtest

虽然我们可能会用speedtest之类网站进行上下传的速度的测试,那如果我们想测自己的Server的速度呢?像是用户在别的国家,连到我们的主机速度快慢 ,这时self-hosted的测试工具就很方便啦。最新版本的phpenv在services的yml档中,添加了openspeedtest.yml罗。