by Devin Yang

建立於: 6年前 ( 更新: 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, api

Swagger介紹

最好的API是使用Swagger工具建立的, 本文介紹如何用docker來執行swagger-ui及editor,讓我們建立出可測試的API文件。 在docker的環境,我們可以很輕鬆的啟動swagger編輯器及使用者介面。

docker,polymer,seo

用Rendertron解決Polymer SEO問題(Polymer Summit 2017)

文章下方的影片介紹如何使用rendertron解決Polymer SEO優化的問題。 在我fork的source中,已調整支援中文環境。 並且還加入了pdf的API接口,也可以拿來轉pdf。

docker,laravel

[D-Laravel]./console node

進行Laravel開發時,有時我們會需要透過npm安裝nodejs的套件,但是偏偏我們系統中的Node又不夠新。 或許因某些因素沒法升級,例如要跑舊版的nodejs程式等。 其實我們可以透過簡單的指令,用docker,讓我們就能使用最新版本的node image來掛載host端的/sites資料夾囉。 這麼一來我們就可以隨時執行新版本的npm指令啦。