以前使用Docker,是先定義Dockerfile文件,而後使用docker build
、docker run
等命令操做容器。html
但一般來講,一個應用系統不單單隻包含一個服務,每一個服務通常也有多個容器實例。這種狀況下若是每一個容器都要手動啓停,那麼效率之低、維護量之大可想而知。mysql
Docker Compose是Docker官方編排(Orchestration)項目之一,負責快速的部署分佈式應用。git
使用Docker Compose能夠輕鬆、高效的管理容器,它是一個用戶定義和運行多個容器的Docker應用程序。在Docker Compose中你能夠使用YAML文件來配置你的應用服務,而後只須要一個簡單的命令,就能夠建立並啓動你配置的全部服務。github
github地址:https://github.com/docker/composeweb
服務(service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。 項目(project):由一組關聯的應用容器組成的一個完成業務單元,在docker-compose.yml中定義。
Compose的默認管理對象是項目(project),經過子命令能夠很方便對項目中的一組容器進行生命週期管理。redis
# 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.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_add
、cap_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部署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)
當前部署機器ip爲192.168.30.130
,打開瀏覽器訪問192.168.30.130
,
填寫信息後直接登陸,能夠看看wordpress站點
能夠看到,使用Docker Compose部署項目十分簡單。但由於Docker Compose部署的項目,它全部的容器都在同一臺主機上,這在生產環境下是不能接受的,因此Docker Compose僅適用於開發環境。
那麼如何在生產環境下部署項目呢,這就須要使用Docker Swarm啦,在此不進行討論。