學(xué)習(xí)技能光看不做是不行的,強烈推薦按照教程敲一遍
https://docs.docker.com/compose/gettingstarted/
Compose項目由 Python編寫 ,實現(xiàn)上調(diào)用了 Docker服務(wù)提供的 API來對容器進行管理丹鸿。 因此只要所操作的平臺支持 Docker,就可以在其上利用 Compose來進行編排管理碎罚。
本人提煉出了幾點技巧:
1. 多用 docker-compose config
命令校驗和查看配置信息荐吵,
當修改了docker-compose.yml
文件,不要急于執(zhí)行docker-compose up
啟動秉宿,可以先檢查下配置。很多時候是yml格式不規(guī)范導(dǎo)致的屯碴。
2. docker-compose up
docker-compose up
包含了構(gòu)建鏡像描睦,創(chuàng)建服務(wù),啟動服務(wù)等一系列操作导而。一般配好文件執(zhí)行這個命令就可以了忱叭。
3. 使用.env環(huán)境變量配置文件
一些敏感信息如,數(shù)據(jù)庫密碼等不建議寫死到docker-compose.yml
中今艺,可以寫在.env
環(huán)境配置文件中(使用Laravel的同學(xué)對這個文件肯定不陌生)韵丑。
因為docker-compose.yml一般跟隨項目受版本控制,.env可以不受版本控制虚缎。
優(yōu)化前:
docker-compose.yml
mysql:
build: ./docker-build/mysql
ports:
- "33060:3306"
volumes:
- ./docker-build/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
優(yōu)化后:
同級目錄建立.env
文件
mysql:
build: ./docker-build/mysql
ports:
- "33060:3306"
volumes:
- ./docker-build/mysql/data:/var/lib/mysql
environment:
# 先從.env找DOCKER_MYSQL_PASSPORD撵彻,找不到使用后面的默認值
MYSQL_ROOT_PASSWORD: ${DOCKER_MYSQL_PASSPORD-123456}
.env
# define env var default value.
DOCKER_MYSQL_PASSPORD=root
4. 使用docker-compose.yml中的env_file語法
service節(jié)點下支持 env_file屬性,即環(huán)境變量從額外的文件中讀取实牡。
如下面的例子陌僵,如果local.env和common.env有相同key。則下面的優(yōu)先級高创坞。
php:
build:
context: ./docker-build/php
args:
- INSTALL_COMPOSER=${PHP_INSTALL_COMPOSER}
- INSTALL_MONGO=${PHP_INSTALL_MONGO}
- INSTALL_REDIS=${PHP_INSTALL_REDIS}
- INSTALL_XDEBUG=${PHP_INSTALL_XDEBUG}
ports:
- "9001:9000"
links:
- "mysql"
volumes:
- .:/www
env_file:
- ./common.env
- ./local.env
假設(shè) local.env 中內(nèi)容是A:1
拾弃,common.env 是 A:2
environment:
A: 3
env_file:
- ./common.env
- ./local.env
最終生效的是 A:3
5. 配置不同場景下的環(huán)境變量
我們可以把不同場景下的環(huán)境變量定義在不同的 shell 腳本中并導(dǎo)出,然后在執(zhí)行 docker-compose 命令前先執(zhí)行 source 命令把 shell 腳本中定義的環(huán)境變量導(dǎo)出到當前的 shell 中摆霉。通過這樣的方式可以減少維護環(huán)境變量的地方豪椿,下面的例子中我們分別在 docker-compose.yml 文件所在的目錄創(chuàng)建 test.sh 和 prod.sh奔坟,test.sh 的內(nèi)容如下:
#!/bin/bash
# define env var default value.
export IMAGETAG=web:v1
export APPNAME=HelloWorld
export AUTHOR=Nick Li
export VERSION=1.0
prod.sh 的內(nèi)容如下:
#!/bin/bash
# define env var default value.
export IMAGETAG=webpord:v1
export APPNAME=HelloWorldProd
export AUTHOR=Nick Li
export VERSION=1.0LTS
在測試環(huán)境下,執(zhí)行下面的命令:
$ source test.sh
$ docker-compose config
image.png
此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是測試環(huán)境相關(guān)的設(shè)置搭盾。
而在生產(chǎn)環(huán)境下咳秉,執(zhí)行下面的命令:
image.png
此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是生產(chǎn)環(huán)境相關(guān)的設(shè)置。
6. 環(huán)境變量的優(yōu)先級
docker-compose.yml 文件中引用的環(huán)境變量鸯隅,它們的優(yōu)先級如下:
- Compose file
- Shell environment variables
- Environment file
- Dockerfile
- Variable is not defined
首先澜建,在 docker-compose.yml 文件中直接設(shè)置的值優(yōu)先級是最高的。
然后是在當前 shell 中 export 的環(huán)境變量值蝌以。
接下來是在環(huán)境變量文件中定義的值炕舵。
再接下來是在 Dockerfile 中定義的值。
最后還沒有找到相關(guān)的環(huán)境變量就認為該環(huán)境變量沒有被定義跟畅。
額外內(nèi)容咽筋,使用 extends 繼承擴展docker-compose.yml
基于其他模板文件進行擴展 。 例如徊件,我們已經(jīng)有了一個 webapp 服務(wù)奸攻,定義一個基礎(chǔ)模板文件為 common.yml,如下所示:
common.yml
:
webapp
build : . /webapp
environment:
- DEBUG=false
- SEND EMAILS=false
再編寫一個新的 development .yml 文件虱痕,使用 common.yml 中的 webapp 服務(wù)進行擴展:
development .yml
:
web:
extends:
file: common .yml
service: webapp
ports :
- "8000:8000"
links:
- db environment:
- DEBUG=true
db:
image : postgres
后者會自動繼承common.yml中的webapp服務(wù)及環(huán)境變量定義睹耐。 使用extends需要注意以下兩點:
- 要避免出現(xiàn)循環(huán)依賴,例如 A 依賴 B, B 依賴 C, C 反過來依賴 A 的情況 部翘。
- extends 不會繼承 links 和 volumes_from 中定義的容器和數(shù)據(jù)卷資源 硝训。 一般情況下,推薦在基礎(chǔ)模板中只定義一些可以共享的鏡像和環(huán)境變量新思,在擴展模板中
具體指定應(yīng)用變量捎迫、鏈接、數(shù)據(jù)卷等信息 表牢。
額外內(nèi)容
RUN vs CMD vs ENTRYPOINT 的區(qū)別
- Dockerfile中,在基礎(chǔ)鏡像上安裝軟件使用 RUN
- CMD命令是當Docker鏡像被啟動后Docker容器將會默認執(zhí)行的命令贝次。一個Dockerfile中只能有一個CMD命令崔兴。通過執(zhí)行
docker run $image $other_command
啟動鏡像可以重載CMD命令。 - 使用 docker-compose run 命令可以在服務(wù)上運行一次性命令蛔翅,如
docker-compose run web env
查看服務(wù)為web的環(huán)境變量
image.png
參考:
https://www.cnblogs.com/sparkdev/p/9826520.html
https://docs.docker.com/compose/reference/envvars/
https://docs.docker.com/compose/environment-variables/