Docker小白到實戰之Docker Compose在手,一鍵足矣

Code綜藝圈發表於2021-10-11

前言

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-compose

3. 使用

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: development
      SHOW: '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/mysql
    

    command:覆蓋容器啟動後預設執行的命令,和Dockerfile檔案中的CMD命令一樣;

    command: bundle exec thin -p 3000
    

    image:指定要用的映象,構建的時候會拉取。

    # 指定要使用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綜藝圈”,和我一起學習吧;

相關文章