Docker學習總結(42)——Docker Compose 入門學習
一、Docker Compose介紹
Compose 是 Docker 公司推出的一個工具軟體,可以管理多個 Docker 容器組成一個應用(稱為一個 project,即專案)。Compose 定位是“Define and run multi-container applications with Docker”,其前身是 Fig,相容 Fig 的模板檔案。你需要定義一個 YAML 格式的配置檔案docker-compose.yml,寫好多個容器之間的呼叫關係。然後,只要一個命令,就能同時啟動/關閉這些容器。Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose不再需要使用shell指令碼來啟動容器。 Compose 通過一個配置檔案來管理多個Docker容器,在配置檔案中,所有的容器通過services來定義,然後使用docker-compose指令碼來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發的場景。
二、Docker Compose安裝
安裝步驟請參考:Docker Compose安裝
三、Compose使用例項
在本例中將會實現啟動nginx服務及一個數據卷容器,並將該資料卷容器作為nginx的靜態檔案
1、建立compose資料夾
sudo mkdir composetest
cd composetest
2、建立docker-compose.yml檔案
touch docker-compose.yml
vim docker-compose.yml
在docker-compose.yml中輸入以下內容:
dvc:
image: debian:wheezy
volumes:
- /www:/usr/share/nginx/html:ro
nginx:
image: nginx:latest
volumes_from:
- dvc
ports:
- "8081:80"
3、啟動
docker-compose up -d
注:使用命令docker-compose ps檢視執行狀況
四、CLI 說明(docker-compose 命令)
大多數Compose命令都是運行於一個或多個服務的,如果服務沒有指定,該命令將會應用到所有服務,如果要獲得所有可用資訊,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說明:
build :建立或者再建服務
服務被建立後會標記為project_service(比如composetest_db),如果改變了一個服務的Dockerfile或者構建目錄的內容,可以使用docker-compose build來重建它
help :顯示命令的幫助和使用資訊
kill :通過傳送SIGKILL的訊號強制停止執行的容器,這個訊號可以選擇性的通過,比如:
docker-compose kill -s SIGKINT
logs :顯示服務的日誌輸出
port :為埠繫結輸出公共資訊
ps :顯示容器
pull :拉取服務映象
rm :刪除停止的容器
run :在服務上執行一個一次性命令,比如:
docker-compose run web python manage.py shell
scale :設定為一個服務啟動的容器數量,數量是以這樣的引數形式指定的:service=num,比如:
docker-compose scale web=2 worker=3
start :啟動已經存在的容器作為一個服務
stop :停止執行的容器而不刪除它們,它們可以使用命令docker-compose start重新啟動起來
up :為一個服務構建、建立、啟動、附加到容器
連線的服務會被啟動,除非它們已經在運行了
預設情況下,docker-compose up會集中每個容器的輸出,當存在時,所有的容器會停止,執行docker-compose up -d會在後臺啟動容器並使它們執行
預設情況下,如果服務存在容器的話,docker-compose up會停止並再建立它們(使用了volumes-from會保留已掛載的卷),如果不想使容器停止並再建立的話,使用docker-compose up --no-recreate,如果有需要的話,這會啟動任何停止的容器
選項:–verbose
顯示更多輸出
–version :顯示版本號並退出
-f,–file FILE :指定一個可選的Compose yaml檔案(預設:docker-compose.yml)
-p,–project-name NAME :指定可選的專案名稱(預設:當前目錄名稱)
五、docker-compose.yml命令說明
每一個定義在docker-compose.yml中的服務必須明確指定一個image或者build選項,這與docker run命令列中輸入的是對應相同的,對於docker run,在Dockerfile檔案中指定的選項(比如CMD、EXPOSE、VOLUME、ENV)是預設的,因此不必在docker-compose.yml中再指定一次
image :標明image的ID,這個image ID可以是本地也可以是遠端的,如果本地不存在,Compose會嘗試去pull下來
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
build :該引數指定Dockerfile檔案的路徑,該目錄也是傳送到守護程序的構建環境(這句有點),Compose將會以一個已存在的名稱進行構建並標記,並隨後使用這個image
build: /path/to/build/dir
command :重寫預設的命令
command: bundle exec thin -p 3000
links :連線到其他服務中的容器,可以指定服務名稱和這個連結的別名,或者只指定服務名稱
links:
- db
- db:database
- redis
此時,在容器內部,會在/etc/hosts檔案中用別名建立一個條目,就像這樣:
172.17.2.186 db
172.17.2.186 database
172.17.2.186 redis
環境變數也會被建立,關於環境變數的引數,會在後面講到
external_links
連線到在這個docker-compose.yml檔案或者Compose外部啟動的容器,特別是對於提供共享和公共服務的容器。在指定容器名稱和別名時,external_links遵循著和links相同的語義用法
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
ports
暴露埠,指定兩者的埠(主機:容器),或者只是容器的埠(主機會被隨機分配一個埠)
注:當以 主機:容器 的形式來對映埠時,如果使容器的埠小於60,那可能會出現錯誤,因為YAML會將 xx:yy這樣格式的資料解析為六十進位制的資料,基於這個原因,時刻記得要將埠對映明確指定為字串
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
暴露埠而不必向主機發布它們,而只是會向連結的服務(linked service)提供,只有內部埠可以被指定
expose:
- "3000"
- "8000"
volumes
掛載路徑最為卷,可以選擇性的指定一個主機上的路徑(主機:容器),或是一種可使用的模式(主機:容器:ro)
volumes_from:
- service_name
- container_name
environment
加入環境變數,可以使用陣列或者字典,只有一個key的環境變數可以在執行Compose的機器上找到對應的值,這有助於加密的或者特殊主機的值
environment:
RACK_ENV: development
SESSION_SECRET:
environments:
- RACK_ENV=development
- SESSION_SECRET
env_file
從一個檔案中加入環境變數,該檔案可以是一個單獨的值或者一張列表,在environment中指定的環境變數將會重寫這些值
env_file:
- .env
RACK_ENV: development
net
網路模式,可以在docker客戶端的--net引數中指定這些值
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
dns
自定義DNS服務,可以是一個單獨的值或者一張列表
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
cap_add,cap_drop
加入或者去掉容器能力,檢視man 7 capabilities 可以有一張完整的列表
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
dns_search
自定義DNS搜尋範圍,可以是單獨的值或者一張列表
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
working_dir,entrypoint,user,hostname,domainname,mem_limit,privileged,restart,stdin_open,tty,cpu_shares
上述的每一個都只是一個單獨的值,和docker run中對應的引數是一樣的
cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
restart: always
stdin_open: true
tty: true
六、Compose環境變數說明
環境變數已經不再是用來連線服務的推薦方法了,相反,應該使用連結名稱(預設情況下是連結服務的名稱)作為主機名稱來連線,這可以檢視docker-compose.yml的更多細節
Compose使用Docker links來暴露服務的容器給其他的。每一個連結的容器都使用了一組環境變數,這每一組環境變數都是以容器名稱的大寫字母開頭的
要檢視服務可用的環境變數,執行docker-compose run SERVICE env
name_PORT
完整URL,如:DB_PORT=tcp//172.17.0.5:5432
name_PORT_num_protocol
完整URL,如:DB_PORT_5432_TCP=tcp://172.17.0.5:5432
name_PORT_num_protocol_ADDR
容器的IP地址,如:DB_PORT_5432_TCP_ADDR=172.17.0.5
name_PORT_num_protocol_PORT
暴露的埠號,如:DB_PORT_5432_TCP_PORT=5432
name_PORT_num_protocol_PROTO
協議(tcp或者udp),如:DB_PORT_5432_TCP_PROTO=tcp
name_NAME
完全合格的容器名稱,如:DB_1_NAME=/myapp_web_1/myapp_db_1