前言
談到微服務(wù)的話題加勤,技術(shù)上我們往往會(huì)涉及到多服務(wù)、多容器的部署與管理。
Docker 有三個(gè)主要的作用:Build, Ship和Run宙枷。使用docker compose我們可以在Run的層面解決很多實(shí)際問題粟害,如:通過(guò)創(chuàng)建compose(基于YUML語(yǔ)法)文件蕴忆,在這個(gè)文件上面描述應(yīng)用的架構(gòu),如使用什么鏡像悲幅、數(shù)據(jù)卷套鹅、網(wǎng)絡(luò)站蝠、綁定服務(wù)端口等等,然后再用一條命令就可以管理所有的服務(wù)(如啟動(dòng)卓鹿、停止菱魔、重啟、日志監(jiān)控等等)吟孙。
1澜倦、docker-compose是什么
Compose是定義和運(yùn)行多容器Docker應(yīng)用程序的工具。 使用Compose杰妓,您可以使用YAML文件來(lái)配置應(yīng)用程序的docker服務(wù)藻治。 然后,使用單個(gè)命令巷挥,您可以創(chuàng)建并啟動(dòng)配置中的所有docker服務(wù)桩卵。
Compose適用于所有環(huán)境:生產(chǎn),開發(fā)倍宾,測(cè)試以及CI工作流程吸占。使用Compose基本上是一個(gè)三步過(guò)程:
- 使用Dockerfile定義應(yīng)用程序的環(huán)境,以便在任何地方進(jìn)行復(fù)制凿宾。
- 在docker-compose.yml中定義組成應(yīng)用程序的服務(wù)矾屯,以便它們可以在隔離的環(huán)境中一起運(yùn)行。
- 運(yùn)行docker-compose并撰寫開始并運(yùn)行你的整個(gè)應(yīng)用程序初厚。
2件蚕、談?wù)勅萜骶幣排c部署
Docker有很多優(yōu)勢(shì),但對(duì)于運(yùn)維或開發(fā)者來(lái)說(shuō)产禾,Docker最大的有點(diǎn)在于它提供了一種全新的發(fā)布機(jī)制排作。這種發(fā)布機(jī)制,指的是我們使用Docker鏡像作為統(tǒng)一的軟件制品載體亚情,使用Docker容器提供獨(dú)立的軟件運(yùn)行上下文環(huán)境妄痪,使用Docker Hub提供鏡像統(tǒng)一協(xié)作,最重要的是該機(jī)制使用Dockerfile定義容器內(nèi)部行為和容器關(guān)鍵屬性來(lái)支撐軟件運(yùn)行楞件。
Dockerfile作為整個(gè)機(jī)制的核心衫生。這是一個(gè)非常了不起的創(chuàng)新,因?yàn)樵贒ockerfile中土浸,不但能夠定義使用者在容器中需要進(jìn)行的操作罪针,而且能夠定義容器中運(yùn)行軟件需要的配置,于是軟件開發(fā)和運(yùn)維終于能夠在一個(gè)配置文件上達(dá)成統(tǒng)一黄伊。運(yùn)維人員使用同一個(gè)Dockerfile能在不同的場(chǎng)合下“重現(xiàn)”與開發(fā)者環(huán)境中一模一樣的運(yùn)行單元(Docker容器)出來(lái)泪酱。
3、為什么要使用Compose
先來(lái)想一下我們平時(shí)是怎么樣使用docker的?把它進(jìn)行拆分一下:
1墓阀、docker search 鏡像毡惜,是不是先查找一個(gè)鏡像;
2斯撮、docker run -itd 鏡像名稱 经伙,然后在運(yùn)行這個(gè)鏡像;
3吮成、然后如果你要在運(yùn)行第二個(gè)鏡像橱乱、第三個(gè)鏡像.....等等鏡像辜梳,你是不是又要docker search粱甫、docker run運(yùn)行。
上面“ docker run it 鏡像名稱 ”這只是最小的動(dòng)作作瞄, 如果你要映射硬盤茶宵,設(shè)置nat網(wǎng)絡(luò)或者映射端口等等…你就要做更多的 docker 操作, 這顯然是非常沒有效率的宗挥,況且如果你要大規(guī)模部署乌庶,是不是覺得就很麻煩了。
如果將上面的操作寫在docker-compose.yml里面契耿。你只需要寫好后只運(yùn)行一句:docker-compose up -d就好了
4瞒大、了解下編排和部署
編排,即orchestration搪桂,它根據(jù)被部署的對(duì)象之間的耦合關(guān)系透敌,以及被部署對(duì)象環(huán)境的依賴,制定部署流程中各個(gè)動(dòng)作的執(zhí)行順序踢械,部署過(guò)程所需要的依賴文件的存儲(chǔ)位置和獲取方式酗电,以及如何驗(yàn)證部署成功。這些信息都會(huì)在編排工具中以指定的格式(比如配置文件或者特定的代碼)來(lái)要求運(yùn)維人員定義并保存起來(lái)内列,從而保證這個(gè)流程能夠隨時(shí)在全新的環(huán)境中可靠有序地重現(xiàn)出來(lái)撵术。
部署,即deployment话瞧,它是指按照編排所指定的內(nèi)容和流程 嫩与,在目標(biāo)機(jī)器上執(zhí)行編排指定環(huán)境初始化,存放指定的依賴和文件交排,運(yùn)行指定的部署動(dòng)作蕴纳,最終按照編排中的規(guī)則來(lái)確認(rèn)聯(lián)署成功。
而在Compose的世界里个粱,編排和部署的組合結(jié)果古毛,就是一朵“容器云”。
docker-compose.yml
Services:
- 一個(gè)service代表一個(gè)container,這個(gè)container可以通過(guò)dockerhub的image創(chuàng)建稻薇,或者通過(guò)本地的Dockerfile build出來(lái)的image創(chuàng)建出來(lái)嫂冻。
- Service的啟動(dòng)類似docker run,我們可以給其指定network和volume塞椎,所以可以給service指定network和Volume的引用
docker-compose中YAML常用的字段:
安裝docker-compose
下載最新版本安裝桨仿,下載時(shí)間可能比較長(zhǎng)
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
將可執(zhí)行權(quán)限應(yīng)用于docker-compose:
sudo chmod +x /usr/local/bin/docker-compose
驗(yàn)證docker-compose是否下載成功
[root@192 ~]# docker-compose --version
docker-compose version 1.25.0, build 0a186604
docker-compose用法
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose命令
build 構(gòu)建或重建服務(wù)
help 命令幫助
kill 殺掉容器
logs 顯示容器的輸出內(nèi)容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務(wù)鏡像
restart 重啟服務(wù)
rm 刪除停止的容器
run 運(yùn)行一個(gè)一次性命令
scale 設(shè)置服務(wù)的容器數(shù)目
start 開啟服務(wù)
stop 停止服務(wù)
up 創(chuàng)建并啟動(dòng)容器
更多查看幫助 docker-compose -h
一鍵部署lnmp平臺(tái)
我們先來(lái)看下/compose_lnmp目錄下的docker-compose.yml文件:
[root@ganbing compose_lnmp]# ls
docker-compose.yml mysql nginx php wwwroot
[root@ganbing compose_lnmp]# cat docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 80:80
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
php:
hostname: php
build:
context: ./php
dockerfile: Dockerfile
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
mysql:
hostname: mysql
image: mysql:5.6
ports:
- 3306:3306
networks:
- lnmp
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
command: --character-set-server=utf8
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: ganbing
MYSQL_PASSWORD: ganbing123
networks:
lnmp:
driver: bridge
可以看到一份標(biāo)準(zhǔn)配置文件應(yīng)該包含 version、services案狠、networks 三大部分服傍,共有三級(jí)標(biāo)簽,每一級(jí)都是縮進(jìn)兩個(gè)空格骂铁。下面來(lái)詳細(xì)說(shuō)明一下里面的內(nèi)容:
1吹零、version: '3'
這是定義compose的版本號(hào)為version 3,可以參考官方文檔詳細(xì)了解具體有哪些版本 https://docs.docker.com/compose/compose-file/
2拉庵、services:
nginx:這是services下面的二級(jí)標(biāo)簽灿椅,名字用戶自己定義,它將是服務(wù)運(yùn)行后的名稱钞支;
hostname: nginx 這是定義容器的主機(jī)名茫蛹,將寫入到/etc/hostname中;
build:
?context: ./nginx 指定nginx服務(wù)的上下文路徑烁挟;
?dockerfile:Dockerfile 指定通過(guò)上面指定路徑中的Dockerilfe來(lái)構(gòu)建婴洼;
ports:
?- 80:80 端口映射沒什么好說(shuō)的;
networks:
?-lnmp 指定的網(wǎng)絡(luò)環(huán)境
volumes:把宿主機(jī)的/wwwroot目錄綁定到容器中的/usr/local/nginx/html目錄撼嗓;
php:這個(gè)二級(jí)標(biāo)簽服務(wù)和下面的內(nèi)容跟nginx差不多柬采;
mysql:這個(gè)二級(jí)標(biāo)簽服務(wù)也和nginx、php差不多静稻,唯一不同的是多了個(gè)images標(biāo)簽警没、還有定義了些環(huán)境變量。
image: mysql:5.6 它是通過(guò)mysql:5.6鏡像來(lái)構(gòu)建mysql服務(wù)器振湾,前面nginx杀迹、php都指定了上下文通過(guò)Dockerfile來(lái)構(gòu)建的。
environment:
?MYSQL_ROOT_PASSWORD:定義root用戶密碼變量為123456押搪;
?MYSQL_DATABASE:定義了數(shù)據(jù)變量為wordpress树酪;
?MYSQL_USER:定義了普通用戶變量為ganbing;
?MYSQL_PASSWORD:定義了普通用戶密碼變量為ganbing123;
3、networks:
???lnmp: 相當(dāng)于執(zhí)行docker network create lnmp命令了大州;
最后來(lái)運(yùn)行docker-compose命令來(lái)啟動(dòng):
[root@ganbing /]# cd compose_lnmp/
[root@ganbing compose_lnmp]# docker-compose -f docker-compose.yml up -d
來(lái)查看一下是否啟動(dòng)完成:
[root@ganbing compose_lnmp]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
composelnmp_mysql_1 docker-entrypoint.sh --cha ... Up 0.0.0.0:3306->3306/tcp
composelnmp_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:80->80/tcp
composelnmp_php_1 ./sbin/php-fpm -c /usr/loc ... Up 9000/tcp
從上面可以看出這3個(gè)服務(wù)都是UP狀態(tài)续语,運(yùn)行 docker-compose ps必須要在有docker-compose.yml文件目錄下執(zhí)行才可以。
總結(jié)思考
大家想想厦画,僅僅使用Compose疮茄,就可以構(gòu)建自己的容器云嗎滥朱?答案顯然是否定的。docker-compose解決的問題局限在“編排”二字力试,甚至連“部署”范疇都涉足甚少徙邻,而在一個(gè)能夠服務(wù)于大眾的云平臺(tái)中,編排與部署也僅僅是其中的一個(gè)組成部分而已畸裳。來(lái)一起分析一下它的局限制會(huì)有哪些:
1缰犁、docker-compse是面向單宿主機(jī)部署的,這是一種部署能力的欠缺怖糊。在更多的場(chǎng)合下帅容,管理員需要面對(duì)大量物理服務(wù)器(或者虛擬機(jī)),這時(shí)如果要實(shí)現(xiàn)基于docker-compose的容器自動(dòng)化編排與部署伍伤,管理員就得借助成熟的自動(dòng)化運(yùn)維工具(ansible并徘、puppet、chef嚷缭、saltstack)來(lái)負(fù)責(zé)管理多個(gè)目標(biāo)主機(jī)饮亏,將docker-compose所需的所有資源(配置文件耍贾、用戶代碼)交給目標(biāo)主機(jī)阅爽,然后在目標(biāo)主機(jī)上執(zhí)行docker-compose指令。
2荐开、同樣網(wǎng)絡(luò)和存儲(chǔ)也比較棘手付翁,Docker不能提供跨宿主機(jī)的網(wǎng)絡(luò),完全面向Docker daemon的docker-compose當(dāng)然也不支持晃听。這意味著管理員必須部署一套類似于Open vSwich的獨(dú)立網(wǎng)絡(luò)工具百侧,而且管理員還需要完成集成工作。當(dāng)好不容易把容器編排都安排妥當(dāng)之后能扒,又會(huì)發(fā)現(xiàn)容器還處在內(nèi)網(wǎng)環(huán)境中佣渴,于是負(fù)載均衡、服務(wù)發(fā)現(xiàn)等一堆問題就面臨而來(lái)了初斑,這些問題很快能消耗掉工程師所有的耐心辛润。
那么,是否有一種能夠提供完善的面向服務(wù)器集群的Docker編排和部署方案呢见秤?Docker官方給出的答案是Compose同Machine和Swarm聯(lián)動(dòng)砂竖,其實(shí)還有大家近期經(jīng)常聽到了kubernetes(k8s)
參考
https://www.cnblogs.com/elvi/p/8424753.html
https://www.cnblogs.com/nulige/articles/10931047.html
https://docs.docker.com/compose/compose-file/