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

Docker-Compose 基礎與實戰,看這一篇就夠了 | 原力計劃

作者 | 飄渺Jam

出品 | CSDN 博客

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

what & why

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

Compose有2個重要的概念:

  • 項目(Project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

  • 服務(Service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

docker compose 安裝與卸載

安裝

二進制包在線安裝

<code>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/<code>

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

二進制包離線安裝

從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工具

<code>#安裝依賴  

yum -y install epel-release
#安裝PIP
yum -y install python-pip
#升級PIP
pip install --upgrade pip/<code>
  • 驗證pip 版本

<code>[root@tymonitor bin]# pip --version
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)/<code>
  • 安裝docker compose

    pip install -U docker-compose==1.25.0

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
  • 驗證docker compose版本

<code>[root@tymonitor bin]# docker-compose --version
docker-compose version 1.25.0, build b42d419/<code>

安裝補全插件

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

卸載

二進制卸載

<code>rm /usr/local/bin/docker-compose
/<code>

pip卸載

<code>pip uninstall docker-compose/<code>
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 程序解析到的配置文件內容

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
  • images

    列出 Compose 文件中包含的鏡像。如docker-compose -f skywalking.yml images

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
  • ps

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

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

build

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

up

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

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

如果使用docker-compose up -d將會在後臺啟動並運行所有的容器。一般推薦生產環境下使用該選項。

默認情況,如果服務容器已經存在,docker-compose up 將會嘗試停止容器,然後重新創建(保持使用 volumes-from 掛載的卷),以保證新啟動的服務匹配 docker-compose.yml 文件的最新內容。如果用戶不希望容器被停止並重新創建,可以使用 docker-compose up --no-recreate。這樣將只會啟動處於停止狀態的容器,而忽略已經運行的服務。如果用戶只想重新部署某個服務,可以使用 docker-compose up --no-deps -d <service> 來重新創建服務並後臺停止舊服務,啟動新服務,並不會影響到其所依賴的服務。此命令有如下選項:/<service>

①:-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 基础与实战,看这一篇就够了 | 原力计划

docker compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。本文主要列出幾個常見&重要的指令,其他指令大家可以自行百度。

默認的模板文件名稱為 docker-compose.yml,格式為 YAML 格式。

<code>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"/<code>

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

常用&重要命令

  • images

    指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。

<code>image: apache/skywalking-oap-server:6.5.0

image: apache/skywalking-ui:6.5.0/<code>
  • ports

    暴露端口信息。

    使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以,端口字符串都使用引號包括起來的字符串格式。

<code>ports: 

- "3000"

- "8080:8080"

- "127.0.0.1:8001:8001"/<code>
  • volumes

    數據卷所掛載路徑設置。可以設置為宿主機路徑(HOST:CONTAINER)或者數據卷名稱(VOLUME:CONTAINER),並且可以設置訪問模式 (HOST:CONTAINER:ro)。

<code>volumes:
- /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
- conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
/<code>
<code>version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
/<code>
  • ulimits

    指定容器的 ulimits 限制值。

    例如,指定最大進程數為 65535,指定文件句柄數為 20000(軟限制,應用可以隨時修改,不能超過硬限制) 和 40000(系統硬限制,只能 root 用戶提高)。

<code>ulimits:

nproc: 65535

nofile:

soft: 20000

hard: 40000/<code>
  • depends_on

    解決容器的依賴、啟動先後的問題。以下例子中會先啟動 redis mysql 再啟動 web

<code>version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
/<code>
  • environment

    設置環境變量。你可以使用數組或字典兩種格式。

<code>environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200

environment:
- SW_STORAGE= elasticsearch
- SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
/<code>
  • restart

    指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終運行十分有效,在生產環境中推薦配置為 always 或者 unless-stopped。

<code>restart: always/<code>
Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

docker-compose 實戰

首先我需要推薦兩件事:

  • 配置docker加速鏡像

    創建或修改/etc/docker/daemon.json

<code>sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <{
"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/<code>
  • 給你的ide工具裝上docker插件

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

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

<code>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/<code>

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

Docker-Compose 基础与实战,看这一篇就够了 | 原力计划
Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

☞10 萬阿里人都愛用的網紅工具,語雀如何“用保護錢包的技術在保護文檔安全”?

☞ Java 穩步成長、Kotlin 崛起、Go 保持獨特風格,2020 年各大編程語言發展趨勢一覽

☞超讚的PyTorch資源大列表,GitHub標星9k+,中文版也上線了

☞“刪庫跑路”這件事情真的發生了 ,還是技術總監乾的!

☞別再用那些已經淘汰的技術了!2020 年 9 大頂級 Java 框架出爐!!

☞31歲年薪50萬:“復工第一天,謝謝裁掉我!” 有底氣的人生無需解釋!


分享到:


相關文章: