??簡(jiǎn)介:Dockerfile 可以讓用戶管理一個(gè)單獨(dú)的應(yīng)用容器散怖;而 Compose 則允許用戶在一個(gè)模板(YAML 格式)中定義一組相關(guān)聯(lián)的應(yīng)用容器凳枝,例如一個(gè) Web 服務(wù)容器再加上后端的數(shù)據(jù)庫(kù)服務(wù)容器等
一 绞呈、安裝
使用yum安裝docker-compose
yum install docker-compose -y
二 、命令說(shuō)明
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE 使用特定的 compose 模板文件,默認(rèn)為 docker-compose.yml
-p, --project-name NAME 指定項(xiàng)目名稱饲做,默認(rèn)使用目錄名稱
--verbose 輸出更多調(diào)試信息
-v, --version 打印版本并退出
Commands:
build 構(gòu)建或重新構(gòu)建服務(wù)
down 停止服務(wù)并且移除容器飒箭,網(wǎng)絡(luò)配置
events 從容器中接收實(shí)時(shí)事件
exec 在運(yùn)行的容器中執(zhí)行命令
kill 強(qiáng)行關(guān)閉容器
logs 查看服務(wù)的輸出
pause Pause services
port 打印綁定的公共端口 # docker-compose port nginx 80
ps 列出所有容器
pull 拉取服務(wù)鏡像
push 上傳服務(wù)鏡像
restart 重啟容器
rm 移除停止的容器
run 啟動(dòng)一個(gè)容器并執(zhí)行命令狼电,默認(rèn)情況下,所有關(guān)聯(lián)的服務(wù)將會(huì)自動(dòng)被啟動(dòng)弦蹂。如果不希望自動(dòng)啟動(dòng)關(guān)聯(lián)的容器肩碟,可以使用 --no-deps 選項(xiàng)
scale 設(shè)置同一個(gè)服務(wù)運(yùn)行的容器個(gè)數(shù)
start 啟動(dòng)一個(gè)已經(jīng)存在的服務(wù)容器
stop 停止一個(gè)已經(jīng)運(yùn)行的容器,但不刪除它
up 構(gòu)建凸椿,(重新)創(chuàng)建削祈,啟動(dòng),鏈接一個(gè)服務(wù)相關(guān)的容器脑漫。默認(rèn)情況岩瘦,如果該服務(wù)的容器已經(jīng)存在,
docker-compose up 將會(huì)停止并嘗試重新創(chuàng)建他們窿撬。如果不想容器被停止并重新創(chuàng)建
可以使用 docker-compose up --no-recreate
三 启昧、ymal 模板文件
??默認(rèn)的模板文件是 docker-compose.yml,其中定義的每個(gè)服務(wù)都必須通過(guò) image 指令指定鏡像或 build 指令(需要 Dockerfile)來(lái)自動(dòng)構(gòu)建劈伴。其它大部分指令都跟 docker run 中的類似密末。
??如果使用 build 指令,在 Dockerfile 中設(shè)置的選項(xiàng)(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會(huì)自動(dòng)被獲取跛璧,無(wú)需在 docker-compose.yml 中再次設(shè)置严里。
- image: 指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在追城,Compose 將會(huì)嘗試?yán)ミ@個(gè)鏡像
- build:指定 Dockerfile 所在文件夾的路徑刹碾。 Compose 將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像,然后使用這個(gè)鏡像座柱。
- command:覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令迷帜。(執(zhí)行的命令不能退出,不然的話容器會(huì)自動(dòng)關(guān)閉)
- links:鏈接到其它服務(wù)中的容器色洞。使用服務(wù)名稱(同時(shí)作為別名)或服務(wù)名稱:服務(wù)別名 (SERVICE:ALIAS) 格式都可以戏锹。
- ports:暴露端口到宿主機(jī)。當(dāng)使用 HOST:CONTAINER 格式來(lái)映射端口時(shí)火诸,如果你使用的容器端口小于 60 你可能會(huì)得到錯(cuò)誤得結(jié)果锦针,因?yàn)?YAML 將會(huì)解析 xx:yy 這種數(shù)字格式為 60 進(jìn)制。所以建議采用字符串格式
- expose:暴露端口,但不映射到宿主機(jī)奈搜,只被連接的服務(wù)訪問(wèn)
- volumes:卷掛載路徑設(shè)置悉盆。可以設(shè)置宿主機(jī)路徑 (HOST:CONTAINER) 或加上訪問(wèn)模式 (HOST:CONTAINER:ro)
- environment:設(shè)置環(huán)境變量馋吗。你可以使用數(shù)組或字典兩種格式
- env_file:從文件中獲取環(huán)境變量焕盟,可以為單獨(dú)的文件路徑或列表。
如果通過(guò)docker-compose -f FILE
指定了模板文件耗美,則env_file
中路徑會(huì)基于模板文件路徑京髓。如果有變量名稱與environment
指令沖突,則以后者為準(zhǔn)商架。 - env_file 文件中的內(nèi)容
$ cat .env # 變量值不要加引號(hào)
SERVICE=nginx
REDIS=redis.test.com
MYSQL=mysql mysql
working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares堰怨,這些都是和 docker run 支持的選項(xiàng)類似。
cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
stdin_open: true
tty: true
- 示例
version: "3"
services:
test:
# build 時(shí) image 參數(shù)值為 build 的鏡像名和tag
build: ./
image: alpine:v1
# docker ps 時(shí)顯示的 name
container_name: alpine
# 容器的主機(jī)名
hostname: alpine
restart: always
# 映射到宿主機(jī)的端口蛇摸,前面為宿主機(jī)端口备图,后面為容器端口
ports:
- "1194:1194"
- "1195:1195"
# 暴露到容器內(nèi)部的端口
expose:
- "1194"
- "1195"
# 掛載宿主機(jī)目錄到容器中
volumes:
- /etc/localtime:/etc/localtime
- /tmp:/tmp
# 設(shè)置環(huán)境變量
environment:
TZ: "Asia/Shanghai"
ENV: 'develop'
# 在 /etc/hosts 文件中添加主機(jī)名映射
extra_hosts:
- "mysql:5.6.7.8"
# 以文件的形式添加容器內(nèi)部的環(huán)境變量
# 文件內(nèi)容如下:
# ENV=develop #變量值不要加引號(hào)
env_file:
- .env
command: tail -f /etc/passwd
nginx:
image: nginx
# 連接同一個(gè)docker-compose文件中的容器
links:
- test
# 依賴容器啟動(dòng)后改容器才會(huì)繼續(xù)啟動(dòng)
depends_on:
- test
command: tail -f /etc/passwd
四、docker-compose實(shí)踐:創(chuàng)建LANMP鏡像赶袄,并用docker-compose管理
- docker-compose.yml 文件內(nèi)容
version: '2'
services:
nginx:
image: nginx-1.10.3:v1
depends_on:
- apache
volumes:
- ./nginx/conf:/usr/local/nginx/conf
- ./nginx/logs:/usr/local/nginx/logs
- ./html:/usr/local/nginx/html
- /etc/localtime:/etc/localtime
links:
- apache
ports:
- "8088:80"
- "443:443"
command: /usr/local/nginx/sbin/nginx
tty: true
privileged: true
container_name: nginx
hostname: nginx
apache:
image: php7-httpd24:v1
volumes:
- /etc/localtime:/etc/localtime
- ./html:/usr/local/httpd-2.4.25/htdocs
- ./php-http/httpd/conf:/usr/local/httpd-2.4.25/conf
- ./php-http/httpd/logs:/usr/local/httpd-2.4.25/logs
- ./php-http/php/php.ini:/etc/php.ini
command: /usr/local/httpd-2.4.25/bin/httpd -D FOREGROUND
tty: true
privileged: true
container_name: apache
hostname: apache
mysql:
image: mysql-5.7:v2
volumes:
- /etc/localtime:/etc/localtime
- ./mysql/my.cnf:/etc/mysql/my.cnf
- ./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
tty: true
privileged: true
container_name: mysql
hostname: mysql
ports:
- "33006:3306"
- 創(chuàng)建使用Dockerfile創(chuàng)建鏡像后使用docker-compose up啟動(dòng)容器