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

需要登入才可留言!

类似文章


fastapi,phpenv,docker

我如何用phpenv创建fastapi运行环境

虽然phpenv主要用於运行PHP Laravel的环境,但不代表他不能跑其他语言或其他容器。本文介绍,我如何让phpenv跑python的fastapi环境,当然这只是一个概念,目前为止,我已经让PHP api跑HAProxy了,并且自动申请及更新免费证书,现在就让他来跑Python的fastapi吧。phpenv没有什么限制,限制的是您的想像力😆

docker,phpenv

在Linux上ping不到host.docker.internal

可用docker version检查,确认版本在Docker v20.10+即可添加extra_hosts如下:

docker,laravel

[D-Laravel]./console node

进行Laravel开发时,有时我们会需要透过npm安装nodejs的包,但是偏偏我们系统中的Node又不够新。 或许因某些因素没法升级,例如要跑旧版的nodejs进程等。 其实我们可以透过简单的命令,用docker,让我们就能使用最新版本的node image来挂载host端的/sites数据夹罗。 这么一来我们就可以随时运行新版本的npm命令啦。