1.前言
本系列文章記錄了從0開始學習Docker的過程,Docker系列歷史文章:
(一)基本概念與安裝使用
(二)如何使用Docker發(fā)布一個SpringBoot服務
(三)使用registry遠程鏡像倉庫管理鏡像
(四)使用volume持久化Docker容器中的Redis數據
(五)使用bind mounts修改Docker容器中的Nginx配置
(六)使用network完成容器間的網絡通信
在前面的幾篇文章中,介紹了如何通過 Docker指令 來部署一個SpringBoot,以及如何使用已經構建好的中間件鏡像來安裝中間件,隨著服務器節(jié)點中的容器數量增多,繼續(xù)使用 指令的方式來管理容器,那管理的復雜度將會越來越高,例如:
- 需要一個一個的創(chuàng)建不同的自定義
volume
、network
,指令繁瑣。 - 需要手動創(chuàng)建服務,并挨個處理其容器卷與網絡之間的對應關系。
- 隨著容器數量的上升,不容易處理不同容器分組的隔離關系。
- ……
為了解決服務器中的容器管理問題,Docker的一個針對單機環(huán)境的服務編排工具,也就是Docker Compose
。使用Docker Compose,可以通過yaml
文件來管理容器,使用yaml
中的標簽來描述容器的各類信息,容器與Docker中個各類組件的關聯(lián)關系,最終只需要使用docker comse up
這一個指令,就可以將yaml
中已配置好的容器啟動起來。
同時,可以將已經編寫好的docker-compose.yml
文件分享給他人使用,例如,我可以編寫一個搭建開發(fā)環(huán)境的docker-compose.yml
文件,給同部門的其他同學使用,讓他們也能夠一鍵搭建工作所需的開發(fā)環(huán)境。
此外,在GitHub中,也有非常多的項目會提供docker-compse.yml
文件,開發(fā)者可以通過這個文件來一鍵創(chuàng)建項目環(huán)境,例如在GitHub上搜索 elk
,可以看到這樣的結果:
2.安裝與使用
2.1 安裝與卸載
根據官網的描述,如果是在 Windows/Mac 環(huán)境中,通過 Docker Desktop 安裝的Docker,就已經自帶了 Docker Compose,如果是在Linux環(huán)境中,則需要自行安裝Docker Compose插件。
我這里使用的是CentOS,通過yum安裝非常簡單,如果安裝的版本不對,可以通過下面的指令卸載。
sudo yum update
sudo yum install docker-compose-plugin
# 卸載
sudo yum remove docker-compose-plugin
使用docker compose version
查看版本,打印出版本號表示安裝成功,如果是其他的環(huán)境,可以參考《Docker Compose 安裝官方文檔》
2.2 核心概念
Docker Compose 使用 docker-compose.yml
來描述需要編排的服務信息,這樣的一個文件啟動后對應的是一個完整的業(yè)務單元,稱為project
。在project中,包含了network
,volume
,以及多個容器的信息,我們把容器信息稱為service
。此外,在docker-compose.yml
文件中還對應了語法解析版本:version
。
這里的version
版本與 Docker的對應關系如下:
使用docker -v
查看當前 Docker 的版本:
當前的 Docker 版本對應的 Compose 文件解析版本均可以使用。
2.3 基本語法及使用
現(xiàn)在通過創(chuàng)建MySQL容器來簡單的演示一下如何使用compose文件,在上面的核心概念中,我們已經知道了,compose文件一共可以分成4個部分,分別為:
version:
services:
volumes:
networks:
按照下面的步驟,將這幾個標簽依次填充起來。
第一步:指定文件版本號
可以按照上面的版本對應表找到可以使用的version
版本號,此處我們選擇3.8(注意此處為字符串),即:
version: '3.8'
第二步:創(chuàng)建volumes
需要將 MySQL 的數據文件掛載到宿主機中,需要創(chuàng)建 volumes ,此處我們創(chuàng)建一個mysql-data-volume
作為 volume 的 name ,如果使用指令創(chuàng)建可以輸入:
docker volume create mysql-data-volume
對應的,在compose文件中可以寫成:
volumes:
mysql-data-volume:
# 當然,如果還要創(chuàng)建其他的volume,可以直接追加在下面
other-volume:
第三步:創(chuàng)建network
如果不創(chuàng)建 network 則會使用默認的 docker 網絡,但是我們一般會將有關聯(lián)關系的一組應用放在一個自定義的網絡中,所以此處我們創(chuàng)建一個 my-app-brigde
網絡,創(chuàng)建方式與創(chuàng)建 volume 類似。
- 使用指令的方式:
docker network create my-app-bridge
- compose文件
networks:
my-app-bridge:
driver: bridge
第四步:創(chuàng)建MySQL容器
使用已經創(chuàng)建好的 network 與 volume 來創(chuàng)建MySQL容器:
- 使用指令:
docker run -dp 3309:3306 \
--name=mysql \
--volume=mysql-data-volume:/var/lib/mysql \
--network=my-app-bridge \
-e MYSQL_ROOT_PASSWORD=huizhiyimo \
mysql
- compose文件:
services:
mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- mysql-data-volume
networks:
- my-app-bridge
environment:
MYSQL_ROOT_PASSWORD: huizhiyimo
綜上,可以獲取到一個完整的 docker-compose.yml 文件。
version: '3.8'
services:
mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- mysql-data-volume
networks:
- my-app-bridge
environment:
MYSQL_ROOT_PASSWORD: huizhiyimo
volumes:
mysql-data-volume:
networks:
my-app-bridge:
driver: bridge
將文件移動到服務器中,通過docker compose up -d
啟動。
啟動后,依次創(chuàng)建 Network , Volume , 并啟動MySQL容器,注意上面的命名與實際啟動后的名稱差異,實際啟動后的名稱前面多了mysql_
的前綴,這是因為使用 docker compose 啟動,或默認拼接上當前目錄名稱的前綴。
注:同一目錄下有多個compose.yml文件的時候,可以通過-f
指定需要執(zhí)行哪個文件,例如:docker compose -f docker-compose.yml up -d
2.4 一鍵部署環(huán)境
按照上面所說的語法,我們可以在 compose 文件中編寫開發(fā)環(huán)境中所需要使用到的工具,例如:redis,nginx,mysql,rabbitMQ,Zookeeper等,可以按照需要添加自己所需的工具,compose 文件如下:
version: '3.8'
services:
my-redis:
image: "redis:alpine"
ports:
- "6379:6379"
volumes:
- my-redis-volume:/data
restart: always
networks:
- dev-network
my-nginx:
image: "nginx"
ports:
- "80:80"
volumes:
- /usr/docker/nginx-conf:/etc/nginx/conf.d
restart: always
networks:
- dev-network
my-mysql:
image: mysql
ports:
- "3309:3306"
volumes:
- my-mysql-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: huiyizhimo
restart: always
networks:
- dev-network
my-rabbitMQ:
image: "rabbitmq:management"
ports:
- "5671:5671"
- "5672:5672"
- "15671:15671"
- "15672:15672"
- "25672:25672"
- "4369:4369"
hostname: "rabbit-server"
volumes:
- my-rabbit-volume:/var/lib/rabbitmq
restart: always
networks:
- dev-network
my-zookeeper:
image: "zookeeper"
ports:
- "2181:2181"
restart: always
networks:
- dev-network
volumes:
my-redis-volume: {}
my-mysql-volume: {}
my-rabbit-volume: {}
networks:
dev-network:
driver: bridge
可以將這個文件在任何一個裝有 Docker Compose 的機器中運行。
運行成功后,工具就可以直接使用了,使用zkTool鏈接成功。
2.5 部署GitHub中的開源項目
除了部署我們自己的環(huán)境之外,我們也可以在GitHub可以找到通過docker-compose.yml
編排的開源項目docker-elk
,嘗試是否可以將它部署到服務器中。
首先,通過git
下載到服務器中的/usr/docker
目錄中(這個目錄是我自行創(chuàng)建的)
git clone https://github.com/deviantony/docker-elk
然后,進入到 docker-elk 目錄中,通過 compose 文件部署服務。
cd docker-elk
docker compose up -d
# 查看compose列表
docker compose ls
這里可以注意一下上圖中的執(zhí)行順序,啟動成功后,通過 http://192.168.200.101:5601/login
訪問,(192.168.200.101
是我本地安裝的虛擬機ip地址,這里可以改成自己的服務器ip。),如下圖,成功打開登錄界面。
此外,我們也可以去查看 docker-elk 中的 docker-compose.yml 文件的編寫內容,模仿其用法來編寫自己的開源項目。
2.6 環(huán)境變量的使用
在 docker-elk 的 yml文件中,我們可以看到 ${xxx}
這樣的語法,這個就是環(huán)境變量的使用,我們將變量的值寫在.env
文件中,在啟動的時候,就可以將實際的變量值映射到 compose 文件中。
3.結語
使用 Docker Compose ,可以通過 docker-compose.yml 文件來替代 docker command
指令來編排容器,yml文件可以一目了然的看到容器之間的關系,避免了使用一大堆繁瑣的指令。
同時,可以將已編寫好的 compose 文件,共享給他人使用,起到了 一次編寫,到處運行 的效果,減少了大量的重復工作。
由于微服務時代的到來,我們生產環(huán)境中的應用服務往往是多機多節(jié)點部署, Docker Compose 這種單機容器編排的方式使用的就越來越少了,轉而使用 K8S 來進行服務的管理。文章來源:http://www.zghlxwxcb.cn/news/detail-480070.html
如果覺得本文對你有所幫助,可以幫忙點點贊哦!你的支持是我更新最大的動力!文章來源地址http://www.zghlxwxcb.cn/news/detail-480070.html
到了這里,關于【Docker】(七)使用docker-compose一鍵部署環(huán)境的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!