詳解Docker之Compose服務(wù)編排
Compose是Docker的服務(wù)編排工具,主要用來(lái)構(gòu)建基于Docker的復(fù)雜應(yīng)用,Compose 通過(guò)一個(gè)配置文件來(lái)管理多個(gè)Docker容器,非常適合組合使用多個(gè)容器進(jìn)行開(kāi)發(fā)的場(chǎng)景。
說(shuō)明:Compose是Fig的升級(jí)版,F(xiàn)ig已經(jīng)不再維護(hù)。Compose向下兼容Fig,所有fig.yml只需要更名為docker-compose.yml即可被Compose使用。
服務(wù)編排工具使得Docker應(yīng)用管理更為方便快捷。 Compose網(wǎng)站:https://docs.docker.com/compose/
安裝Compose:
# 方法一: $ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose # Linux下等效于 $ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose; chmod +x /usr/local/bin/docker-compose # 方法二:使用pip安裝,版本可能比較舊 $ yum install python-pip python-dev $ pip install docker-compose # 方法三:作為容器安裝 $ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose # 方法四:離線(xiàn)安裝 # 下載[docker-compose-Linux-x86_64](https://github.com/docker/compose/releases/download/1.8.1/docker-compose-Linux-x86_64),然后重新命名添加可執(zhí)行權(quán)限即可: $ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose; $ chmod +x /usr/local/bin/docker-compose # 百度云地址: http://pan.baidu.com/s/1slEOIC1 密碼: qmca # docker官方離線(xiàn)地址:https://dl.bintray.com/docker-compose/master/
安裝完成后可以查看版本:
# docker-compose --version docker-compose 1.8.1
升級(jí)
如果你使用的是 Compose 1.2或者早期版本,當(dāng)你升級(jí)完成后,你需要?jiǎng)h除或者遷移你現(xiàn)有的容器。這是因?yàn)椋?.3版本, Composer 使用 Docker 標(biāo)簽來(lái)對(duì)容器進(jìn)行檢測(cè),所以它們需要重新創(chuàng)建索引標(biāo)記。
卸載
$ rm /usr/local/bin/docker-compose # 卸載使用pip安裝的compose $ pip uninstall docker-compose
Compose區(qū)分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1沒(méi)有聲明版本默認(rèn)是"version 1"。Version 1將來(lái)會(huì)被棄用。
版本1指的是忽略version關(guān)鍵字的版本;版本2必須在行首添加version: '2'。
入門(mén)示例
一般步驟
1、定義Dockerfile,方便遷移到任何地方;
2、編寫(xiě)docker-compose.yml文件;
3、運(yùn)行docker-compose up啟動(dòng)服務(wù)
示例
準(zhǔn)備工作:提前下載好鏡像:
docker pull mysql docker pull wordpress
需要新建一個(gè)空白目錄,例如wptest。新建一個(gè)docker-compose.yml
version: '2'
services:
web:
image: wordpress:latest
links:
- db
ports:
- "8002:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: 123456
db:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
以上命令的意思是新建db和wordpress容器。等同于:
$ docker run --name db -e MYSQL_ROOT_PASSWORD=123456 -d mysql $ docker run --name some-wordpress --link db:mysql -p 8002:80 -d wordpress
注意,如果你是直接從fig遷移過(guò)來(lái)的,且web里links是- db:mysql,這里會(huì)提示沒(méi)有給wordpress設(shè)置環(huán)境變量,這里需要添加環(huán)境變量WORDPRESS_DB_HOST和WORDPRESS_DB_PASSWORD。
好,我們啟動(dòng)應(yīng)用:
# docker-compose up Creating wptest_db_1... Creating wptest_wordpress_1... Attaching to wptest_db_1, wptest_wordpress_1 wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html
就成功了。瀏覽器訪(fǎng)問(wèn) http://localhost:8002(或 http://host-ip:8002)即可。
默認(rèn)是前臺(tái)運(yùn)行并打印日志到控制臺(tái)。如果想后臺(tái)運(yùn)行,可以:
docker-compose up -d
服務(wù)后臺(tái)后,可以使用下列命令查看狀態(tài):
# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------
figtest_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
figtest_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8002->80/tcp
# docker-compose logs
Attaching to wptest_wordpress_1, wptest_db_1
db_1 | 2016-10-4T14:38:46.98030Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1 | 2016-10-4T14:38:46.99974Z 0 [Note] mysqld (mysqld 5.7.15) starting as process 1 ...
db_1 | 2016-10-4T14:38:46.27191Z 0 [Note] InnoDB: PUNCH HOLE support available
停止服務(wù):
# docker-compose stop Stopping wptest_wordpress_1... Stopping wptest_db_1...
重新啟動(dòng)服務(wù):
docker-compose restart
docker-compose.yml參考
每個(gè)docker-compose.yml必須定義image或者build中的一個(gè),其它的是可選的。
image
指定鏡像tag或者ID。示例:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
注意,在version 1里同時(shí)使用image和build是不允許的,version 2則可以,如果同時(shí)指定了兩者,會(huì)將build出來(lái)的鏡像打上名為image標(biāo)簽。
build
用來(lái)指定一個(gè)包含Dockerfile文件的路徑。一般是當(dāng)前目錄.。Fig將build并生成一個(gè)隨機(jī)命名的鏡像。
注意,在version 1里bulid僅支持值為字符串。version 2里支持對(duì)象格式。
build: ./dir build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
context為路徑,dockerfile為需要替換默認(rèn)docker-compose的文件名,args為構(gòu)建(build)過(guò)程中的環(huán)境變量,用于替換Dockerfile里定義的ARG參數(shù),容器中不可用。示例:
Dockerfile:
ARG buildno ARG password RUN echo "Build number: $buildno" RUN script-requiring-password.sh "$password"
docker-compose.yml:
build: context: . args: buildno: 1 password: secret build: context: . args: - buildno=1 - password=secret
command
用來(lái)覆蓋缺省命令。示例:
command: bundle exec thin -p 3000
command也支持?jǐn)?shù)組形式:
command: [bundle, exec, thin, -p, 3000]
links
用于鏈接另一容器服務(wù),如需要使用到另一容器的mysql服務(wù)。可以給出服務(wù)名和別名;也可以?xún)H給出服務(wù)名,這樣別名將和服務(wù)名相同。同docker run --link。示例:
links: - db - db:mysql - redis
使用了別名將自動(dòng)會(huì)在容器的/etc/hosts文件里創(chuàng)建相應(yīng)記錄:
172.17.2.186 db 172.17.2.186 mysql 172.17.2.187 redis
所以我們?cè)谌萜骼锞涂梢灾苯邮褂脛e名作為服務(wù)的主機(jī)名。
ports
用于暴露端口。同docker run -p。示例:
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
expose
expose提供container之間的端口訪(fǎng)問(wèn),不會(huì)暴露給主機(jī)使用。同docker run --expose。
expose: - "3000" - "8000"
volumes
掛載數(shù)據(jù)卷。同docker run -v。示例:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
volumes_from
掛載數(shù)據(jù)卷容器,掛載是容器。同docker run --volumes-from。示例:
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
container:container_name格式僅支持version 2。
environment
添加環(huán)境變量。同docker run -e??梢允菙?shù)組或者字典格式:
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
depends_on
用于指定服務(wù)依賴(lài),一般是mysql、redis等。
指定了依賴(lài),將會(huì)優(yōu)先于服務(wù)創(chuàng)建并啟動(dòng)依賴(lài)。
links也可以指定依賴(lài)。
external_links
鏈接搭配docker-compose.yml文件或者Compose之外定義的服務(wù),通常是提供共享或公共服務(wù)。格式與links相似:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
注意,external_links鏈接的服務(wù)與當(dāng)前服務(wù)必須是同一個(gè)網(wǎng)絡(luò)環(huán)境。
extra_hosts
添加主機(jī)名映射。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
將會(huì)在/etc/hosts創(chuàng)建記錄:
162.242.195.82 somehost 50.31.209.229 otherhost
extends
繼承自當(dāng)前yml文件或者其它文件中定義的服務(wù),可以選擇性的覆蓋原有配置。
extends: file: common.yml service: webapp
service必須有,file可選。service是需要繼承的服務(wù),例如web、database。
net
設(shè)置網(wǎng)絡(luò)模式。同docker的--net參數(shù)。
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
dns
自定義dns服務(wù)器。
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
這些命令都是單個(gè)值,含義請(qǐng)參考docker run。
cpu_shares: 73 cpu_quota: 50000 cpuset: 0,1 user: postgresql working_dir: /code domainname: foo.com hostname: foo ipc: host mac_address: 02:42:ac:11:65:43 mem_limit: 1000000000 mem_limit: 128M memswap_limit: 2000000000 privileged: true restart: always read_only: true shm_size: 64M stdin_open: true tty: true
命令行參考
$ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the name specified
in the client certificate (for example if your docker host
is an IP address)
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pulls service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
批處理腳本
# 關(guān)閉所有正在運(yùn)行容器
docker ps | awk '{print $1}' | xargs docker stop
# 刪除所有容器應(yīng)用
docker ps -a | awk '{print $1}' | xargs docker rm
# 或者
docker rm $(docker ps -a -q)
參考:
1、Overview of Docker Compose - Docker
https://docs.docker.com/compose/overview/
2、library/mysql - Docker Hub
https://hub.docker.com/_/mysql/
3、library/wordpress - Docker Hub
https://hub.docker.com/_/wordpress/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信