一,Docker-compose簡介
1,Docker-compose簡介
Docker-Compose專案是Docker官方的開源專案,負責實作對Docker容器集群的快速編排,
Docker-Compose將所管理的容器分為三層,分別是工程(project),服務(service)以及容器(container),Docker-Compose運行目錄下的所有檔案(docker-compose.yml,extends檔案或環境變數檔案等)組成一個工程,若無特殊指定工程名即為當前目錄名,一個工程當中可包含多個服務,每個服務中定義了容器運行的鏡像,引數,依賴,一個服務當中可包括多個容器實體,Docker-Compose并沒有解決負載均衡的問題,因此需要借助其它工具實作服務發現及負載均衡,
Docker-Compose的工程組態檔默認為docker-compose.yml,可通過環境變數COMPOSE_FILE或-f引數自定義組態檔,其定義了多個有依賴關系的服務及每個服務運行的容器,
使用一個Dockerfile模板檔案,可以讓用戶很方便的定義一個單獨的應用容器,在作業中,經常會碰到需要多個容器相互配合來完成某項任務的情況,例如要實作一個Web專案,除了Web服務容器本身,往往還需要再加上后端的資料庫服務容器,甚至還包括負載均衡容器等,
Compose允許用戶通過一個單獨的docker-compose.yml模板檔案(YAML 格式)來定義一組相關聯的應用容器為一個專案(project),
Docker-Compose專案由Python撰寫,呼叫Docker服務提供的API來對容器進行管理,因此,只要所操作的平臺支持Docker API,就可以在其上利用Compose來進行編排管理,
2,Docker-compose的安裝
安裝環境查看

