我的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 build
或docker-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