一、Compose安裝
在安裝compose之前,要確保已經(jīng)安裝了docker1.3或以上版本
在Linux64位系統(tǒng)上安裝compose:
curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- 注:當(dāng)然可以選擇安裝
command completion(見二)
uname -s和uname -m中的兩個引號是鍵盤上ESC下面的那個按鍵
此時,compose已經(jīng)安裝成功,使用命令docker-compose --version可以查看
如果是在OS X系統(tǒng)上,則需要執(zhí)行如下步驟(未親測):
二、Compose命令補(bǔ)全
安裝命令補(bǔ)全
確保bash completion已經(jīng)安裝,如果當(dāng)前使用非最小安裝的Linux,bash completion已經(jīng)OK了,如果是在MAC上,可以使用brew install bash-completion來安裝
將completion腳本放在/etc/bash_completion.d/(在MAC上是/usr/local/etc/bash_completion.d/)
curl -L https://raw./docker/compose/1.1.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
在下次登錄時,Completion功能已經(jīng)可以使用
可用的補(bǔ)全取決于在命令行的輸入,會補(bǔ)全:
* 可用的Docker-compose命令
* 對于某一特別命令可用的選項(xiàng)
* 在一個給定的上下文條件(比如:具有運(yùn)行或停止?fàn)顟B(tài)的實(shí)例的服務(wù)或者基于鏡像的服務(wù) VS 基于Dockerfile的服務(wù))下,給出有可行的服務(wù)名稱,對于docker-compose scale,補(bǔ)全服務(wù)名稱時會自動有”=”附加上去
* 對于可選項(xiàng)的參數(shù),比如:docker-compose kill -s會完成一些信號,比如SIGUP和SIGUSR1
擁有了這項(xiàng)功能以后,Compose更快更少輸入了呢!Happy working!
三、Compose使用實(shí)例
在本例中將會實(shí)現(xiàn)啟動nginx服務(wù)及一個數(shù)據(jù)卷容器,并將該數(shù)據(jù)卷容器作為nginx的靜態(tài)文件
1.創(chuàng)建compose文件夾
sudo mkdir composetest
cd composetest
2.創(chuàng)建docker-compose.yml文件
touch docker-compose.yml
vim docker-compose.yml
在docker-compose.yml中輸入以下內(nèi)容:
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查看運(yùn)行狀況
四、CLI 說明(docker-compose 命令)
大多數(shù)Compose命令都是運(yùn)行于一個或多個服務(wù)的,如果服務(wù)沒有指定,該命令將會應(yīng)用到所有服務(wù),如果要獲得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的說明:
build
創(chuàng)建或者再建服務(wù)
服務(wù)被創(chuàng)建后會標(biāo)記為project_service(比如composetest_db),如果改變了一個服務(wù)的Dockerfile或者構(gòu)建目錄的內(nèi)容,可以使用docker-compose build來重建它
help
顯示命令的幫助和使用信息
kill
通過發(fā)送SIGKILL的信號強(qiáng)制停止運(yùn)行的容器,這個信號可以選擇性的通過,比如:
docker-compose kill -s SIGKINT
logs
顯示服務(wù)的日志輸出
port
為端口綁定輸出公共信息
ps
顯示容器
pull
拉取服務(wù)鏡像
rm
刪除停止的容器
run
在服務(wù)上運(yùn)行一個一次性命令,比如:
docker-compose run web Python manage.py shell
scale
設(shè)置為一個服務(wù)啟動的容器數(shù)量,數(shù)量是以這樣的參數(shù)形式指定的:service=num,比如:
docker-compose scale web=2 worker=3
start
啟動已經(jīng)存在的容器作為一個服務(wù)
stop
停止運(yùn)行的容器而不刪除它們,它們可以使用命令docker-compose start重新啟動起來
up
為一個服務(wù)構(gòu)建、創(chuàng)建、啟動、附加到容器
連接的服務(wù)會被啟動,除非它們已經(jīng)在運(yùn)行了
默認(rèn)情況下,docker-compose up會集中每個容器的輸出,當(dāng)存在時,所有的容器會停止,運(yùn)行docker-compose up -d會在后臺啟動容器并使它們運(yùn)行
默認(rèn)情況下,如果服務(wù)存在容器的話,docker-compose up會停止并再創(chuàng)建它們(使用了volumes-from會保留已掛載的卷),如果不想使容器停止并再創(chuàng)建的話,使用docker-compose up --no-recreate,如果有需要的話,這會啟動任何停止的容器
選項(xiàng)
–verbose
顯示更多輸出
–version
顯示版本號并退出
-f,–file FILE
指定一個可選的Compose yaml文件(默認(rèn):docker-compose.yml)
-p,–project-name NAME
指定可選的項(xiàng)目名稱(默認(rèn):當(dāng)前目錄名稱)
五、docker-compose.yml命令說明
每一個定義在docker-compose.yml中的服務(wù)必須明確指定一個image或者build選項(xiàng),這與docker run命令行中輸入的是對應(yīng)相同的,對于docker run,在Dockerfile文件中指定的選項(xiàng)(比如CMD、EXPOSE、VOLUME、ENV)是默認(rèn)的,因此不必在docker-compose.yml中再指定一次
image
標(biāo)明image的ID,這個image ID可以是本地也可以是遠(yuǎn)程的,如果本地不存在,Compose會嘗試去pull下來
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
build
該參數(shù)指定Dockerfile文件的路徑,該目錄也是發(fā)送到守護(hù)進(jìn)程的構(gòu)建環(huán)境(這句有點(diǎn)),Compose將會以一個已存在的名稱進(jìn)行構(gòu)建并標(biāo)記,并隨后使用這個image
build: /path/to/build/dir
command
重寫默認(rèn)的命令
command: bundle exec thin -p 3000
links
連接到其他服務(wù)中的容器,可以指定服務(wù)名稱和這個鏈接的別名,或者只指定服務(wù)名稱
links:
- db
- db:database
- redis
此時,在容器內(nèi)部,會在/etc/hosts文件中用別名創(chuàng)建一個條目,就像這樣:
172.17.2.186 db
172.17.2.186 database
172.17.2.186 redis
環(huán)境變量也會被創(chuàng)建,關(guān)于環(huán)境變量的參數(shù),會在后面講到
external_links
連接到在這個docker-compose.yml文件或者Compose外部啟動的容器,特別是對于提供共享和公共服務(wù)的容器。在指定容器名稱和別名時,external_links遵循著和links相同的語義用法
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
ports
暴露端口,指定兩者的端口(主機(jī):容器),或者只是容器的端口(主機(jī)會被隨機(jī)分配一個端口)
注:當(dāng)以 主機(jī):容器 的形式來映射端口時,如果使容器的端口小于60,那可能會出現(xiàn)錯誤,因?yàn)閅AML會將 xx:yy這樣格式的數(shù)據(jù)解析為六十進(jìn)制的數(shù)據(jù),基于這個原因,時刻記得要將端口映射明確指定為字符串
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
暴露端口而不必向主機(jī)發(fā)布它們,而只是會向鏈接的服務(wù)(linked service)提供,只有內(nèi)部端口可以被指定
expose:
- "3000"
- "8000"
volumes
掛載路徑最為卷,可以選擇性的指定一個主機(jī)上的路徑(主機(jī):容器),或是一種可使用的模式(主機(jī):容器:ro)
volumes_from:
- service_name
- container_name
environment
加入環(huán)境變量,可以使用數(shù)組或者字典,只有一個key的環(huán)境變量可以在運(yùn)行Compose的機(jī)器上找到對應(yīng)的值,這有助于加密的或者特殊主機(jī)的值
environment:
RACK_ENV: development
SESSION_SECRET:
environments:
- RACK_ENV=development
- SESSION_SECRET
env_file
從一個文件中加入環(huán)境變量,該文件可以是一個單獨(dú)的值或者一張列表,在environment中指定的環(huán)境變量將會重寫這些值
env_file:
- .env
RACK_ENV: development
net
網(wǎng)絡(luò)模式,可以在docker客戶端的--net參數(shù)中指定這些值
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
dns
自定義DNS服務(wù),可以是一個單獨(dú)的值或者一張列表
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搜索范圍,可以是單獨(dú)的值或者一張列表
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
上述的每一個都只是一個單獨(dú)的值,和docker run中對應(yīng)的參數(shù)是一樣的
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環(huán)境變量說明
環(huán)境變量已經(jīng)不再是用來連接服務(wù)的推薦方法了,相反,應(yīng)該使用鏈接名稱(默認(rèn)情況下是鏈接服務(wù)的名稱)作為主機(jī)名稱來連接,這可以查看docker-compose.yml的更多細(xì)節(jié)
Compose使用Docker links來暴露服務(wù)的容器給其他的。每一個鏈接的容器都使用了一組環(huán)境變量,這每一組環(huán)境變量都是以容器名稱的大寫字母開頭的
要查看服務(wù)可用的環(huán)境變量,運(yùn)行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
協(xié)議(tcp或者udp),如:DB_PORT_5432_TCP_PROTO=tcp
name_NAME
完全合格的容器名稱,如:DB_1_NAME=/myapp_web_1/myapp_db_1
|