Docker小白到实战之Docker Compose在手,一键足矣
前言
Docker可以將應用程序及環境很方便的以容器的形式啟動,但當應用程序依賴的服務比較多,或是遇到一個大系統拆分的服務很多時,如果還一個一個的根據鏡像啟動容器,那就有點累人了,到這有很多小伙伴會說:弄個腳本就搞定啦;要的就是這個思路,Docker提供了一個叫Docker Compose的工具,一鍵啟動相關服務。
舉個例:比如開發一個Web項目,需要有數據庫、Redis、MongoDB、配置中心等等,如果將其進行容器化,可以有兩種選擇,第一種就是把所有的服務依賴和應用程序全部構建為一個鏡像,然后以一個容器運行,即這個容器里面包含了Web應用程序、數據庫、Redis、MongoDB、配置中心等;另一種方式就各自服務單獨啟動為一個容器服務,比較獨立,一般可以一個一個的啟動容器,然后通過網絡連接起來就行;顯然第二種方式是小伙伴們更多的選擇,如果能配上一個批量操作那就完美了,而Docker Compose就是來干這個事的。
正文
1. 概述
Docker Compose 是一個用于定義和運行多個容器服務的 Docker 應用程序工具;搭配使用 YAML 文件來配置應用程序服務,然后運行Docker Compose命令,一鍵啟動所有容器服務。
2. 安裝
Docker默認安裝環境下是不包含Docker Compose工具的,需要單獨安裝。Docker Compose工具搭配Docker才有意義,所以安裝Docker Compose之前需要安裝Docker。以下演示平臺為Linux,其他平臺請參照文檔:https://docs.docker.com/compose/install/
2.1 下載文件
其實Docker Compose是一個可執行文件,直接下載對應文件即可,執行如下命令:
#?下載Docker?Compose文件,?這個地址下載比較慢 sudo?curl?-L?"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname?-s)-$(uname?-m)"?-o?/usr/local/bin/docker-compose #?這個地址快點 sudo?curl?-L?"https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname?-s)-$(uname?-m)"?-o?/usr/local/bin/docker-compose如下圖:
2.2 授予執行權限
下載下來的文件默認是沒有執行權限的,后續需要執行,所以得授予執行權限,執行如下命令即可:
sudo?chmod?+x?/usr/local/bin/docker-compose看看權限結果分配如下:
這樣docker-compose就安裝完啦。
2.3 卸載
如果需要卸載,直接刪除即可,執行如下命令即可:
sudo?rm?/usr/local/bin/docker-compose3. 使用
Docker Compose需要搭配YAML文件使用,YAML 是一種人類友好的數據序列化語言,適用于所有編程語言,后綴名為.yml。
所以在進行實操前,需要大概的了解一下YAML的語法,不要慌,語法和Json的思路很像,大概了解一下,后續用到查文檔就行啦。
3.1 簡單說說語法
YAML文件內容是通過空格的縮進來代表層次,常用的數據類型有如下:
對象:鍵值對集合;
#?yaml?對象語法 testKey:testValue #?Json?語法 {"testKey":"testValue"} #?yaml?嵌套對象 testKey:{testKey1:testValue1,testKey2:testValue2} #?Json?語法 {"testKey":{"testKey1":"testValue1","testKey2":"testValue2"}}數組:一組按次序排列的數據;用-前綴表示。
#?yaml?數組語法 -value1 -value2 -value3 #?Json?數組語法 ["value1","value2","value3"] #?yaml?數組行內語法 testKey:[value1,value2] #?Json?語法 {"testKey":['value1','value2']}純量:不可再分的值,包括字符串、整數、浮點數、日期、布爾值等。
#?yaml testKey:666 #?Json {testKey:666} #?yaml isbool:true #?Json {isbool:true}
常規的基本語法格式約定如下:
大小寫敏感
使用空格縮進表示層級關系
縮進不允許使用tab,只允許空格
縮進的空格數不重要,只要相同層級的元素左對齊即可
'#'表示注釋
大概了解上面這些,關于日常Docker Compose用到的文件基本上夠用了,如果有需要進階的,可以去查查對應的語法。傳送門:
https://yaml.org/spec/1.2.2/
https://www.runoob.com/w3cnote/yaml-intro.html
關于YAML文件內容中配置的命令和Dockerfile的命令差不多是一一對應的,稍后會簡單說說。
3.2 實操擼文件
這里還是以一個WebApi為例,例中需要依賴Redis服務。
創建項目,編寫例子
這里只是引入了一個Redis的緩存包,通過構造函數注入之后就可以直接用啦;編寫了一個API接口TestCache。
這里還需要在Startup文件中注入相關服務,并指定Redis的連接地址,如下:
運行起來測試一下效果,如下:
Redis中也有值了,這里需要注意:存入Redis中的類型是Hash。
編寫Dockerfile文件
在項目根目錄創建一個Dockerfile文件,內容如下:
關于Dockerfile中的內容這里就不細說了,之前有一篇文章專門分享的(點這里)。這里的Dockerfile目的就是將我們的WebApi項目構建為鏡像,和Redis沒有關系,不過這里不是通過執行命令構建,而是通過Compose文件一起構建。
注:這里記得將Dockerfile文件通過右鍵->屬性->設置為始終復制,保證編譯后的文件有最新文件
編寫Compose文件
在項目根目錄下創建docker-compose.yml文件,內容如下:
有了這個項目就可以一鍵啟動了,這里需要稍微改一下我們原來的代碼,如下:
注:這里記得將docker-compose.yml文件通過右鍵->屬性->設置為始終復制,保證編譯后的文件有最新文件。
3.3 體驗一鍵啟動
將項目先發布,并拷貝到對應的服務器上,如下:
這里用的是我的阿里云服務器,拷貝文件如下:
一鍵啟動
在docker-compose.yml所在的目錄下執行如下命令:
docker-compose?up下面是執行docker-compose up內部執行的步驟:
先是構建我們的程序,然后拉取依賴的Redis服務,并啟動,最后啟動我們的程序。(執行順序和依賴有關系);啟動之后就可以根據docker-compose.yml文件中映射的端口訪問了,如下:
看看啟動的容器名
image-20211007165313310通過docker ps -n 2 查看最近啟動的容器,容器的名字規則是:目錄名_Compose文件中定義的服務名_序號,那小伙伴肯定會好奇為什么程序能通過myredis名字連接到redis,可以通過docker inspect composetest_myredis_1查看容器詳情:
同樣可以查看到API服務對應的容器也是用的composetest_default這個網絡,這個網絡是一個橋接模式,可以通過docker network ls看到,如下:
docker compose常用命令
docker-compose build:構建或者重新構建服務
docker-compose up:構建、啟動容器,加上-d選項代表后臺運行。
docker-compose ps:列出所有通過Compose運行的容器
docker-compose logs:打印相關日志信息
docker-compose stop/start/restartd:可以指定服務停止、開始和重新啟動
docker-compose命令和docker的命令基本是一樣的。
docker-compose.yml文件內容常用屬性
version:指定 docker-compose.yml 文件的版本,一般都是用version 3;
services:定義多個容器集合,有多少寫多少;
build:構建鏡像,和docker build一樣功效;
environment:配置環境變量,和Dockerfile中ENV 關鍵字功能一樣;
#?設置環境變量 environment:RACK_ENV:?developmentSHOW:?'true'expose:暴露端口,和Dockerfile中的EXPOSE 關鍵字功能一樣;
expose:-?"80"-?"9999"ports:配置端口映射,和docker run -p一樣功效
ports:-?"8080:80"-?"6379:6379"volumes:指定卷掛載路徑,與Dockerifle中的VOLUME 關鍵字功能一樣
volumes:-?/var/lib/mysql-?/opt/data:/var/lib/mysqlcommand:覆蓋容器啟動后默認執行的命令,和Dockerfile文件中的CMD命令一樣;
command:?bundle?exec?thin?-p?3000image:指定要用的鏡像,構建的時候會拉取。
#?指定要使用redis鏡像 image:?redis
上面列出了一些比較常用的,具體的可以參考官網:https://docs.docker.com/compose/compose-file/compose-file-v3/
代碼地址如下:https://gitee.com/CodeZoe/microservies-demo/tree/main/DockerComposeDemo
總結
上文只是演示了Docker Compose的使用,詳細的Compose文件內容還需要在實際應用過程中根據實際需要查閱,后續在說集群的時候還會說到。
關注“Code綜藝圈”,和我一起學習吧;
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Docker小白到实战之Docker Compose在手,一键足矣的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dapr牵手.NET学习笔记:发布-订阅
- 下一篇: Magicodes.IE 2.5.6.1