1. 程式人生 > >Docker-Compose基礎與實戰,看這一篇就夠了

Docker-Compose基礎與實戰,看這一篇就夠了

what & why

Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排。使用前面介紹的Dockerfile我們很容易定義一個單獨的應用容器。然而在日常開發工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 專案,除了 Web 服務容器本身,往往還需要再加上後端的資料庫服務容器;再比如在分散式應用一般包含若干個服務,每個服務一般都會部署多個例項。如果每個服務都要手動啟停,那麼效率之低、維護量之大可想而知。這時候就需要一個工具能夠管理一組相關聯的的應用容器,這就是Docker Compose。
Compose有2個重要的概念

  • 專案(Project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 檔案中定義。
  • 服務(Service):一個應用的容器,實際上可以包括若干執行相同映象的容器例項。

docker compose 安裝與解除安裝

安裝

二進位制包線上安裝

curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 

sudo chmod +x /usr/local/bin/docker-compose

這個方法現在基本行不通,下載太慢了,不推薦使用。

二進位制包離線安裝

https://github.com/docker/compose/releases/download/1.25.0/docker-compose-Linux-x86_64下載對應的安裝包,比如我下載了Linux-x86_64的。

將下載好的安裝包剪下到/usr/local/bin/docker-compose目錄下
mv /app/download/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

新增執行許可權
sudo chmod +x /usr/local/bin/docker-compose

pip安裝

  • 先安裝好pip工具
#安裝依賴 
yum -y install epel-release 
#安裝PIP 
yum -y install python-pip 
#升級PIP 
pip install --upgrade pip
  • 驗證pip 版本
[root@tymonitor bin]# pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
  • 安裝docker compose
    pip install -U docker-compose==1.25.0

  • 驗證docker compose版本
[root@tymonitor bin]# docker-compose --version
docker-compose version 1.25.0, build b42d419

安裝補全外掛

curl -L https://raw.githubusercontent.com/docker/compose/1.25.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

解除安裝

二進位制解除安裝

rm /usr/local/bin/docker-compose

pip解除安裝

pip uninstall docker-compose

docker compose 重要命令

命令選項

  • -f, --file FILE 指定使用的 Compose 模板檔案,預設為 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定專案名稱,預設將使用所在目錄名稱作為專案名。
  • --x-networking 使用 Docker 的可拔插網路後端特性
  • --x-network-driver DRIVER 指定網路後端的驅動,預設為 bridge
  • --verbose 輸出更多除錯資訊。
  • -v, --version 列印版本並退出。

常用&重要命令

  • config
    驗證 Compose 檔案格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因。
    如:docker-compose -f skywalking.yml config
    此命令不會執行真正的操作,而是顯示 docker-compose 程式解析到的配置檔案內容:

  • images
    列出 Compose 檔案中包含的映象。如docker-compose -f skywalking.yml images

  • ps
    列出專案中目前的所有容器。如docker-compose -f skywalking.yml ps

  • build
    構建(重新構建)專案中的服務容器。如:docker-compose -f skywalking.yml build,一般搭配自定義映象,比如編寫的Dockfile,功能類似於docker build .

  • up
    該命令十分強大(重點掌握),它將嘗試自動完成包括構建映象,(重新)建立服務,啟動服務,並關聯服務相關容器的一系列操作。如docker-compose -f skywalking.yml up。預設情況,docker-compose up 啟動的容器都在前臺,控制檯將會同時列印所有容器的輸出資訊,可以很方便進行除錯。

    如果使用docker-compose up -d將會在後臺啟動並執行所有的容器。一般推薦生產環境下使用該選項。
    預設情況,如果服務容器已經存在,docker-compose up 將會嘗試停止容器,然後重新建立(保持使用 volumes-from 掛載的卷),以保證新啟動的服務匹配 docker-compose.yml 檔案的最新內容。如果使用者不希望容器被停止並重新建立,可以使用 docker-compose up --no-recreate。這樣將只會啟動處於停止狀態的容器,而忽略已經執行的服務。如果使用者只想重新部署某個服務,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 來重新建立服務並後臺停止舊服務,啟動新服務,並不會影響到其所依賴的服務。此命令有如下選項:
    ①:-d 在後臺執行服務容器。
    ②:--no-color 不使用顏色來區分不同的服務的控制檯輸出。
    ③:--no-deps 不啟動服務所連結的容器。
    ④:--force-recreate 強制重新建立容器,不能與 --no-recreate 同時使用。
    ⑤:--no-recreate 如果容器已經存在了,則不重新建立,不能與 --force-recreate 同時使用。
    ⑥:--no-build 不自動構建缺失的服務映象。
    ⑦:-t, --timeout TIMEOUT 停止容器時候的超時(預設為 10 秒)。

  • down
    此命令停止用up命令所啟動的容器並移除網路,如docker-compose -f skywalking.yml down

  • stop
    格式為 docker-compose stop [options] [SERVICE...]
    停止已經處於執行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器,如果不指定service則預設停止所有的容器。如docker-compose -f skywalking.yml stop elasticsearch
    選項:
    -t, --timeout TIMEOUT 停止容器時候的超時(預設為 10 秒)。

  • start
    啟動已經存在的服務容器。用法跟上面的stop剛好相反,如docker-compose -f skywalking.yml start elasticsearch

  • restart
    重啟專案中的服務。用法跟上面的stop,start一樣

  • logs
    格式為docker-compose logs [options] [SERVICE...]
    檢視服務容器的輸出。預設情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過 --no-color 來關閉顏色。該命令在除錯問題的時候十分有用。如docker-compose -f skywalking.yml logs 檢視整體的日誌,docker-compose -f skywalking.yml logs elasticsearch 檢視單獨容器的日誌

docker compose 模板檔案

模板檔案是使用 Compose 的核心,涉及到的指令關鍵字也比較多。本文主要列出幾個常見&重要的指令,其他指令大家可以自行百度。
預設的模板檔名稱為 docker-compose.yml,格式為 YAML 格式。

version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.8.5
    container_name: elasticsearch
    restart: always
    volumes:
      - /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
      - /app/skywalking/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /app/skywalking/elasticsearch/conf/jvm.options:/usr/share/elasticsearch/config/jvm.options
      - /app/skywalking/elasticsearch/logs:/usr/share/elasticsearch/logs:rw
    environment:
      - TZ=Asia/Shanghai
      - xpack.monitoring.enabled=false
      - xpack.watcher.enabled=false
    ports:
      - "9200:9200"
      - "9300:9300"

注意每個服務都必須通過 image 指令指定映象或 build 指令(需要 Dockerfile)等來自動構建生成映象。如果使用 build 指令,在 Dockerfile 中設定的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中重複設定。

常用&重要命令

  • images
    指定為映象名稱或映象 ID。如果映象在本地不存在,Compose 將會嘗試拉取這個映象。
image: apache/skywalking-oap-server:6.5.0
image: apache/skywalking-ui:6.5.0
  • ports
    暴露埠資訊。
    使用宿主埠:容器埠 (HOST:CONTAINER) 格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)都可以,埠字串都使用引號包括起來的字串格式。
