Docker容器compose容器集群的快速編排方式
引言
Dockerfile可以讓用戶管理一個(gè)單獨(dú)的應(yīng)用容器,而Compose則允許用戶在一個(gè)模板(YAML)中定義一組相關(guān)聯(lián)的應(yīng)用容器(被稱為一個(gè)project,即項(xiàng)目),例如一個(gè)Web服務(wù)器加上后端的數(shù)據(jù)庫(kù)服務(wù)容器等。
一、Docker-compose簡(jiǎn)介
Docker-compose項(xiàng)目是基于Python開發(fā)的Docker官方開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排
Docker-compose將所管理的容器分為三層,分別是工程(project),服務(wù)(service)以及容器(container)。
- Docker-Compose運(yùn)行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個(gè)工程,若無(wú)特殊指定工程名即為當(dāng)前目錄名。
- 一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)、依賴。
- 一個(gè)服務(wù)當(dāng)中可括多個(gè)容器實(shí)例,Docker-compose并沒(méi)有解決負(fù)載均衡的問(wèn)題,因此需要借助其他工具實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及負(fù)載均衡,比如Consul
Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml,可通過(guò)環(huán)境變量COMPOSE_FILE或-f參數(shù)自定義配置文件,其定義了多個(gè)有依賴關(guān)系的服務(wù)及每個(gè)服務(wù)運(yùn)行的容器。
使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。在工作中,經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來(lái)完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)Web項(xiàng)目,除了Web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫(kù)服務(wù)容器,甚至還包括負(fù)載均衡容器等。
Compose允許用戶通過(guò)一個(gè)單獨(dú)的docker-compose.yml模板文件(YAML 格式)來(lái)定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目(project)。
Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來(lái)對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API, 就可以在其上利用Compose來(lái)進(jìn)行編排管理。
二、YAML文件格式及編寫注意事項(xiàng)
1.YAML文件格式
- YAML 是一種標(biāo)記語(yǔ)言,它可以很直觀的展示數(shù)據(jù)序列化格式,可讀性高。
- 類似于 json數(shù)據(jù)描述語(yǔ)言,語(yǔ)法比 json簡(jiǎn)單的很多。
- YAML 數(shù)據(jù)結(jié)構(gòu)通過(guò)縮進(jìn)來(lái)表示,連續(xù)的項(xiàng)目通過(guò)減號(hào)來(lái)表示,鍵值對(duì)用冒號(hào)分隔,數(shù)組用中括號(hào) [ ] 括起來(lái), hash 用花括號(hào) { }括起來(lái)。
2.YAML格式的注意事項(xiàng)
- 不支持制表符 tab 鍵縮進(jìn),只能使用空格縮進(jìn)
- 通常開頭縮進(jìn)2個(gè)空格
- 字符后縮進(jìn)1個(gè)空格,如冒號(hào) : 、逗號(hào) , 、橫杠 -
- 用 # 號(hào)注釋
- 如果包含特殊字符用單引號(hào) ‘’ 引起來(lái)作為普通字符;如果用雙引號(hào)“”表示特殊字符本身的意思
- 布爾值必須用引號(hào) “” 括起來(lái)
- 區(qū)分大小寫
3.YAML數(shù)據(jù)結(jié)構(gòu)
對(duì)象: 鍵值對(duì)的字典 animal: pets 數(shù)組: 一組按次序排列的列表 - cat - dog - goldfish 布爾值 debug: "true" debug: "false" #Yaml示例 languages: #序列的映射 - Java - Golang - Python websites: #映射的映射 Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #或者 languages: ["Java","Golong","Python"] websites: Baidu: www.baidu.com Wangyi: www.163.com Souhu: www.souhu.com #Json格式 { languages: [ 'Java', 'Golong', 'Python', ], websites: [ Baidu: 'www.baidu.com', Wangyi: 'www.163.com', Souhu: 'www.souhu.com', ] }
三、Docker Compose配置常用字段
字段 | 描述 |
build | 指定Dockerfile文件名(要指定的Dockerfile文件需要在build標(biāo)簽的子級(jí)標(biāo)簽中用dockerfile標(biāo)簽指定) |
dockerfile | 構(gòu)建鏡像上下文路徑 |
context | 可以是dockerfile路徑,或者是執(zhí)行g(shù)it 倉(cāng)庫(kù)的url地址 |
image | 指定鏡像(已存在) |
command | 執(zhí)行命令,會(huì)覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令(會(huì)覆蓋Dockerfile的CMD指令) |
container_name | 指定容器名稱,由于容器名稱是唯一的,如果指定自定義名稱,則無(wú)法scale指定容器數(shù)量 |
deploy | 指定部署和運(yùn)行服務(wù)相關(guān)配置,只能在Swarm模式使用 |
environment | 添加環(huán)境變量 |
networks | 加入網(wǎng)絡(luò),引用頂級(jí)networks下條目 |
network-mode | 設(shè)置容器的網(wǎng)絡(luò)模式 |
ports | 暴露容器端口,與-p 相同,但是端口不能低于60 |
volumes | 掛載一個(gè)宿主機(jī)目錄或命令卷到容器,命名卷要在頂級(jí)volumes 定義卷名稱 |
volumes_from | 從另一個(gè)服務(wù)或容器掛載卷,可選參數(shù) :ro 和 :rw,(僅版本‘2’支持) |
hostname | hostname |
hostname | 在容器內(nèi)設(shè)置內(nèi)核參數(shù) |
links | 連接到另一個(gè)容器,- 服務(wù)名稱[ : ] |
privileged | 用來(lái)給容器root權(quán)限,注意是不安全的,true |
restart | 重啟策略,定義是否重啟容器;1.no,默認(rèn)策略,在容器退出時(shí)不重啟容器。2.on-failure,在容器非正常退出時(shí)(退出狀態(tài)非0),才會(huì)重啟容器。3.on-failure:3,在容器非正常退出時(shí)重啟容器,最多重啟3次。4.always,在容器退出時(shí)總是重啟容器。5.unless-stopped,在容器退出時(shí)總是重啟容器,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器。 |
depends_on | 此標(biāo)簽用于解決容器的依賴,啟動(dòng)先后問(wèn)題。如啟動(dòng)應(yīng)用容器,需要先啟動(dòng)數(shù)據(jù)庫(kù)容器php:depends_on:- apache- mysql |
四、Docker-compose常用命令
字段 | 描述 |
---|---|
build | 重新構(gòu)建服務(wù) |
ps | 列出容器 |
up | 創(chuàng)建和啟動(dòng)容器 |
exec | 在容器里面執(zhí)行命令 |
scale | 指定一個(gè)服務(wù)容器啟動(dòng)數(shù)量 |
top | 顯示正在運(yùn)行的容器進(jìn)程 |
logs | 查看服務(wù)容器的輸出 |
down | 刪除容器、網(wǎng)絡(luò)、數(shù)據(jù)卷和鏡像 |
stop/start/restart | 停止/啟動(dòng)/重啟服務(wù) |
五、compose部署
Docker-Compose 是 Docker 的獨(dú)立產(chǎn)品,因此需要安裝 Docker 之后在單獨(dú)安裝 Docker Compose。
//環(huán)境部署所有主機(jī)安裝docker環(huán)境(內(nèi)容為docker基礎(chǔ)) yum install docker-ce -y //下載compose(上傳docker_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 cp -p docker-compose /usr/local/bin/ chmod +x /usr/local/bin/docker-compose mkdir /root/compose_nginx yum install -y tree vim /root/compose_nginx/docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1216:80 - 1217:443 networks: - cluster volumes: - ./wwwroot:/usr/local/nginx/html networks: cluster:
[root@docker /]# mkdir /opt/compose_nginx [root@docker /]# vim /opt/compose_nginx/docker-compose.yml [root@docker /]# vim /opt/compose_nginx/docker-compose.yml [root@docker /]# cd /opt/compose_nginx/ [root@docker compose_nginx]# ls docker-compose.yml [root@docker compose_nginx]# mkdir nginx [root@docker compose_nginx]# mkdir wwwroot [root@docker compose_nginx]# ls docker-compose.yml nginx wwwroot [root@docker compose_nginx]# echo "i am superman" > wwwroot/index.html [root@docker compose_nginx]# cat wwwroot/index.html i am superman [root@docker compose_nginx]# cd nginx [root@docker nginx]# ls nginx-1.22.0.tar.gz [root@docker nginx]#
[root@docker nginx]# vim Dockerfile FROM centos:7 as build ADD nginx-1.22.0.tar.gz /mnt WORKDIR /mnt/nginx-1.22.0 RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \ yum clean all && \ sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \ ./configure --prefix=/usr/local/nginx &> /dev/null && \ make &>/dev/null && \ make install &>/dev/null && \ rm -rf /mnt/nginx-1.22.0 FROM centos:7 EXPOSE 80 VOLUME ["/usr/local/nginx/html"] COPY --from=build /usr/local/nginx /usr/local/nginx CMD ["/usr/local/nginx/sbin/nginx","daemon off;"]
[root@docker compose_nginx]# tree ./ ./ ├── docker-compose.yml ├── nginx │ ├── dockerfile │ └── nginx-1.22.0.tar.gz └── wwwroot └── index.html 2 directories, 4 files
docker-compose -f docker-compose.yml up -d docker network ls
六、總結(jié)
- Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml
- 使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。
- Compose允許用戶通過(guò)一個(gè)單獨(dú)的docker-compose.yml模板文件(YAML 格式)來(lái)定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目(project)。
docker-compose分三層:project,service,container
- project:代表多個(gè)service組成的項(xiàng)目,默認(rèn)是用工作目錄的名稱作為project的工程名稱
- service:一個(gè) service 可以包含一個(gè)或多個(gè)容器,在里面可以定義網(wǎng)絡(luò)模式端口鏡像數(shù)據(jù)卷等參數(shù)
- container:可以直接由一個(gè)已存在的鏡像運(yùn)行實(shí)現(xiàn),也可以通過(guò)dockerfile構(gòu)建鏡像實(shí)現(xiàn)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker查看是否開機(jī)自啟及容器自啟動(dòng)設(shè)置
Docker是當(dāng)前最流行的容器技術(shù),通過(guò)運(yùn)用容器打包應(yīng)用程序并部署到生產(chǎn)環(huán)境中,可大大提高部署的速度和可靠性,下面這篇文章主要給大家介紹了關(guān)于Docker查看是否開機(jī)自啟及容器自啟動(dòng)設(shè)置的相關(guān)資料,需要的朋友可以參考下2024-01-01三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問(wèn)題
這篇文章主要介紹了三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-11-11Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程
這篇文章主要介紹了Armbian5.9.0安裝docker及部署可視化portainer的詳細(xì)教程,通過(guò)?ssh?進(jìn)去?Armbian?系統(tǒng)后,輸入相應(yīng)代碼,按提示輸入y,等待安裝完成即可,需要的朋友可以參考下2022-05-05docker使用alpine構(gòu)建jdk21鏡像的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于docker使用alpine構(gòu)建jdk21鏡像的詳細(xì)步驟,鏡像中包含了應(yīng)用程序所需要的運(yùn)行環(huán)境,函數(shù)庫(kù),配置,以及應(yīng)用本身等各種文件,這些文件分層打包而成,需要的朋友可以參考下2024-03-03利用寶塔面板和docker快速部署網(wǎng)站的基本流程
當(dāng)你有了一臺(tái)服務(wù)器,就會(huì)折騰往這臺(tái)服務(wù)器上部署各種好玩的網(wǎng)站,本文將以部署filebrowser舉例介紹網(wǎng)站部署的基本流程,感興趣的朋友一起看看吧2023-12-12skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用
這篇文章主要為大家介紹了skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用的構(gòu)建部署過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03