1. 程式人生 > >我的docker隨筆5:docker-compose的安裝與使用

我的docker隨筆5:docker-compose的安裝與使用

由前文知,執行容器的命令比較簡單,但是,當有複雜的應用時,比如設定環境變數、掛載目錄、對映埠,命令就變得比較長了。如果有多個docker映象同時配置使用的話,單獨執行docker run會顯示比較麻煩。因此,本文就介紹多容器編排的一個簡單工具:docker-compose。

安裝

安裝方法如下:

sudo apt-get install -y docker-compose

本文安裝的版本如下:

$ docker-compose --version
docker-compose version 1.21.2, build a133471

docker-compose.yml內容

docker-compose預設使用的配置檔案為docker-compose.yml,其內容示例如下,大多數英文名稱,是固定內容,中文說明是根據實際情況變化的內容。

version: '2' # 固定,表示其版本為2
services: # 固定,表示容器服務
    gitlab: # 容器名稱,根據實際修改
        image: latelee/gitlab # 映象名,如果不存在,則從網路下載
        container_name: gitlab  # 容器名,在執行名稱是唯一的
        restart: always # 開啟此選項,在機器重啟後,會自動啟動這些容器,否則,就要手動啟動容器
volumes: # 掛載資料卷,對應docker run命令的-v選項。 - /mnt/gitlab_data/config:/etc/gitlab ports: # 埠對映 - "80:80" networks: # 指定的網路,也可以不指定,必須與networks名稱一致 - mygitlab-jenkins-net jenkins:# 容器名稱,根據實際修改,格式與前述一樣 ... networks: # 固定,對網路配置,如無則不需要 mygitlab-jenkins-net: # 自定義的網路名稱
driver: bridge # 橋接方式

根據筆者經驗,yml檔案對格式檢查十分嚴格,必須要對齊,如上面的image、container_name等,必須對對齊,不能多一空格或少一空格。否則會提示莫名其妙的錯誤。

執行、停止

在docker-compose.yml同級目錄,執行如下命令執行:

docker-compose up -d

如果配置檔案不是docker-compose.yml,則需要使用-f來指定,如下:

docker-compose -f foobar.yml up -d 

以上命令,使用-d表示在後臺執行docker容器,執行後,終端只打啟動資訊,不會列印容器內的日誌。如果要顯示日誌,則要將-d去掉。

docker-compose up

停止命令:

docker-compose down

重啟命令:

docker-compose restart

注意,如果同時要執行多個容器,修改其中部分容器時,可以使用restart來重啟,這樣僅啟動有修改的容器,但是根據經驗,有時會有意想不到的情況出現,因此,最好還是先停止再啟動。
如果要檢視執行狀態,執行:

docker-compose ps

當然,也可以使用docker ps來檢視,本質上沒區別。

實際例子

下面以一個經典的CICD元件為例進行說明,docker-compose.yml內容如下:

# gitlab & jenkins
# Powered by Late Lee <li@latelee.org>
#
# yml版本為2
version: '2'
services:
    # 第一個容器gitlab
    gitlab:
        # 映象名,如果不存在,則從網路下載,本文假設使用本地的映象
        image: latelee/gitlab
        # 容器名,在執行名稱是唯一的
        container_name: gitlab
        restart: always
        # 掛載資料卷
        volumes:
            - /mnt/gitlab_data/config:/etc/gitlab
            - /mnt/gitlab_data/logs:/var/log/gitlab
            - /mnt/gitlab_data/data:/var/opt/gitlab
        # 埠對映
        ports:
            - "80:80"
            - "9443:443"
            - "2222:22"
        # 主機名 這個IP改為自己的主機IP
        hostname: "172.18.18.18"
        # 啟動時執行的命令
        #command: /assets/wrapper
        # 自定義的網路(見下[網路配置])
        networks:
            - mygitlab-jenkins-net
    # 第二個容器jenkins
    jenkins:
        image:  latelee/jenkins:maven
        container_name: jenkins
        restart: always
        volumes:
            # 使用主機的docker服務(因為要在jenkins容器中執行docker)
            - /var/run/docker.sock:/var/run/docker.sock
            # 使用資料盤的目錄作為jenkins的工作目錄
            - /mnt/jenkins_home:/var/jenkins_home
        ports:
            # 埠對映
            - "9080:8080"
            - "50000:50000"
        networks:
            - mygitlab-jenkins-net
# 網路配置
networks:
    mygitlab-jenkins-net: # 自定義的網路名稱
        driver: bridge  # 橋接方式

執行docker-compose up -d啟動gitlab和jenkins容器。成功後,可以在瀏覽器上輸入主機IP訪問gitlab的頁面。注意,gitlab和jenkins比較吃記憶體,最好在4GB以上記憶體的機器上執行,否則會很卡。

使用經驗

在docker-compose.yml中構建映象。

在docker-compose.yml檔案,在image前面加上build欄位,指定Dockerfile所在目錄,那麼在執行docker-compose up時,就會自動構建。示例檔案如下:

version: "2"
services:
  apache:
    build: httpd
    image: httpd:alpine
    container_name: httpd
    volumes:
    #   - /home:/home
       - ./apache2/htdocs:/usr/local/apache2/htdocs
    ports:
      - 80:80

執行後,最後提示資訊如下:

Successfully httpd:alpine
WARNING: Image for service singula-oh-accessserver was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.

從提示資訊知道,如果映象不存在則自動建立,否則需要呼叫docker-compose builddocker-compose up --build

小結

筆者在工作中幾乎都使用docker-compose啟動容器。這種方式加上自建docker映象(後文將講述),將大大提高效率。如部署禪道系統。使用筆者構建好的配置檔案,直接下載
https://github.com/latelee/docker-compose/tree/master/zentao,進入該目錄,執行docker-compose up -d,即可在9070埠訪問禪道頁面。其過程十分方便,因為所有的一切環境,已經在docker中完成了。筆者的docker-compose倉庫地址:https://github.com/latelee/docker-compose

李遲 2018.7.3