ports: 
    - "3000" 
    - "8080:8080" 
    - "127.0.0.1:8001:8001"
  • volumes
    資料卷所掛載路徑設定。可以設定為宿主機路徑(HOST:CONTAINER)或者資料卷名稱(VOLUME:CONTAINER),並且可以設定訪問模式 (HOST:CONTAINER:ro)。
volumes:
      - /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
      - conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
version: "3"
services:
  my_src:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:
  • ulimits
    指定容器的 ulimits 限制值。
    例如,指定最大程序數為 65535,指定檔案控制代碼數為 20000(軟限制,應用可以隨時修改,不能超過硬限制) 和 40000(系統硬限制,只能 root 使用者提高)。
ulimits:
   nproc: 65535
   nofile:
     soft: 20000
     hard: 40000
  • depends_on
    解決容器的依賴、啟動先後的問題。以下例子中會先啟動 redis mysql 再啟動 web
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis     
  redis:
    image: redis    
  db:
    image: mysql
  • environment
    設定環境變數。你可以使用陣列或字典兩種格式。
environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      
environment:
      - SW_STORAGE= elasticsearch
      - SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
  • restart
    指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境中推薦配置為 always 或者 unless-stopped
    restart: always

docker-compose 實戰

首先我需要推薦兩件事:

  • 配置docker加速映象
    建立或修改/etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://hub-mirror.c.163.com",
        "https://mirror.ccs.tencentyun.com",
        "https://reg-mirror.qiniu.co"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 給你的ide工具裝上docker外掛

