Docker Compose介紹

以前使用Docker,是先定義Dockerfile文件,而後使用docker builddocker run等命令操做容器。html

但一般來講,一個應用系統不單單隻包含一個服務,每一個服務通常也有多個容器實例。這種狀況下若是每一個容器都要手動啓停,那麼效率之低、維護量之大可想而知。mysql

Docker Compose是Docker官方編排(Orchestration)項目之一,負責快速的部署分佈式應用。git

使用Docker Compose能夠輕鬆、高效的管理容器,它是一個用戶定義和運行多個容器的Docker應用程序。在Docker Compose中你能夠使用YAML文件來配置你的應用服務,而後只須要一個簡單的命令,就能夠建立並啓動你配置的全部服務。github

github地址:https://github.com/docker/composeweb


Docker Compose介紹

  • Compose概念:
服務(service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。

項目(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml中定義。

Compose的默認管理對象是項目(project),經過子命令能夠很方便對項目中的一組容器進行生命週期管理。redis

  • 安裝Compose:
# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose# chmod +x /usr/local/bin/docker-compose

# docker-compose -v             #查看版本

  • docker-compose命令:
build   構建(從新構建)項目中的服務容器

bundle  從 Compose 文件生成一個docker包

config  驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤緣由

create  建立服務

down    中止並刪除up所啓動的容器,並移除網絡、鏡像和數據卷

events  從容器接收實時事件

exec    進入指定的容器

help    得到一個命令的幫助

images  列出 Compose 文件中包含的鏡像

kill    強制中止服務容器

logs    查看服務容器的輸出

pause   暫停一個服務容器

port    打印某個容器所映射的公共端口

ps      列出項目中目前的全部容器

pull    從鏡像倉庫拉取服務依賴的鏡像

push    推送服務依賴的鏡像到鏡像倉庫

restart 重啓項目中的服務

rm      刪除全部(中止狀態的)服務容器

run     在指定服務上執行一個命令

scale   設置指定服務運行的容器個數

start   啓動已經存在的服務容器

stop    中止運行狀態中的容器,但不刪除

top     查看各個服務容器內運行的進程

unpause 恢復暫停狀態中的服務容器

up      包括構建鏡像、(從新)建立服務、啓動服務,並關聯服務相關容器的一系列操做

version 打印版本信息

  • docker-compose參數:
-f, --file  指定使用的 Compose 模板文件,默認爲 docker-compose.yml

-p, --project-name  指定項目名稱,默認將使用所在目錄名稱做爲項目名

--log-level 指定日誌級別(DEBUG, INFO, WARNING, ERROR, CRITICAL)

--no-ansi   不打印ANSI控制字符

--verbose   打印更多調試信息

-v, --version   打印版本並退出

-H, --host  守護進程socket鏈接的主機


Docker Compose模板文件

模板文件是使用Docker Compose的核心,涉及到的指令關鍵字也比較多。默認的模板文件名稱爲docker-compose.yml,格式爲YAML格式。sql

  • docker-compose.yml組成:
services
    一個服務表明一個容器,這個容器的鏡像能夠由pull或build而來。
    服務的啓動相似docker run,每一個服務都有本身的名字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其餘服務等

volumes
    數據卷,能夠定義數據卷的名字,而後掛載到不一樣的服務下去使用
    
networks
    網絡,能夠定義網絡的名字及網絡類型等

注意:每一個服務都必須經過image指令指定鏡像或build指令(須要Dockerfile)等來自動構建生成鏡像。若是使用build指令,在Dockefile中設置的選項(例如:CMD、EXPOSE、VOLUME、ENV等)將會自動被獲取,無需在docker-compose.yml中再次設置。docker

  • build指令:

build,指定Dockerfile所在文件夾的路徑。Compose將會利用Dockerfile自動構建鏡像,而後使用鏡像啓動服務容器。數據庫

build: /path/to/build/dir

也能夠是相對路徑,只要上下文肯定就能夠讀取到Dockerfile。json

build: ./dir

設定上下文根目錄,而後以該目錄爲準指定Dockerfile。

build:
  context: ../  dockerfile: path/of/Dockerfile

  • cap_addcap_drop指令:

cap_add、cap_drop,指定容器的內核能力(capacity)分配。

cap_add:
  - ALL             #用於全部能力

cap_drop:
  - NET_ADMIN               #去掉NET_ADMIN能力

  • command指令:

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

command: echo 'hello world'

  • container_name指令:

container_name,指定容器名稱。Compose默認使用項目名稱_服務名稱_序號。指定名稱後沒法使用擴展(scale)。

container_name: docker-web-container

  • depends_on指令:

depends_on,指定容器的依賴、啓動前後的順序。

depends_on:
  - db  - redis

  • dns指令:

dns,自定義dns服務器。

dns:
  - 8.8.8.8  - 114.114.114.114

  • dns_search指令:

dns_search,配置dns搜索域。

dns_search:
  - domain1.example.com  - domain2.example.com

  • environment指令:

environment,設置環境變量,能夠使用數組和字典兩種格式。

environment:
  PACK_ENV: development  SESSION_SECRET:

environment:
  - RACK_ENV=development  - SESSION_SECRET

  • expose指令:

expose,暴露端口但不映射到宿主機,只被鏈接的服務訪問

expose:
  - "3000"
  - "8000"

  • extra_hosts指令:

extra_hosts,添加主機名,會在容器/etc/hosts文件中添加一些記錄。

extra_hosts:
  - "googledns:8.8.8.8"
  - "dockerhub:52.1.157.61"

  • healthcheck指令:

healthcheck,檢查容器是否健康運行。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s  tomeout: 10s  retries: 3

  • image指令:

image,指定服務的鏡像名稱或鏡像ID。若是鏡像在本地不存在,Compose將會嘗試拉取鏡像。

image: hello-world

  • labels指令:

labels,爲容器添加Docker元數據(metadata)信息。

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"

  • logging指令:

logging,配置日誌選項。

logging:
  driver: syslog  options:
    syslog-address: "tcp://192.168.0.42:123"

#目前支持三種日誌驅動類型
driver: "json-file"
driver: "syslog"
driver: "none"

#options配置日誌驅動的相關參數
options:
  max-size: "200k"
  max-file: "10"

  • network_mode指令:

network_mode,設置網絡模式。

network_mode: "bridge"

  • networks指令:

networks,配置容器鏈接的網絡。

networks:
  - some-network  - other-network

  • ports指令:

ports,指定映射的端口。

ports:
  - "80:80"
  - "8080"

  • restart指令:

restart,指定容器退出後的重啓策略。

restart: always

  • secrets指令:

secrets,存儲敏感數據。

mysql:
  image:mysql  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password  secrets:
    - db_root_password    - my_other_secret        
secrets:
  my_secret:
    file: ./my_secret.txt  my_other_secret:
    external:true

  • sysctls指令:

sysctls,配置容器內核參數。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
    sysctls:
  - net.core.somaxconn=1024  - net.ipv4.tcp_syncookies=0

  • ulimits指令:
ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

  • volumes指令:

volumes,指定數據卷所掛載路徑。能夠設置宿主機路徑或加上訪問模式,支持相對路徑。

volumes:
  - /var/lib/mysql  - cache/:/tmp/cache  - ~/configs:/etc/configs/:ro

注意:以上指令只是經常使用的指令,並非全部的指令。


Docker Compose 示例

下面使用Docker Compose部署wordpress項目,該項目包含兩個service:wordpress和mysql。

  • 編輯docker-compose.yml
# mkdir /wordpress && cd /wordpress# vim docker-compose.yml

version: '3'services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456789
      MYSQL_DATABASE: wordpress    restart: always    volumes:
      - db_data:/var/lib/mysql    networks:
      - my-bridge  wordpress:
    depends_on:
      - db    image: wordpress    ports:
      - "80:80"
    restart: always    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: 123456789
    networks:
      - my-bridge      
volumes:
  db_data:
  networks:
  my-bridge:
    driver: bridge

  • 啓動項目:
# docker-compose up -dCreating network "wordpress_my-bridge" with driver "bridge"Creating volume "wordpress_db_data" with default driver
Creating wordpress_db_1 ... doneCreating wordpress_wordpress_1 ... done# docker-compose ps

        Name                       Command               State          Ports       
------------------------------------------------------------------------------------
wordpress_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp

查看新建的network和volume

# docker network lsNETWORK ID          NAME                  DRIVER              SCOPE
ff9743715e7f        bridge                bridge              local
cfa3c20aedc7        host                  host                local
6527f05a2b23        none                  null                local
784ff3c3208f        wordpress_my-bridge   bridge              local# docker volume lsDRIVER              VOLUME NAME
local               f3242b47b11ff0ddf6c520df36c8cccc99509421d4d6b19373b60db8304b6c1c
local               wordpress_db_data

查看數據庫容器

# docker exec -it wordpress_db_1 bashroot@1255075bb1fd:/# mysql -uroot -p123456789mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || wordpress          |+--------------------+
5 rows in set (0.03 sec)

  • 查看wordpress:

當前部署機器ip爲192.168.30.130,打開瀏覽器訪問192.168.30.130

在這裏插入圖片描述

填寫信息後直接登陸,能夠看看wordpress站點

在這裏插入圖片描述

在這裏插入圖片描述

能夠看到,使用Docker Compose部署項目十分簡單。但由於Docker Compose部署的項目,它全部的容器都在同一臺主機上,這在生產環境下是不能接受的,因此Docker Compose僅適用於開發環境。

那麼如何在生產環境下部署項目呢,這就須要使用Docker Swarm啦,在此不進行討論。

相關文章
相關標籤/搜索