本文為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