Docker Compose項目簡介
Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。
Dockerfile 可以讓用戶管理一個單獨的應用容器;而 Compose 則允許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器(被稱為一個 project ,即項目)
該項目由 Python 編寫,實際上調用了 Docker 提供的 API 來實現。
安裝 (環境 Centos7)
yum install docker-compose -y
術語
服務(service):一個應用容器,實際上可以運行多個相同鏡像的實例。
項目(project):由一組關聯的應用容器組成的一個完整業務單元。
一個項目可以由多個服務(容器)關聯而成,Compose 面向項目進行管理。
YAML 模板文件詳解
默認的模板文件是 docker-compose.yml ,其中定義的每個服務都必須通過 image 指令指定鏡像或build 指令(需要 Dockerfile)來自動構建。
如果使用 build 指令,在 Dockerfile 中設置的選項(例如: CMD , EXPOSE , VOLUME , ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中再次設置。
YAML 語法格式,猛擊這里
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在, Compose 將會嘗試拉去這個鏡像。
#實用的例子 image: ubuntu image: bushaoxun/centos
build
指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像。
#實用例子 build: . build: /path/to/build/dir
links
鏈接到其它服務中的容器。使用服務名稱(同時作為別名)或服務名稱:服務別名 (SERVICE:ALIAS) 格式都可以。
鏈接容器后,將會在防火牆中創建對應的路由規則,同時會自動在容器中 /etc/hosts 文件中創建對應的主機名和 IP 地址記錄。
#語法舉例
links:
- db
- db:database
- redis
external_links
鏈接到 docker-compose.yml 外部的容器,甚至 並非 Compose 管理的容器。參數格式跟 links 類似。
#語法舉例
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
ports
暴露端口信息。
使用宿主:容器 (HOST:CONTAINER) 格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小於 60 你可能會得到錯誤得結果,因為 YAML 將會解析 xx:yy 這種數字格式為 60 進制。所以建議采用字符串格式。
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
expose:
- "3000"
- "8000"
volumes
卷掛載路徑設置。可以設置宿主機路徑 ( HOST:CONTAINER ) 或加上訪問模式( HOST:CONTAINER:ro )
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
從另一個服務或容器掛載它的所有卷。
volumes_from:
- service_name
- container_name
environment
設置環境變量。你可以使用數組或字典兩種格式。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
env_file
從文件中獲取環境變量,可以為單獨的文件路徑或列表。
如果通過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基於模板文件路徑。
如果有變量名稱與 environment 指令沖突,則以后者為准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
RACK_ENV=development
extends
基於已有的服務進行擴展。例如我們已經有了一個 webapp 服務,模板文件為 common.yml 。
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
編寫一個新的 development.yml 文件,使用 common.yml 中的 webapp 服務進行擴展。
# development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
后者會自動繼承 common.yml 中的 webapp 服務及相關環節變量。
net
設置網絡模式。使用和 docker client 的 --net 參數一樣的值。
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
pid
跟主機系統共享進程命名空間。打開該選項的容器可以相互通過進程 ID 來訪問和操作。
pid: "host"
dns
配置 DNS 服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
dns_search
配置 DNS 搜索域。可以是一個值,也可以是一個列表。
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
Docker-compose 命令詳解
build
命令用來創建或重新創建服務使用的鏡像,后面指定的是服務的名稱,創建之后的鏡像名為project_service,
即項目名后跟服務名。比如項目名稱為composeset,其中的一個服務名稱為web,則docker-compose build web創建的鏡像的名稱為composeset_web。
help
獲得一個命令的幫助。
kill
通過發送 SIGKILL 信號來強制停止服務容器。支持通過參數來指定發送的信號
docker-compose kill -s SIGINT
logs
查看服務的輸出。
port
打印綁定的公共端口
pull
拉取服務鏡像
rm
刪除停止的服務容器
run
在一個服務上執行一個命令
#命令實例,將會啟動一個 ubuntu 服務,執行 ping docker.com 命令。 #默認情況下,所有關聯的服務將會自動被啟動,除非這些服務已經在運行中。 docker-compose run ubuntu ping docker.com
scale
設置同一個服務運行的容器個數,通過 service=num 的參數來設置數量。
docker-compose scale web=2 worker=3
start
啟動一個已經存在的服務容器。
stop
停止一個已經運行的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。
up
構建,(重新)創建,啟動,鏈接一個服務相關的容器。鏈接的服務都將會啟動,除非他們已經運行。
環境變量
COMPOSE_PROJECT_NAME
設置通過 Compose 啟動的每一個容器前添加的項目名稱,默認是當前工作目錄的名字。
COMPOSE_FILE
設置要使用的 docker-compose.yml 的路徑。默認路徑是當前工作目錄。
DOCKER_HOST
設置 Docker daemon 的地址。默認使用 unix:///var/run/docker.sock ,與 Docker 客戶端采用的默認值一致。
DOCKER_TLS_VERIFY
如果設置不為空,則與 Docker daemon 交互通過 TLS 進行。
DOCKER_CERT_PATH
配置 TLS 通信所需要的驗證( ca.pem 、 cert.pem 和 key.pem )文件的路徑,默認是 ~/.docker
案例
簡單的 wordpress 運行案例
# 創建目錄
mkdir /wordpress
#編寫 docker-compose.yaml 文件
vim docker-compose.yaml
wordpress:
image: wordpress
links:
- db:mariadb
ports:
- 90:80
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: test
# 生成應用
docker-compose up -d
測試:(perfect)

