做的網站侵犯美的商標賠償多少錢廣州網絡推廣公司
目錄
Docker Compose
Compose的優(yōu)點
編排和部署
Compose原理
Compose應用案例
安裝docker-ce
阿里云鏡像加速器
安裝docker-compose
docker-compose用法
Yaml簡介
驗證LNMP環(huán)境?
Docker Compose
????????Docker Compose 的前身是 Fig,它是一個定義及運行多個 Docker 容器的工具。可以使用YAML文件來配置應用程序的服務。然后,使用單個命令,您可以創(chuàng)建并啟動配置中的所有服務。Docker Compose 會通過解析容器間的依賴關系(link, 網絡容器 -net-from 或數(shù)據容器 -volume-from)按先后順序啟動所定義的容器。
????????Compose 是 Docker 的服務編排工具,主要用來構建基于 Docker 的復雜應用,Compose 通過一個配置文件來管理多個 Docker 容器,非常適合組合使用多個容器進行開發(fā)的場景。
Compose適用于所有環(huán)境:生產,開發(fā),測試以及CI工作流程。使用Compose基本上是一個三步過程:
- 使用Dockerfile定義應用程序的環(huán)境,以便在任何地方進行復制。
- 在docker-compose.yml中定義組成應用程序的服務,以便它們可以在隔離的環(huán)境中一起運行。
- 運行docker-compose開始并運行整個應用程序。
docker-compose官方文檔:Docker Compose overview | Docker Documentation
?
????????docker-compose 是用來做docker 的多容器控制,有了 docker-compose 你可以把所有繁復的 docker 操作全都用一條命令自動化完成。從上圖可以看到,這位compose非常開心的把N多個容器抓在一起,根據自己的心情來編排部署。
????????Docker對于運維或開發(fā)者來說,Docker最大的優(yōu)點在于它提供了一種全新的發(fā)布機制。這種發(fā)布機制,指的是我們使用Docker鏡像作為統(tǒng)一的軟件制品載體,使用Docker容器提供獨立的軟件運行上下文環(huán)境,使用Docker Hub提供鏡像統(tǒng)一協(xié)作,最重要的是該機制使用Dockerfile定義容器內部行為和容器關鍵屬性來支撐軟件運行。
????????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 鏡像名稱?”這只是最小的動作,如果你要映射硬盤,設置nat網絡或者映射端口等等。就要做更多的 docker 操作,這顯然是非常沒有效率的,況且如果你要大規(guī)模部署,是不是覺得就很麻煩了。
但是我們寫在docker-compose里面就很好了。你只需要寫好后只運行一句:
docker-compose up -d
編排和部署
????????編排,即orchestration,它根據被部署的對象之間的耦合關系,以及被部署對象環(huán)境的依賴,制定部署流程中各個動作的執(zhí)行順序,部署過程所需要的依賴文件的存儲位置和獲取方式,以及如何驗證部署成功。這些信息都會在編排工具中以指定的格式(比如配置文件或者特定的代碼)來要求運維人員定義并保存起來,從而保證這個流程能夠隨時在全新的環(huán)境中可靠有序地重現(xiàn)出來。
????????部署,即deployment,它是指按照編排所指定的內容和流程 ,在目標機器上執(zhí)行編排指定環(huán)境初始化,存放指定的依賴和文件,運行指定的部署動作,最終按照編排中的規(guī)則來確認聯(lián)署成功。
????????這么來解釋吧,編排是一個指揮家,他的大腦里存儲了整個樂曲的演奏流程,對于每一個小節(jié)每一段音樂的演奏方式、開始、結束他都了然于胸;部署就是整個樂隊,他們嚴格按照指揮家的意圖用樂器來完成樂譜的執(zhí)行,在需要時開始演奏,又在適當?shù)臅r機停止演奏。最終,兩者通過協(xié)作就能把每一位演奏者獨立的演奏通過組合、重疊、銜接來形成高品位的交響樂。
Compose原理
docker-compose的調用過程扁平的像一張紙,僅用一張簡單的模塊圖就足夠解釋明白,如下圖所示:
?
????????首先,用戶執(zhí)行的docker-compose up -d指令調用了命令行中的啟動方法。功能很簡單明了,一個docker-compose.yml定義了一個docker-compose的project,docker-compose操作提供的命令行參數(shù)則作為這個project的啟動參數(shù)交由project模塊去處理。
????????其次,如果當前宿主機已經存在與該應用對應的容器,docker-compose將進行行為邏輯判斷。如果用戶指定可以重新啟動已有服務,docker-compose就會執(zhí)行service模塊的容器重啟方法,否則就將直接啟動已有容器。這兩種操作的區(qū)別在于前者會停止舊的容器,創(chuàng)建啟動新的容器,并把舊容器移除掉。在這個過程中創(chuàng)建容器的各項定義參數(shù)都是從docker-compose up 指令和docker-compose.yml中傳入的。
????????接下來,啟動容器的方法也很簡潔,這個方法中完成了一個Docker容器啟動所需的主要參數(shù)的封裝,并在container模塊執(zhí)行啟動。該方法所支持的參數(shù)我想大多數(shù)朋友過是有所了解的。
????????最后,container模塊會調用docker-py客戶端執(zhí)行向Docker daemon發(fā)起創(chuàng)建容器的POST請求,再往后就是Docker處理的范疇了,相信看過我這篇文章?Docker:架構拆解請的朋友就明白了。
????????為了能夠說明compose如何實現(xiàn)上述編排與部署的原理,下面和大家分享一個通過compose來編排部署LNMP服務來更好的理解它。
Compose應用案例
安裝docker-ce
?
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[root@localhost ~]# ls /etc/yum.repos.d/backup Centos-aliyun.repo CentOS-Media.repo docker-ce.repo[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
阿里云鏡像加速器
阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計算服務平臺歡迎登錄阿里云,全球領先的云計算及人工智能科技公司,阿里云為200多個國家和地區(qū)的企業(yè)、開發(fā)者和政府機構提供云計算基礎服務及解決方案。阿里云云計算、安全、大數(shù)據、人工智能、企業(yè)應用、物聯(lián)網等云計算服務。https://cr.console.aliyun.com/
?
[root@localhost ~]# cat << END > /etc/docker/daemon.json
{"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker version
Client: Docker Engine - CommunityVersion: 19.03.8API version: 1.40Go version: go1.12.17Git commit: afacb8bBuilt: Wed Mar 11 01:27:04 2020OS/Arch: linux/amd64Experimental: falseServer: Docker Engine - CommunityEngine:Version: 19.03.8API version: 1.40 (minimum version 1.12)Go version: go1.12.17Git commit: afacb8bBuilt: Wed Mar 11 01:25:42 2020OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.2.13GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429runc:Version: 1.0.0-rc10GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dddocker-init:Version: 0.18.0GitCommit: fec3683
安裝docker-compose
docker-compose提取鏈接:https://pan.baidu.com/s/1ArQGMU0MYW5aILUHkqokXQ?pwd=1zuw?
提取碼:1zuw
[root@compose ~]# rz #上傳docker-compose文件[root@compose ~]# mv docker-compose /usr/local/bin/mv:是否覆蓋"/usr/local/bin/docker-compose"? y[root@compose ~]# chmod +x /usr/local/bin/docker-compose[root@compose ~]# docker-compose --versiondocker-compose version 1.21.1, build 5a3f1a3
docker-compose用法
docker-compose ?[-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose 常用選項:
- --verbose 輸出更多調試信息。
- --version 打印版本并退出。
- -f, --file FILE 使用特定的 compose 模板文件,默認為docker-compose.yml。
- -p, --project-name NAME 指定項目名稱,默認使用目錄名稱。
docker-compose常用命令:
- build? 構建或重建服務
- kill??? 殺掉容器
- logs?? 顯示容器的輸出內容
- port?? 打印綁定的開放端口
- ps??? 顯示容器
- pull?? 拉取服務鏡像
- restart? 重啟服務
- rm?? 刪除停止的容器
- run?? 運行一個一次性命令
- scale? 設置服務的容器數(shù)目
- exec? 切換到容器內
- start? 開啟服務
- stop? 停止服務
- up?? 創(chuàng)建并啟動容器
其實這些常用命令用docker的命令功能是一樣的。
Yaml簡介
YAML是一種標記語言,可讀性很強。類似于XML數(shù)據描述語言,語法比XML簡單的多。YAML數(shù)據結構通過縮進來表示,連續(xù)的項目通過減號來表示,鍵值對用冒號分割,數(shù)組用括號括起來,hash用花括號括起來。
YAML文件格式注意事項:
在縮排中空白字符的數(shù)目并不是非常重要,只要相同階層的元素左側對齊就可以了(不過不能使用TAB字符);
- 通常開頭縮進2個空格;
- 字符的后面縮進1個空格,比如冒號、逗號、橫桿;
- 支持#注釋;
- 允許在文件中加入選擇性的空行,以增加可讀性;
docker-compose中YAML常用的字段:
?目錄結構
compose_lnmp-190606.zip文件提取鏈接:https://pan.baidu.com/s/1UqA6L9O6-tTkBcUyf-v3zQ?pwd=7bkk?
提取碼:7bkk
[root@localhost ~]# mkdir compose_lnmp[root@localhost ~]# cd compose_lnmp/[root@localhost compose_lnmp]# rz #上傳compose_lnmp-190606.zip文件[root@localhost compose_lnmp]# unzip compose_lnmp-190606.zip Archive: compose_lnmp-190606.zipinflating: compose_lnmp/nginx/nginx.conf inflating: compose_lnmp/docker-compose.yml creating: compose_lnmp/mysql/creating: compose_lnmp/mysql/conf/inflating: compose_lnmp/mysql/conf/my.cnf creating: compose_lnmp/mysql/data/inflating: compose_lnmp/nginx/Dockerfile inflating: compose_lnmp/nginx/nginx-1.12.1.tar.gz extracting: compose_lnmp/nginx/run.sh creating: compose_lnmp/php/inflating: compose_lnmp/php/Dockerfile inflating: compose_lnmp/php/php-5.6.39.tar.gz inflating: compose_lnmp/php/php.ini creating: compose_lnmp/wwwroot/extracting: compose_lnmp/wwwroot/index.html extracting: compose_lnmp/wwwroot/index.php [root@localhost compose_lnmp]# tree
.
├── compose_lnmp
│?? ├── docker-compose.yml
│?? ├── mysql
│?? │?? ├── conf
│?? │?? │?? └── my.cnf
│?? │?? └── data
│?? ├── nginx
│?? │?? ├── Dockerfile
│?? │?? ├── nginx-1.12.1.tar.gz
│?? │?? ├── nginx.conf
│?? │?? └── run.sh
│?? ├── php
│?? │?? ├── Dockerfile
│?? │?? ├── php-5.6.39.tar.gz
│?? │?? └── php.ini
│?? └── wwwroot
│?? ├── index.html
│?? └── index.php
└── compose_lnmp-190606.zip7 directories, 12 files
編寫compose文件
[root@compose compose_lnmp]# cat docker-compose.yml
version: '3'
services:nginx:hostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 80:80networks:- lnmpvolumes:- ./wwwroot:/usr/local/nginx/htmlphp:hostname: phpbuild:context: ./phpdockerfile: Dockerfileports:- 9000:9000networks:- lnmpvolumes:- ./wwwroot:/usr/local/nginx/htmlmysql:hostname: mysqlimage: mysql:5.6ports:- 3306:3306networks:- lnmpvolumes:- ./mysql/conf:/etc/mysql/conf.d- ./mysql/data:/var/lib/mysqlcommand: --character-set-server=utf8environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: wordpressMYSQL_USER: userMYSQL_PASSWORD: user123networks:lnmp:
可以看到一份標準配置文件應該包含 version、services、networks 三大部分,共有三級標簽,每一級都是縮進兩個空格。下面來詳細說明一下里面的內容:
version: '3'??這是定義compose的版本號為version 3,可以參考官方文檔詳細了解具體有哪些版本?Overview | Docker Documentation
services:
nginx:這是services下面的二級標簽,名字用戶自己定義,它將是服務運行后的名稱;
hostname: nginx 這是定義容器的主機名,將寫入到/etc/hostname中;
build:
?context: ./nginx 指定nginx服務的上下文路徑;
?dockerfile:Dockerfile 指定通過上面指定路徑中的Dockerilfe來構建;
ports:
?- 80:80 端口映射沒什么好說的;
networks:
?-lnmp 指定的網絡環(huán)境
volumes:把宿主機的/wwwroot目錄綁定到容器中的/usr/local/nginx/html目錄;
php:這個二級標簽服務和下面的內容跟nginx差不多;
mysql:這個二級標簽服務也和nginx、php差不多,唯一不同的是多了個images標簽、還有定義了些環(huán)境變量。
image: mysql:5.6 它是通過mysql:5.6鏡像來構建mysql服務器,前面nginx、php都指定了上下文通過Dockerfile來構建的。
??environment:
? ?MYSQL_ROOT_PASSWORD:定義root用戶密碼變量為123456;
? ?MYSQL_DATABASE:定義了數(shù)據變量為wordpress;
? ?MYSQL_USER:定義了普通用戶變量為user;
? ?MYSQL_PASSWORD:定義了普通用戶密碼變量為user123;
3、networks:
???lnmp: 相當于執(zhí)行docker network create lnmp命令了;
最后來運行docker-compose命令來啟動:
[root@localhost ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7sha256:7ed67541d15fe31090ac0cf8528c5a05c8f6ecff3a17a57c6820004ecd823240[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 7ed67541d15f 17 seconds ago 589MB[root@localhost compose_lnmp]# docker-compose -f docker-compose.yml up -dStatus: Downloaded newer image for mysql:5.6
Creating compose_lnmp_mysql_1 ... done
Creating compose_lnmp_nginx_1 ... done
Creating compose_lnmp_php_1 ... done[root@localhost compose_lnmp]# docker-compose psName Command State Ports
----------------------------------------------------------------------------------------
compose_lnmp_mysql_1 docker-entrypoint.sh --cha Up 0.0.0.0:3306->3306/tcp,:::3... 306->3306/tcp
compose_lnmp_nginx_1 /run.sh Up 0.0.0.0:80->80/tcp,:::80->80/tcp
compose_lnmp_php_1 ./sbin/php-fpm -c /usr/loc Up 0.0.0.0:9000->9000/tcp,:::9... 000->9000/tcp
驗證LNMP環(huán)境?
客戶端使用瀏覽器驗證 docker-compose 創(chuàng)建的 lnmp 環(huán)境
?
?
PS:如果訪問報 Access denined.,手動進入 nginx 容器添加讀權限。
docker-compose解決的問題局限在“編排”二字,甚至連“部署”范疇都涉足甚少,而在一個能夠服務于大眾的云平臺中,編排與部署也僅僅是其中的一個組成部分而已。來一起分析一下它的局限制會有哪些:
- docker-compse是面向單宿主機部署的,這是一種部署能力的欠缺。在更多的場合下,管理員需要面對大量物理服務器(或者虛擬機),這時如果要實現(xiàn)基于docker-compose的容器自動化編排與部署,管理員就得借助成熟的自動化運維工具(ansible、puppet、chef、saltstack)來負責管理多個目標主機,將docker-compose所需的所有資源(配置文件、用戶代碼)交給目標主機,然后在目標主機上執(zhí)行docker-compose指令。
- 同樣網絡和存儲也比較棘手,Docker不能提供跨宿主機的網絡,完全面向Docker daemon的docker-compose當然也不支持。這意味著管理員必須部署一套類似于Open vSwich的獨立網絡工具,而且管理員還需要完成集成工作。當好不容易把容器編排都安排妥當之后,又會發(fā)現(xiàn)容器還處在內網環(huán)境中,于是負載均衡、服務發(fā)現(xiàn)等一堆問題就面臨而來了,這些問題很快能消耗掉工程師所有的耐心。
那么,是否有一種能夠提供完善的面向服務器集群的Docker編排和部署方案呢?Docker官方給出的答案是Compose同Machine和Swarm聯(lián)動,其實還有大家近期經常聽到了kubernetes(k8s)。