定義和運行多個 Docker 容器的應用,一個項目每每包含多個容器,每次重啓都須要手動重啓多個容器,顯得太不簡潔,而docker-compose就是一個完美的解決方案。mysql
$pip install docker-compose $docker-compose --version
由於docker-compose 是根據docker提供的api進行的一層封裝,所以,只須要咱們熟練掌握docker的命令,docker-compose的命令我想只須要記住以下兩個便可。web
$docker-compose up
該命令十分強大,它將嘗試自動完成包括構建鏡像,(從新)建立服務,啓動服務,並關聯服務相關容器的一系列操做。
連接的服務都將會被自動啓動,除非已經處於運行狀態。
能夠說,大部分時候均可以直接經過該命令來啓動一個項目。
默認狀況,docker-compose up 啓動的容器都在前臺,控制檯將會同時打印全部容器的輸出信息,能夠很方便進行調試。
當經過 Ctrl-C 中止命令時,全部容器將會中止。
若是使用 docker-compose up -d,將會在後臺啓動並運行全部的容器。通常推薦生產環境下使用該選項。redis
$docker-compose down
此命令將會中止 up 命令所啓動的容器,並移除網絡.sql
模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。但你們不用擔憂,這裏面大部分指令跟 docker run 相關參數的含義都是相似的。docker
默認的模板文件名稱爲 docker-compose.yml,格式爲 YAML 格式。apache
version: '3' services: db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - /data/mysql:/var/lib/mysql ports: - 3306:3306 restart: always
下面介紹幾個關鍵的指令,指令太多,生產環境下也不是都用得上,遵循二八原則嘛。api
指定 Dockerfile 所在文件夾的路徑(能夠是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。網絡
version: '3' services: webapp: build: ./dir
覆蓋容器啓動後默認執行的命令。app
command: echo "hello world"
解決容器的依賴、啓動前後的問題。如下栗子會先啓動db,redis,再啓動webless
version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像
暴露端口信息。
使用宿主端口:容器端口
數據卷所掛載路徑設置,但這裏能夠有兩個選擇:
version: '3' services: db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - mysql:/var/lib/mysql ports: - 3306:3306 ... volumes: mysql:
指定容器名稱
$docker network create myNet # 新建網絡
version: "3" services: some-service: networks: - some-network - other-network networks: some-network: other-network:
隨着 Docker 網絡的完善,強烈建議你們將容器加入自定義的 Docker 網絡來鏈接多個容器,多容器間經過容器名-DNS解析進行互聯。
重啓機制
version: '2' services: web: image: apache restart: always
設置環境變量,語法有以下兩種
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET