Docker-compose是docker官方的開源項目,通過使用模版yaml文件,實現對docker容器集群的管理。具體教程可以通過官方地址進行實踐。Docker-compose主要有兩個重要的概念:服務(service)和項目(project),service定義了多個容器,組成了完整的project。
一.Docker-compose與docker的版本
目前docker-compose文件格式有3個版本,分別為1, 2.x 和 3.x分別對應了不同的docker版本,使用yaml文件時需要正確引用。
二.多個-f參數用法
通過-f選項指定一個其它名稱的配置文件,比如:
docker-compose -f docker-compose-dev.yml up
但如果添加多個-f選項,docker-compose會自動合並,當然也會根據先后順序把一些重復的配置項覆蓋掉。
三.別名使用
參數links用法是鏈接到其它服務中的容器, 該選項是docker歷史遺留的選項, 目前已經可以被aliases網絡別名標簽功能代替。並且如果service在同一個network中,即使不用links也可以通過容器名稱進行通信,親測過即使使用了links也未曾在/etc/hosts中發現對應的配置,猜測應該是docker-compose對網絡進行了優化吧。
補充:
在自定義networks中聲明的網絡名稱,會自動生成folder_my-network容器網絡,而並非自定義的my-network名稱,也就是會和docker-compose的yaml文件目錄有關。
四.使用已經存在的網絡
Docker-compose中的網絡配置都是默認新建屬於自己的專屬網絡,如果要使用已經存在的網絡,需要在yaml文件network配置項中單獨說明
networks:
default:
external:
name: leo_zhou
使用leo_zhou這個已經存在的網絡。
五.關於變量的使用
docker-compose中涉及到變量有兩個參數,一個是environment和env_file,用法比較特殊,需要特別的注意!
1.env_file有兩種用法,一種是默認的.env配置文件,使用docker-compose文件時會自動加載其中的配置項,實時更新並且是可以作為整個docker-compose的全局變量傳入參數;還有一種用法是使用自定義的env配置文件,但作用域僅限與environment參數之中的變量,並且使用自定義的env配置文件時,命令docker-compose config會出現“WARNING: The XXX variable is not set. Defaulting to a blank string.”的錯誤,自定義的env配置文件是為了補充environment的配置項的可讀性,但不建議測試時使用。
2.參數傳入也有優先級:
①在docker-compose文件固定寫好的參數優先級最高
②使用shell命令export引入參數
③使用.env默認的配置文件引入參數
④使用自定義的env文件引入參數
⑤默認為null的參數
3.environment僅作為docker run -e運行時傳入的參數,與env_file用法不一樣,並非為修改docker-compose文件設計。
最后補充關於WordPress和MySQL的典型yaml文件,僅作為參考:
.env配置文件
PORT=1080 MYSQL_ROOT_PASSWORD=123456
WordPress+MySQL搭建
version: '3' services: wordpress: image: wordpress ports: - '${PORT}:80' environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: 123456 networks: - leo-bridge container_name: wordpress depends_on: - mysql mysql: image: mysql:5.7.21 privileged: true environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} networks: - leo-bridge container_name: mysql volumes: - /data/mysql:/var/lib/mysql networks: leo-bridge: driver: bridge
如果使用了aliases標簽,yaml需要重新配置:
version: '3' services: wordpress: image: wordpress ports: - '${PORT}:80' environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: 123456 networks: leo-bridge: aliases: - yw_wordpress container_name: wordpress depends_on: - mysql mysql: image: mysql:5.7.21 privileged: true environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} networks: leo-bridge: aliases: - yw_mysql container_name: mysql volumes: - /data/mysql:/var/lib/mysql networks: leo-bridge: driver: bridge