本次實戰我們以docker-compose部署skywalking為例。編寫skywalking.yml,內容如下。

version: '3.3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5
    container_name: elasticsearch
    restart: always
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      discovery.type: single-node
    ulimits:
      memlock:
        soft: -1
        hard: -1
  oap:
    image: skywalking/oap
    container_name: oap
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
  ui:
    image: skywalking/ui
    container_name: ui
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: oap:12800

部署完成後將其上傳至伺服器,執行docker-compose -f /app/skywalking.yml up -d即可。

個人公眾號:JAVA日知錄 , javadaily.cn

相關推薦

Docker-Compose基礎實戰

what & why Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排。使用前面介紹的Dockerfile我們很容易定義一個單獨的應用容器。然而在日常開發工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 專案,除了

Docker基礎實戰

docker 基礎 什麼是Docker Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 核心的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對程序進行封裝隔離,屬於 作業系統層面的虛擬化技術。由於隔離的程序獨立於宿主和其它的隔離的

【Java面試題系列】:Java基礎知識面試題(持續更新)

文中面試題從茫茫網海中精心篩選,如有錯誤,歡迎指正! 1.前言 ​ 參加過社招的同學都瞭解,進入一家公司面試開發崗位時,填寫完個人資訊後,一般都會讓先做一份筆試題,然後公司會根據筆試題的回答結果,確定要不要繼續此次面試,如果答的不好,有些公司可能會直接說“技術經理或者總監在忙,你先回去等通知吧”,有些公司

【Java面試題系列】:Java基礎知識面試題

路徑 拼接 i++ misc min 中新 dem 總結 內容 文中面試題從茫茫網海中精心篩選,如有錯誤,歡迎指正! 1.前言 參加過社招的同學都了解,進入一家公司面試開發崗位時,填寫完個人信息後,一般都會讓先做一份筆試題,然後公司會根據筆試題的回答結果,確定要不要繼續此

【FastDFS】FastDFS 分散式檔案系統的安裝使用!!

## 寫在前面 > 有不少小夥伴在實際工作中,對於如何儲存檔案(圖片、視訊、音訊等)沒有一個很好的解決思路。都明白不能將檔案儲存在單臺伺服器的磁碟上,也知道需要將檔案進行副本備份。如果自己手動寫檔案的副本機制,那就太麻煩了,這會涉及冗餘副本機制、伺服器的排程、副本檢測、伺服器節點檢測、檔案副本存放策略

真的關於深度學習計算機視覺 | 硬創公開課

今年夏天,雷鋒網將在深圳舉辦“全球人工智慧與機器人創新大會”(GAIR),在本次大會上,我們將釋出“人工智慧與機器人Top25創新企業榜“,慧眼科技是我們重點關注的公司之一。今天,我們邀請到慧眼科技研發總監李漢曦,為我們帶來深度學習與計算機視覺方面的內容分享。 嘉賓

Azure IOT 設備固件更新技巧

trigger 物聯網平臺 搭建 href ice 有效 面板 調用 創建 嫌長不看版 今天為大家準備的硬菜是:在 Azure IoT 中心創建 Node.js 控制臺應用,進行端到端模擬固件更新,為基於 Intel Edison 的設備安裝新版固件的流程。通過創建模擬設備

想做好PPT折線圖

12月 image 菊花 -c 強調 spa any border 線圖 配圖主題無關今天鄭少跟大家聊聊折線圖的使用方法,或者你有疑問,折線圖很簡單,插入修改數據不就好了嗎?如果你要是這樣想的,恭喜你,有可能你會做出下面這樣的效果。如果你要是稍微懂一點折線圖的使用方法,你就

Linux 問題故障定位

1. 背景 有時候會遇到一些疑難雜症,並且監控外掛並不能一眼立馬發現問題的根源。這時候就需要登入伺服器進一步深入分析問題的根源。那麼分析問題需要有一定的技術經驗積累,並且有些問題涉及到的領域非常廣,才能定位到問題。所以,分析問題和踩坑是非常鍛鍊一個人的成長和提升自我能力。如果我們有一套好的分析工具,那將是事

