docker compose

簡介

定義和運行多個 Docker 容器的應用,一個項目每每包含多個容器,每次重啓都須要手動重啓多個容器,顯得太不簡潔,而docker-compose就是一個完美的解決方案。mysql

兩個重要的概念

  1. 服務 (service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例
  2. 項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

安裝

$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模板文件

模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。但你們不用擔憂,這裏面大部分指令跟 docker run 相關參數的含義都是相似的。docker

默認的模板文件名稱爲 docker-compose.yml,格式爲 YAML 格式。apache

先舉一個mysql的小栗子

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

build

指定 Dockerfile 所在文件夾的路徑(能夠是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。網絡

version: '3'
services:

  webapp:
    build: ./dir

command

覆蓋容器啓動後默認執行的命令。app

command: echo "hello world"

depends_on

解決容器的依賴、啓動前後的問題。如下栗子會先啓動db,redis,再啓動webless

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

image

指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像

ports

暴露端口信息。

使用宿主端口:容器端口

volumes

數據卷所掛載路徑設置,但這裏能夠有兩個選擇:

  1. 絕對路徑(見上述小栗子)
  2. 卷標
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - mysql:/var/lib/mysql
    ports:
      - 3306:3306
...
volumes:
  mysql:

container_name

指定容器名稱

networks

$docker network create myNet # 新建網絡
version: "3"
services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

隨着 Docker 網絡的完善,強烈建議你們將容器加入自定義的 Docker 網絡來鏈接多個容器,多容器間經過容器名-DNS解析進行互聯。

restart

重啓機制

  • no,默認策略,在容器退出時不重啓容器
  • on-failure,在容器非正常退出時(退出狀態非0),纔會重啓容器
  • on-failure:3,在容器非正常退出時重啓容器,最多重啓3次
  • always,在容器退出時老是重啓容器
  • unless-stopped,在容器退出時老是重啓容器,可是不考慮在Docker守護進程啓動時就已經中止了的容器
version: '2'
services:
  web:
    image: apache
    restart: always

environment

設置環境變量,語法有以下兩種

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET
相關文章
相關標籤/搜索