第四階段
時 ?間:2023年8月3日
參加人:全班人員
內(nèi) ?容:
Docker-Compose編排與部署
目錄
一、Docker Compose
(一)概述
(二)Compose適用于所有環(huán)境:
(三)docker-compose官方文檔:
(四)Compose的優(yōu)點:
(五)編排和部署
二、Compose原理
三、Compose應(yīng)用案例
(一)安裝docker-ce(Linux安裝Docker)
(二)安裝docker-compose
(三)docker-compose用法
(四)docker-compose 常用選項:
(五)docker-compose常用命令:
四、yaml簡介
五、安裝docker compose部署lnmp
(一)目錄結(jié)構(gòu):
(二)編寫compose文件:
一、Docker Compose
(一)概述
????????Docker Compose 的前身是 Fig,它是一個定義及運行多個 Docker 容器的工具。
??????? 可以使用YAML文件來配置應(yīng)用程序的服務(wù)。
????????然后,使用單個命令,您可以創(chuàng)建并啟動配置中的所有服務(wù)。Docker Compose 會通過解析容器間的依賴關(guān)系(link, 網(wǎng)絡(luò)容器 -net-from 或數(shù)據(jù)容器 -volume-from)按先后順序啟動所定義的容器。
????????Compose 是 Docker 的服務(wù)編排工具,主要用來構(gòu)建基于 Docker 的復雜應(yīng)用,Compose 通過一個配置文件來管理多個 Docker 容器,非常適合組合使用多個容器進行開發(fā)的場景。
(二)Compose適用于所有環(huán)境:
生產(chǎn),開發(fā),測試以及CI工作流程。使用Compose基本上是一個三步過程:
????????使用Dockerfile定義應(yīng)用程序的環(huán)境,以便在任何地方進行復制。
????????在docker-compose.yml中定義組成應(yīng)用程序的服務(wù),以便它們可以在隔離的環(huán)境中一起運行。
????????運行docker-compose開始并運行整個應(yīng)用程序。
(三)docker-compose官方文檔:
Docker Compose overview | Docker Documentation
?
????????docker-compose 是用來做docker 的多容器控制,有了 docker-compose 你可以把所有繁復的 docker 操作全都用一條命令自動化完成。
????????從上圖可以看到,這位compose非常開心的把N多個容器抓在一起,根據(jù)自己的心情來編排部署。
????????Docker對于運維或開發(fā)者來說,Docker最大的優(yōu)點在于它提供了一種全新的發(fā)布機制。這種發(fā)布機制,指的是我們使用Docker鏡像作為統(tǒng)一的軟件制品載體,使用Docker容器提供獨立的軟件運行上下文環(huán)境,使用Docker Hub提供鏡像統(tǒng)一協(xié)作,最重要的是該機制使用Dockerfile定義容器內(nèi)部行為和容器關(guān)鍵屬性來支撐軟件運行。
????????Dockerfile作為整個機制的核心。在Dockerfile中不但能夠定義使用者在容器中需要進行的操作,而且能夠定義容器中運行軟件需要的配置,于是軟件開發(fā)和運維終于能夠在一個配置文件上達成統(tǒng)一。
????????運維人員使用同一個Dockerfile能在不同的場合下“重現(xiàn)”與開發(fā)者環(huán)境中一模一樣的運行單元(Docker容器)出來。
(四)Compose的優(yōu)點:
先來了解一下我們平時是怎么樣使用docker的?把它進行拆分一下:
????????1、docker search 鏡像,是不是先查找一個鏡像;
????????2、docker run -itd 鏡像名稱 ,然后在運行這個鏡像;
????????3、然后如果你要在運行第二個鏡像、第三個鏡像.....等等,你是不是又要docker search、docker run運行。
????????上面“ docker run -itd 鏡像名稱 ”這只是最小的動作,如果你要映射硬盤,設(shè)置nat網(wǎng)絡(luò)或者映射端口等等。就要做更多的 docker 操作,這顯然是非常沒有效率的,況且如果你要大規(guī)模部署,是不是覺得就很麻煩了。
????????但是我們寫在docker-compose里面就很好了。你只需要寫好后只運行一句:
docker-compose up -d
(五)編排和部署
????????編排,即orchestration,它根據(jù)被部署的對象之間的耦合關(guān)系,以及被部署對象環(huán)境的依賴,制定部署流程中各個動作的執(zhí)行順序,部署過程所需要的依賴文件的存儲位置和獲取方式,以及如何驗證部署成功。這些信息都會在編排工具中以指定的格式(比如配置文件或者特定的代碼)來要求運維人員定義并保存起來,從而保證這個流程能夠隨時在全新的環(huán)境中可靠有序地重現(xiàn)出來。
????????部署,即deployment,它是指按照編排所指定的內(nèi)容和流程 ,在目標機器上執(zhí)行編排指定環(huán)境初始化,存放指定的依賴和文件,運行指定的部署動作,最終按照編排中的規(guī)則來確認聯(lián)署成功。
這么來解釋吧,編排是一個指揮家,他的大腦里存儲了整個樂曲的演奏流程,對于每一個小節(jié)每一段音樂的演奏方式、開始、結(jié)束他都了然于胸;部署就是整個樂隊,他們嚴格按照指揮家的意圖用樂器來完成樂譜的執(zhí)行,在需要時開始演奏,又在適當?shù)臅r機停止演奏。最終,兩者通過協(xié)作就能把每一位演奏者獨立的演奏通過組合、重疊、銜接來形成高品位的交響樂。
二、Compose原理
????????docker-compose的調(diào)用過程扁平的像一張紙,僅用一張簡單的模塊圖就足夠解釋明白,如下圖所示:
????????首先,用戶執(zhí)行的docker-compose up -d指令調(diào)用了命令行中的啟動方法。功能很簡單明了,一個docker-compose.yml定義了一個docker-compose的project,docker-compose操作提供的命令行參數(shù)則作為這個project的啟動參數(shù)交由project模塊去處理。
????????其次,如果當前宿主機已經(jīng)存在與該應(yīng)用對應(yīng)的容器,docker-compose將進行行為邏輯判斷。如果用戶指定可以重新啟動已有服務(wù),docker-compose就會執(zhí)行service模塊的容器重啟方法,否則就將直接啟動已有容器。
????????這兩種操作的區(qū)別在于前者會停止舊的容器,創(chuàng)建啟動新的容器,并把舊容器移除掉。在這個過程中創(chuàng)建容器的各項定義參數(shù)都是從docker-compose up 指令和docker-compose.yml中傳入的。
????????接下來,啟動容器的方法也很簡潔,這個方法中完成了一個Docker容器啟動所需的主要參數(shù)的封裝,并在container模塊執(zhí)行啟動。該方法所支持的參數(shù)我想大多數(shù)朋友過是有所了解的。
????????最后,container模塊會調(diào)用docker-py客戶端執(zhí)行向Docker daemon發(fā)起創(chuàng)建容器的POST請求,再往后就是Docker處理的范疇了,相信看過我這篇文章?Docker:架構(gòu)拆解請的朋友就明白了。
三、Compose應(yīng)用案例
????????為了能夠說明compose如何實現(xiàn)上述編排與部署的原理,下面和大家分享一個通過compose來編排部署LNMP服務(wù)來更好的理解它。
(一)安裝docker-ce(Linux安裝Docker)
CentOS系統(tǒng)下安裝Docker可以有兩種方式:
一種是使用curl獲得Docker的安裝腳本進行安裝,
另一種是使用YUM倉庫來安裝Docker。主要注意的是目前Docker只能支持64位系統(tǒng)。
1、安裝前準備:
[root@huyang1 ~]# iptables -F
[root@huyang1 ~]# setenforce 0
[root@huyang1 ~]# systemctl stop firewalld
保證可以訪問互聯(lián)網(wǎng)
[root@huyang1 ~]# ping www.baidu.com
[root@huyang1 ~]# ls /etc/yum.repos.d/
[root@huyang1 yum.repos.d]# yum clean all && yum makecache fast
2、安裝docker-ce
[root@huyang1 ~]# wget -O
/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@huyang1 ~]# yum -y install yum-utils
device-mapper-persistent-data lvm2
[root@huyang1 ~]# yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@huyang1 ~]# ls /etc/yum.repos.d/
[root@huyang1 ~]# yum -y install docker-ce
[root@huyang1 ~]# docker version ?查看版本
[root@huyang1 ~]# systemctl start docker
[root@huyang1 ~]# systemctl enable docker
3、阿里云鏡像加速器
阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計算服務(wù)平臺
[root@huyang1 ~]# cat << END > /etc/docker/daemon.json
{ ??"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@huyang1 ~]# systemctl daemon-reload
[root@huyang1 ~]# systemctl restart docker
[root@huyang1 ~]# docker version
(二)安裝docker-compose
下載最新版本安裝,下載時間可能比較長
[root@compose ~]# curl -L \
https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@compose ~]# chmod +x
/usr/local/bin/docker-compose
[root@compose ~]# docker-compose --version
(三)docker-compose用法
docker-compose ?[-f <arg>...] [options] [COMMAND] [ARGS...]
(四)docker-compose 常用選項:
--verbose 輸出更多調(diào)試信息。
--version 打印版本并退出。
-f, --file FILE 使用特定的 compose 模板文件,默認為docker-compose.yml。
-p, --project-name NAME 指定項目名稱,默認使用目錄名稱。
(五)docker-compose常用命令:
build? 構(gòu)建或重建服務(wù)
kill??? 殺掉容器
logs?? 顯示容器的輸出內(nèi)容
port?? 打印綁定的開放端口
ps??? 顯示容器
pull?? 拉取服務(wù)鏡像
restart? 重啟服務(wù)
rm?? 刪除停止的容器
run?? 運行一個一次性命令
scale? 設(shè)置服務(wù)的容器數(shù)目
exec? 切換到容器內(nèi)
start? 開啟服務(wù)
stop? 停止服務(wù)
up?? 創(chuàng)建并啟動容器
其實這些常用命令用docker的命令功能是一樣的。
四、yaml簡介
????????YAML是一種標記語言,可讀性很強。類似于XML數(shù)據(jù)描述語言,語法比XML簡單的多。YAML數(shù)據(jù)結(jié)構(gòu)通過縮進來表示,連續(xù)的項目通過減號來表示,鍵值對用冒號分割,數(shù)組用括號括起來,hash用花括號括起來。
YAML文件格式注意事項:
????????在縮排中空白字符的數(shù)目并不是非常重要,只要相同階層的元素左側(cè)對齊就可以了(不過不能使用TAB字符);
????????通常開頭縮進2個空格;
????????字符的后面縮進1個空格,比如冒號、逗號、橫桿;
????????支持#注釋;
????????允許在文件中加入選擇性的空行,以增加可讀性;
docker-compose中YAML常用的字段:
五、安裝docker compose部署lnmp
(一)目錄結(jié)構(gòu):
[root@compose ~]# mkdir compose_lnmp/
[root@compose ~]# cd compose_lnmp/
[root@compose compose_lnmp]# tree
(二)編寫compose文件:
[root@compose 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
ports:
- 9000:9000
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: user
MYSQL_PASSWORD: user123
networks:
lnmp:
????????可以看到一份標準配置文件應(yīng)該包含?version、services、networks 三大部分,共有三級標簽,每一級都是縮進兩個空格。
下面來詳細說明一下里面的內(nèi)容:
(一)version:?'3' ?這是定義compose的版本號為version 3,可以參考官方文檔詳細了解具體有哪些版本?Overview | Docker Documentation
(二)services:
nginx:這是services下面的二級標簽,名字用戶自己定義,它將是服務(wù)運行后的名稱;
??hostname: nginx 這是定義容器的主機名,將寫入到/etc/hostname中;build:
context:?./nginx 指定nginx服務(wù)的上下文路徑;
dockerfile:Dockerfile 指定通過上面指定路徑中的Dockerilfe來構(gòu)建;
ports:
?- 80:80 端口映射沒什么好說的;
networks:
?-lnmp 指定的網(wǎng)絡(luò)環(huán)境
volumes:把宿主機的/wwwroot目錄綁定到容器中的/usr/local/nginx/html目錄;php:這個二級標簽服務(wù)和下面的內(nèi)容跟nginx差不多;
mysql:這個二級標簽服務(wù)也和nginx、php差不多,唯一不同的是多了個images標簽、還有定義了些環(huán)境變量。
image: mysql:5.6 它是通過mysql:5.6鏡像來構(gòu)建mysql服務(wù)器,前面nginx、php都指定了上下文通過Dockerfile來構(gòu)建的。
environment:
? ?MYSQL_ROOT_PASSWORD:定義root用戶密碼變量為123456;
? ?MYSQL_DATABASE:定義了數(shù)據(jù)變量為wordpress;
? ?MYSQL_USER:定義了普通用戶變量為user;
? ?MYSQL_PASSWORD:定義了普通用戶密碼變量為user123;
(三)networks:
???lnmp: 相當于執(zhí)行docker network create lnmp命令了;
最后來運行docker-compose命令來啟動:
[root@localhost ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7
[root@localhost ~]# docker images centos:7
[root@localhost compose_lnmp]# docker-compose -f docker-compose.yml up -d
[root@localhost compose_lnmp]# docker-compose ps
驗證LNMP環(huán)境?
客戶端使用瀏覽器驗證 docker-compose 創(chuàng)建的 lnmp 環(huán)境
?
PS:如果訪問報 Access denined.,手動進入 nginx 容器添加讀權(quán)限。
????????docker-compose解決的問題局限在“編排”二字,甚至連“部署”范疇都涉足甚少,而在一個能夠服務(wù)于大眾的云平臺中,編排與部署也僅僅是其中的一個組成部分而已。
來一起分析一下它的局限制會有哪些:
????????docker-compse是面向單宿主機部署的,這是一種部署能力的欠缺。在更多的場合下,管理員需要面對大量物理服務(wù)器(或者虛擬機),這時如果要實現(xiàn)基于docker-compose的容器自動化編排與部署,管理員就得借助成熟的自動化運維工具(ansible、puppet、chef、saltstack)來負責管理多個目標主機,將docker-compose所需的所有資源(配置文件、用戶代碼)交給目標主機,然后在目標主機上執(zhí)行docker-compose指令。
????????同樣網(wǎng)絡(luò)和存儲也比較棘手,Docker不能提供跨宿主機的網(wǎng)絡(luò),完全面向Docker daemon的docker-compose當然也不支持。這意味著管理員必須部署一套類似于Open vSwich的獨立網(wǎng)絡(luò)工具,而且管理員還需要完成集成工作。當好不容易把容器編排都安排妥當之后,又會發(fā)現(xiàn)容器還處在內(nèi)網(wǎng)環(huán)境中,于是負載均衡、服務(wù)發(fā)現(xiàn)等一堆問題就面臨而來了,這些問題很快能消耗掉工程師所有的耐心。文章來源:http://www.zghlxwxcb.cn/news/detail-626590.html
????????那么,是否有一種能夠提供完善的面向服務(wù)器集群的Docker編排和部署方案呢?Docker官方給出的答案是Compose同Machine和Swarm聯(lián)動,其實還有大家近期經(jīng)常聽到了kubernetes(k8s)。文章來源地址http://www.zghlxwxcb.cn/news/detail-626590.html
到了這里,關(guān)于Docker-Compose編排與部署(lnmp實例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!