安裝
apt install python-pip
pip install docker-compose
PS:centos使用命令yum -y install python-pip安裝pip
查看安裝的版本
# docker-compose --version
docker-compose version 1.24.0, build 0aa5906
3,Docker-compose卸載
pip uninstall docker-compose
二,Docker-compose常用命令
1,Docker-compose命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令選項如下
-f --file FILE指定Compose模板檔案,默認為docker-compose.yml
-p --project-name NAME 指定專案名稱,默認使用當前所在目錄為專案名
--verbose 輸出更多除錯資訊
-v,-version 列印版本并退出
--log-level LEVEL 定義日志等級(DEBUG, INFO, WARNING, ERROR, CRITICAL)
2,docker-compose up
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
選項包括:
-d 在后臺運行服務容器
-no-color 不是有顏色來區分不同的服務的控制輸出
-no-deps 不啟動服務所鏈接的容器
--force-recreate 強制重新創建容器,不能與-no-recreate同時使用
–no-recreate 如果容器已經存在,則不重新創建,不能與–force-recreate同時使用
–no-build 不自動構建缺失的服務鏡像
–build 在啟動容器前構建服務鏡像
–abort-on-container-exit 停止所有容器,如果任何一個容器被停止,不能與-d同時使用
-t, –timeout TIMEOUT 停止容器時候的超時(默認為10秒)
–remove-orphans 洗掉服務中沒有在compose檔案中定義的容器
3,docker-compose ps
docker-compose ps [options] [SERVICE...]
列出專案中所有的容器
4,docker-compose stop
docker-compose stop [options] [SERVICE...]
選項包括
-t, –timeout TIMEOUT 停止容器時候的超時(默認為10秒)
docker-compose stop
停止正在運行的容器,可以通過docker-compose start 再次啟動
5,docker-compose -h
docker-compose -h
查看幫助
6,docker-compose down
docker-compose down [options]
停止和洗掉容器、網路、卷、鏡像,
選項包括:
–rmi type,洗掉鏡像,型別必須是:all,洗掉compose檔案中定義的所有鏡像;local,洗掉鏡像名為空的鏡像
-v, –volumes,洗掉已經在compose檔案中定義的和匿名的附在容器上的資料卷
–remove-orphans,洗掉服務中沒有在compose中定義的容器
docker-compose down
停用移除所有容器以及網路相關
7,docker-compose logs
docker-compose logs [options] [SERVICE...]
查看服務容器的輸出,默認情況下,docker-compose將對不同的服務輸出使用不同的顏色來區分,可以通過–no-color來關閉顏色,
docker-compose logs
查看服務容器的輸出
-f 跟蹤日志輸出
8,docker-compose bulid
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
構建(重新構建)專案中的服務容器,
選項包括:
–compress 通過gzip壓縮構建上下環境
–force-rm 洗掉構建程序中的臨時容器
–no-cache 構建鏡像程序中不使用快取
–pull 始終嘗試通過拉取操作來獲取更新版本的鏡像
-m, –memory MEM為構建的容器設定記憶體大小
–build-arg key=val為服務設定build-time變數
服務容器一旦構建后,將會帶上一個標記名,可以隨時在專案目錄下運行docker-compose build來重新構建服務
9,docker-compose pull
docker-compose pull [options] [SERVICE...]
拉取服務依賴的鏡像,
選項包括:
–ignore-pull-failures,忽略拉取鏡像程序中的錯誤
–parallel,多個鏡像同時拉取
–quiet,拉取鏡像程序中不列印進度資訊
docker-compose pull
拉取服務依賴的鏡像
10,docker-compose restart
docker-compose restart [options] [SERVICE...]
重啟專案中的服務,
選項包括:
-t, –timeout TIMEOUT,指定重啟前停止容器的超時(默認為10秒)
docker-compose restart
重啟專案中的服務
11,docker-compose rm
docker-compose rm [options] [SERVICE...]
洗掉所有(停止狀態的)服務容器,
選項包括:
–f, –force,強制直接洗掉,包括非停止狀態的容器
-v,洗掉容器所掛載的資料卷
docker-compose rm
洗掉所有(停止狀態的)服務容器,推薦先執行docker-compose stop命令來停止容器,
12,docker-compose start
docker-compose start [SERVICE...]
docker-compose start
啟動已經存在的服務容器,
13,docker-compose run
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務上執行一個命令,
docker-compose run ubuntu ping www.baidu.com
在指定容器上執行一個ping命令,
14,docker-compose scale
docker-compose scale web=3 db=2
設定指定服務運行的容器個數,通過service=num的引數來設定數量
15,docker-compose pause
docker-compose pause [SERVICE...]
暫停一個服務容器
16,docker-compose kill
docker-compose kill [options] [SERVICE...]
通過發送SIGKILL信號來強制停止服務容器,
支持通過-s引數來指定發送的信號,例如通過如下指令發送SIGINT信號:
docker-compose kill -s SIGINT
17,docker-compose config
docker-compose config [options]
驗證并查看compose檔案配置,
選項包括:
–resolve-image-digests 將鏡像標簽標記為摘要
-q, –quiet 只驗證配置,不輸出, 當配置正確時,不輸出任何內容,當檔案配置錯誤,輸出錯誤資訊
–services 列印服務名,一行一個
–volumes 列印資料卷名,一行一個
18,docker-compose create
docker-compose create [options] [SERVICE...]
為服務創建容器,
選項包括:
–force-recreate:重新創建容器,即使配置和鏡像沒有改變,不兼容–no-recreate引數
–no-recreate:如果容器已經存在,不需要重新創建,不兼容–force-recreate引數
–no-build:不創建鏡像,即使缺失
–build:創建容器前 ,生成鏡像
19,docker-compose exec
docker-compose exec [options] SERVICE COMMAND [ARGS...]
選項包括:
-d 分離模式,后臺運行命令,
–privileged 獲取特權,
–user USER 指定運行的用戶,
-T 禁用分配TTY,默認docker-compose exec分配TTY,
–index=index,當一個服務擁有多個容器時,可通過該引數登陸到該服務下的任何服務,例如:docker-compose exec –index=1 web /bin/bash ,web服務中包含多個容器
20,docker-compose port
docker-compose port [options] SERVICE PRIVATE_PORT
顯示某個容器埠所映射的公共埠,
選項包括:
–protocol=proto,指定埠協議,TCP(默認值)或者UDP
–index=index,如果同意服務存在多個容器,指定命令物件容器的序號(默認為1)
21,docker-compose push
docker-compose push [options] [SERVICE...]
推送服務依的鏡像,
選項包括:
–ignore-push-failures 忽略推送鏡像程序中的錯誤
22,docker-compose stop
docker-compose stop [options] [SERVICE...]
停止運行的容器
23,docker-compose uppause
docker-compose unpause [SERVICE...]
恢復處于暫停狀態中的服務,
三,Docker-compose模板檔案
1,Docker-compose模板檔案簡介
Compose允許用戶通過一個docker-compose.yml模板檔案(YAML 格式)來定義一組相關聯的應用容器為一個專案(project),
Compose模板檔案是一個定義服務、網路和卷的YAML檔案,Compose模板檔案默認路徑是當前目錄下的docker-compose.yml,可以使用.yml或.yaml作為檔案擴展名,
Docker-Compose標準模板檔案應該包含version、services、networks 三大部分,最關鍵的是services和networks兩個部分,
舉例
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
Compose目前有三個版本分別為Version 1,Version 2,Version 3,Compose區分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+),Version 2支持更多的指令,Version 1將來會被棄用,
2,image
image是指定服務的鏡像名稱或鏡像ID,如果鏡像在本地不存在,Compose將會嘗試拉取鏡像,
services:
web:
image: hello-world
3,build
服務除了可以基于指定的鏡像,還可以基于一份Dockerfile,在使用up啟動時執行構建任務,構建標簽是build,可以指定Dockerfile所在檔案夾的路徑,Compose將會利用Dockerfile自動構建鏡像,然后使用鏡像啟動服務容器,
|
|
也可以是相對路徑,只要背景關系確定就可以讀取到Dockerfile,
| 1 |
|
設定背景關系根目錄,然后以該目錄為準指定Dockerfile,
| 1 2 3 |
|
build都是一個目錄,如果要指定Dockerfile檔案需要在build標簽的子級標簽中使用dockerfile標簽指定,
如果同時指定image和build兩個標簽,那么Compose會構建鏡像并且把鏡像命名為image值指定的名字,
4,context
context選項可以是Dockerfile的檔案路徑,也可以是到鏈接到git倉庫的url,當提供的值是相對路徑時,被決議為相對于撰寫檔案的路徑,此目錄也是發送到Docker守護行程的context
build:
context: ./dir
5,dockerfile
使用dockerfile檔案來構建,必須指定構建路徑
build:
context: .
dockerfile: Dockerfile-alternate
6,commond
使用command可以覆寫容器啟動后默認執行的命令:
command: bundle exec thin -p 3000
Compose的容器名稱格式是:<專案名稱><服務名稱><序號>
7,container_name
可以自定義專案名稱、服務名稱,但如果想完全控制容器的命名,可以使用標簽指定:
container_name: app
在使用Compose時,最大的好處就是少打啟動命令,但一般專案容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗,例如在沒啟動資料庫容器的時候啟動應用容器,應用容器會因為找不到資料庫而退出,depends_on標簽用于解決容器的依賴、啟動先后的問題
8,depends_on
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
9,PID
上述YAML檔案定義的容器會先啟動redis和db兩個服務,最后才啟動web 服務,
pid: "host"
將PID模式設定為主機PID模式,跟主機系統共享行程命名空間,容器使用pid標簽將能夠訪問和操縱其他容器和宿主機的名稱空間,
10,ports
ports用于映射埠的標簽,
使用HOST:CONTAINER格式或者只是指定容器的埠,宿主機會隨機映射埠,
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
11,extra_hosts
當使用HOST:CONTAINER格式來映射埠時,如果使用的容器埠小于60可能會得到錯誤得結果,因為YAML將會決議xx:yy這種數字格式為60進制,所以建議采用字串格式,
添加主機名的標簽,會在/etc/hosts檔案中添加一些記錄,
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
啟動后查看容器內部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
掛載一個目錄或者一個已存在的資料卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者對于容器來說,資料卷是只讀的,可以有效保護宿主機的檔案系統,
12,volumes
Compose的資料卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄,
資料卷的格式可以是下面多種形式
volumes:
// 只是指定一個路徑,Docker 會自動在創建一個資料卷(這個路徑是容器內部的),
- /var/lib/mysql
// 使用絕對路徑掛載資料卷
- /opt/data:/var/lib/mysql
// 以 Compose 組態檔為中心的相對路徑作為資料卷掛載到容器,
- ./cache:/tmp/cache
// 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/),
- ~/configs:/etc/configs/:ro
// 已經存在的命名的資料卷,
- datavolume:/var/lib/mysql
13,volumes_from
如果不使用宿主機的路徑,可以指定一個volume_driver, volume_driver: mydriver
從另一個服務或容器掛載其資料卷:
volumes_from:
- service_name
- container_name
自定義DNS服務器,可以是一個值,也可以是一個串列,
14,dns
dns:8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
暴露埠,但不映射到宿主機,只允許能被連接的服務訪問,僅可以指定內部埠為引數,如下所示:
15,expose
expose:
- "3000"
- "8000"
鏈接到其它服務中的容器,使用服務名稱(同時作為別名),或者“服務名稱:服務別名”(如 SERVICE:ALIAS),例如:
16,links
links:
- db
- db:database
- redis
設定網路模式,
17,net
net: "bridge"
net: "none"
net: "host"
四,Docker-compose模板檔案示例
1,Docker-compose模板檔案撰寫
docker-compose.yml
version: '2'
services:
web1:
image: nginx
ports:
- "6061:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx
ports:
- "6062:80"
container_name: "web2"
networks:
- dev
- pro
web3:
image: nginx
ports:
- "6063:80"
container_name: "web3"
networks:
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
2,啟動應用
docker-compose.yml檔案指定了3個web服務
創建一個webapp目錄,將docker-compose.yaml檔案拷貝到webapp目錄下,使用docker-compose啟動應用,
docker-compose up -d
通過瀏覽器訪問web1,web2,web3
3,服務訪問
http://127.0.0.1:6061
http://127.0.0.1:6062
http://127.0.0.1:6063
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254521.html
標籤:其他