C語言從入門到精通

影響 內容 當前 位置 replace 雙精度 下標 寄存器變量 一個 No.1 計算機與程序設計語言的關系 計算機系統由硬件系統和軟件系統構成,硬件相當於人類的肉體,而軟件相當於人類的靈魂,如果脫離了靈魂,人類就是一具行屍走肉 No.2 C語言的特點 代碼簡潔,靈活性高

【MYSQL學習筆記02】MySQL的高階應用之Explain(完美詳細版

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wx1528159409 最近學習MySQL的高階應用Explain,寫一篇學習心得與總結,目錄腦圖如下: 一、Explain基本概念 1. Explain定義 · 我們知道M

抖音內容運營全解剖 !

抖音的火爆已經不用多說,作為短視訊的頭部APP,抖音已經從微信手中奪走不少使用者時間,成為新的“時間黑洞”。 比如:“中毒了,我每天晚上要刷2個小時”,“下一站,逃離微信,上抖音”… 一個企業運營抖音的目的是什麼? 答案顯而易見,無非就是做品牌營銷、擴大品牌影響力。 在短視訊領域積累

百萬併發下的Nginx優化

本文作者主要分享在 Nginx 效能方面的實踐經驗,希望能給大家帶來一些系統化思考,幫助大家更有效地去做 Nginx。 優化方法論 我重點分享如下兩個問題: 保持併發連線數,怎麼樣做到記憶體有效使用。 在高併發的同時保持高吞吐量的重要要點。 實現層面主要是三方面優化,主要聚焦

理解Sharding jdbc原理

相比於Spring基於AbstractRoutingDataSource實現的分庫分表功能,Sharding jdbc在單庫單表擴充套件到多庫多表時,相容性方面表現的更好一點。例如,spring實現的分庫分表sql寫法如下: select id, name, price,

產品設計教程:如何理解 px,dp,dpi, pt

先聊聊熟悉的幾個單位 圍繞著各種螢幕做設計和開發的人會碰到下面幾個單位:in, pt, px, dpi,dip/dp, sp 下面先簡單回顧下前四個單位: "in" inches的縮寫,英寸。就是螢幕的物理長度單位。一英寸等於2.54cm。比如Android手機

中後臺產品的表格設計(原型規範下載)

中後臺產品的表格設計,看這一篇就夠了(原型規範下載) 2018年4月16日luodonggan 中後臺產品的表格設計,看這一篇就夠了(原型規範下載) 經過了將近一年的後臺產品經歷,踩了很多坑,試了很多錯,也學習到了很多東西,目前也形成了自己的一套規範。本文將其中的部分收穫彙總成文,

Linux 常用指令 —— 摘自《Linux Probe》

touch:用於建立空白檔案或設定檔案的時間,ps:黑客可以用touch指令來修改檔案的最後修改時間,以隱藏自己的修改行為。 mkdir:用於建立空白的目錄,如mkdir path,可以結合引數-p來遞迴建立檔案目錄,如mkdir -p a/b/c/d/e cp:用於複製檔案或目錄,如cp 1.txt p

樹狀陣列(Binary Indexed Tree)

定義 根據維基百科的定義: A Fenwick tree or binary indexed tree is a data structure that can efficiently update elements and calculate pr

Cookie介紹及在Android中的使用總結超詳細

Cookie介紹 cookie的起源 早期Web開發面臨的最大問題之一是如何管理狀態。簡言之,伺服器端沒有辦法知道兩個請求是否來自於同一個瀏覽器。那時的辦法是在請求的頁面中插入一個token,並且在下一次請求中將這個token返回(至伺服器)。這就需要在form中插入一個包含toke

關於Kaggle入門

這次醞釀了很久想給大家講一些關於Kaggle那點兒事,幫助對資料科學(Data Science)有興趣的同學們更好的瞭解這個專案,最好能親身參與進來,體會一下學校所學的東西和想要解決一個實際的問題所需要的能力的差距。雖然不是Data Science出身,但本著嚴謹的科研態