溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Compose的概念和用法

發(fā)布時(shí)間:2021-07-01 12:01:02 來源:億速云 閱讀:299 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Compose的概念和用法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Compose的概念和用法”吧!

  • Compose項(xiàng)目是docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)docker容器集群的快速編排。其代碼目前在http://github.com/docker/compose上開源。

    • Compose定位是定義和運(yùn)行多個(gè)docker容器的應(yīng)用,其前身是開源項(xiàng)目Fig。

  • 通過前面章節(jié)的介紹,我們知道使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。然而,在日常工作中,經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)web項(xiàng)目,除了web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等。

  • Compose恰好滿足了這樣的需求。它允許用戶通過一個(gè)單獨(dú)的docker-compose.yml模板文件來定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目;

  • Compose中有兩個(gè)重要的概念:

    • 服務(wù)(service):一個(gè)應(yīng)用的容器,實(shí)際上可以包括若干運(yùn)行相同鏡像的容器實(shí)例;

    • 項(xiàng)目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完成業(yè)務(wù)單元。

  • Compose的默認(rèn)管理對(duì)象是項(xiàng)目,通過子命令對(duì)項(xiàng)目中的一組容器進(jìn)行便捷的聲明周期管理;

  • Compose項(xiàng)目由Python編寫,實(shí)際上調(diào)用了docker服務(wù)提供的API來對(duì)容器進(jìn)行管理。

  • 使用Compose構(gòu)建dubbo-admin服務(wù)

    • 從github上獲取dubbo-admin的master分支源碼

      git clone -b master https://github.com/apache/incubator-dubbo-ops.git


    • 修改admin中的application配置,把zookeeper地址修改為zookeeper://zookeeper:2181

    • 使用maven進(jìn)行編譯打包:

      mvn clean package -Dmaven.test.skip=true


    • 在dubbo-admin目錄下編寫Dockerfile文件,內(nèi)容為

      # FROM,表示使用jdk8環(huán)境為基礎(chǔ)鏡像,如果鏡像不是本地的會(huì)從DockerHub進(jìn)行下載
      FROM openjdk:8-jdk-alphine
      # 作者
      MAINTAINER study.163.com<allen@163.com>
      VOLUME /tmp
      # ADD,拷貝文件并且重命名
      ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
      # ENTRYPOINT,為了縮短Tomcat的啟動(dòng)時(shí)間,添加java.security.egd的系統(tǒng)屬性指向/dev/urandom作為ENTRYPOINT
      ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/.urandom", "-jar", "/app,.jar"]


    • 使用docker build -t dubbo-admin:1.0 .命令進(jìn)行構(gòu)建。

    • 在項(xiàng)目根目錄下編寫docker-compose.yml文件,這個(gè)是Compose使用的主模板文件

      version: '3.4'
      services:
        zk_server:
          image: zookeeper:3.4
          ports:
            - 2181:2181
        dubbo-admin:
          image: dubbo-admin-1.0
          links:
            - zk_server:zookeeper
          ports:
            - 7001:7001


  • Compose命令說明

    • 執(zhí)行dcoker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看某個(gè)具體命令的使用格式。

      # docker-compose命令的基本的使用格式是:
      docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]


    • 命令選項(xiàng)

    • -f, --file <FILE>指定模板文件,默認(rèn)為docker-compose.yml,可以多次指定;

    • -p, --project-name <NAME>指定項(xiàng)目名稱,默認(rèn)將使用所在目錄名稱為項(xiàng)目名;

    • --x-networking使用docker的可插拔網(wǎng)絡(luò)后端特性;

    • --x-network-driver <DRIVER>指定網(wǎng)絡(luò)后端的驅(qū)動(dòng),默認(rèn)為bridge

    • --verbose輸出更多調(diào)試信息;

    • -v, --version打印版本并退出;

    • 命令對(duì)象與格式

  • Compose命令對(duì)象

命令說明
build格式為docker-compose build [options] [SERVICE...]。構(gòu)建(重新構(gòu)建)項(xiàng)目中的服務(wù)容器。可以隨時(shí)在項(xiàng)目目錄下運(yùn)行docker-compose build來重新構(gòu)建服務(wù)。選項(xiàng)包括:<br />1. --force-rm刪除構(gòu)建過程中的臨時(shí)容器;<br />2. --no-cache構(gòu)建鏡像過程中不使用cache(這將加長(zhǎng)構(gòu)建過程);<br />3. --pull始終嘗試通過pull來獲取更新版本的鏡像;
version執(zhí)行格式為docker-comose version,打印版本信息。
config驗(yàn)證Compse格式是否正確,若正確則顯示配置,若格式錯(cuò)誤顯示錯(cuò)誤原因
exec進(jìn)入指定的容器
images列出Compose文件包含的鏡像
logs格式為docker-compose logs [options] [SERVICE...]。查看服務(wù)容器的輸出,默認(rèn)情況下,docker-compose將對(duì)不同的服務(wù)輸出使用不同的顏色來區(qū)分??梢酝ㄟ^--no-color來關(guān)閉顏色
down停止up命令所啟動(dòng)的容器,并移除網(wǎng)絡(luò)。
help獲得一個(gè)命令的幫助
kill通過發(fā)送SIGKILL信號(hào)來強(qiáng)制停止服務(wù)容器
pause格式為docker-compose pause [SERVICE...],暫停一個(gè)服務(wù)容器。
port格式為docker-compose port [options] SERVICE PRIVATE_PORT,打印某個(gè)容器端口所映射的公共端口。選項(xiàng):<br />1. --protocol=proto指定端口協(xié)議,tcp(默認(rèn)值)或者upd;<br />2. --index=index如果同一服務(wù)存在多個(gè)容器,指定命令對(duì)象容器的序號(hào)(默認(rèn)為1)。
ps格式為docker-compse ps [options] [SERVICE...],列出項(xiàng)目中目前的所有容器。選項(xiàng):<br />1. -q只打印容器的ID信息;
push推送服務(wù)依賴的鏡像到docker鏡像倉庫;
pull格式為docker-compse pull [options] [SERVICE...]。拉取服務(wù)依賴的鏡像,選項(xiàng):<br />1. --ignore-pull-failures忽略拉取鏡像過程中的錯(cuò)誤。
restart格式為docker-compose restart [options] [SERVICE...],重啟項(xiàng)目中的服務(wù)。選項(xiàng):<br />1. -t, --timeout TIMEOUT指定重啟前停止容器的超時(shí)時(shí)間(默認(rèn)為10秒)。
rm格式為docker-compose rm [options] [SERVICE...],刪除所有(停止?fàn)顟B(tài)的)服務(wù)容器。推薦先執(zhí)行docker-compose stop命令來停止容器。選項(xiàng):<br />1. -f, --force強(qiáng)制直接刪除,包括非停止?fàn)顟B(tài)的容器。一般盡量不要使用該選項(xiàng);<br />2. -v刪除容器所掛載的數(shù)據(jù)卷。
run格式為docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...],在指定服務(wù)上執(zhí)行一個(gè)命令。例如docker-compose run ubuntu ping docker.com
scale格式為docker-compose scale [options] [SERVICE=NUM...],設(shè)置指定服務(wù)運(yùn)行的容器個(gè)數(shù)。例如docker-compose scale web=3 db=2,將啟動(dòng)3個(gè)容器運(yùn)行web服務(wù),2個(gè)容器運(yùn)行db服務(wù)。
start格式為docker-compose start [SERVICE...],啟動(dòng)已經(jīng)存在的服務(wù)容器
stop停止已經(jīng)存在的服務(wù)容器
top查看各個(gè)服務(wù)容器內(nèi)運(yùn)行的進(jìn)程
unpause格式為docker-compose unpause [SERVICE...],恢復(fù)處于暫停狀態(tài)到的服務(wù)。
up該命令十分強(qiáng)大,它將嘗試自動(dòng)完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動(dòng)服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。鏈接的服務(wù)都將會(huì)自動(dòng)啟動(dòng),除非已經(jīng)處于運(yùn)行狀態(tài)。選項(xiàng):<br />1. -d在后臺(tái)運(yùn)行服務(wù)容器;<br />2. --no-color不使用顏色來區(qū)分不同的服務(wù)的控制臺(tái)輸出;<br />3. --no-deps不啟動(dòng)服務(wù)所鏈接的容器;<br />4. --force-recreate強(qiáng)制重新創(chuàng)建容器,不能與--no-recreate同時(shí)使用;<br />5. --no-recreate如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate同時(shí)使用;<br />6. --no-build不自動(dòng)構(gòu)建缺失的服務(wù)鏡像;<br />7. -t, --timeout TIMEOUT停止容器時(shí)的超時(shí)時(shí)間。
  • Compose模板文件

    • 模板文件是使用Compose的核心,設(shè)計(jì)到的指令關(guān)鍵字也比較多,但大家不要擔(dān)心,這里面大部分指令跟docker run相關(guān)參數(shù)的含義都是類似的。默認(rèn)的模板文件名稱為docker-compose.yml,格式為YAML格式;

    • 注意每個(gè)服務(wù)都必須通過image指令指定鏡像或build指令(需要Dockerfile)等來自動(dòng)構(gòu)建生成鏡像;

    • 如果使用build指令,在Dockerfile中設(shè)置的選項(xiàng)(例如:CMD,EXPOSE,VOLUME,ENV等)將會(huì)自動(dòng)被獲取,無需在docker-compose.yml中再次設(shè)置。

  • build指令

    • 指定Dockerfile所在文件夾的路徑(可以是絕對(duì)路徑,或者相對(duì)docker-compose.yml文件的路徑)。Compose將會(huì)利用它自動(dòng)構(gòu)建這個(gè)鏡像,然后使用這個(gè)鏡像;

    • 使用context指令指定Dockerfile所在文件夾的路徑;

    • 使用dockerfile指令指定Dockerfile文件名;

    • 使用arg指令指定構(gòu)建鏡像時(shí)的變量;

      version: '3'
      services:
      	webapp:
      		build:
      			context: ./dir
      			dockerfile: Dockerfile-alternate
      			args:
      				buildno: 1


  • command指令

    • 覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令

      command: echo "hello world"


  • container_name指令

    • 指定容器名稱。默認(rèn)將會(huì)使用“項(xiàng)目名稱_服務(wù)名稱_序號(hào)”這樣的格式

      container_name: docker-web-container


  • configs指令

    • 僅用于Swarm mode,詳細(xì)內(nèi)容后面swarm mode會(huì)講到

  • deploy指令

    • 僅用于Swarm mode,詳細(xì)內(nèi)容后面swarm mode會(huì)講到

  • devices指令

    • 指定設(shè)備映射關(guān)系

      devices:
        - "/dev/ttyUSB1:/dev/ttyUSB0"


  • depends_on指令

    • 解決容器的依賴、啟動(dòng)先后的問題

  • dns指令

    • 自定義DNS服務(wù)器,可以是一個(gè)值,也可以是一個(gè)列表

      dns: 8.8.8.8
      dns:
        - 8.8.8.8
        - 114.114.114.114


  • environment指令

    • 設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式。之給定名稱的變量會(huì)自動(dòng)獲取運(yùn)行Compose主機(jī)上對(duì)應(yīng)變量的值,可以用來防止泄露不必要的數(shù)據(jù)。

      environment:
        RACK_ENV: development
        SESSION_SECRET:
      environment:
        - RACK_ENV=development
        - SESSION_SECRET


  • expose指令

    • 暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問。進(jìn)可以指定內(nèi)部端口為參數(shù)。

      expose:
        - "3000"
        - "8000"


  • extra_hosts指令

    • 類似Docker中的--add-host參數(shù),指定額外的host名稱映射信息。會(huì)在啟動(dòng)后的服務(wù)容器中/etc/hosts文件中添加一條條目8.8.8.8 googledns

      extra_hosts:
        - "googledns:8.8.8.8"


  • healthcheck指令

    • 通過命令檢查容器是否健康運(yùn)行

      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost"]
        interval: 1m30s
        timeout: 10s
        retries: 3


  • image指令

    • 指定為鏡像名稱或鏡像ID,如果鏡像在本地不存在,Compose會(huì)嘗試?yán)∵@個(gè)鏡像

      image: session-web:latest


  • labels指令

    • 為容器添加Docker元數(shù)據(jù)(metadata)信息,例如可以為容器添加輔助說明信息。

  • links指令

    • 連接到其他容器。注意:不推薦使用該指令。應(yīng)該使用docker network建立網(wǎng)絡(luò),而docker run --network來連接特定網(wǎng)絡(luò),或者使用versionn: '2'和更高版本的docker-compose.yml直接定義自定義網(wǎng)絡(luò)并使用。

  • network_mode指令

    • 設(shè)置網(wǎng)絡(luò)模式。使用和docker run--network參數(shù)一樣的值。

      network_mode: "bridge"
      network_mode: "host"
      network_mode: "none"


  • networks指令

    • 配置容器連接的網(wǎng)絡(luò)

      version: "3"
      services:
        some-service:
          networks:
            - some-network
      networks:
        some-network:


  • ports指令

    • 暴露端口信息。使用宿主端口:容器端口(HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主將會(huì)隨機(jī)選擇端口)都可以。

  • volumes指令

    • 數(shù)據(jù)卷所掛載路徑設(shè)置,可以設(shè)置宿主機(jī)路徑,同時(shí)支持相對(duì)路徑

      volumes:
        - /var/lib/mysql
        - cache/:/tmp/cache
        - ~/configs:/etc/configs/:ro


  • ulimits指令

    • 指定容器的ulimits限制值。例如,指定最大進(jìn)程數(shù)為65535,指定文件句柄數(shù)為20000(軟限制,應(yīng)用可以隨時(shí)修改,不能超過硬限制)和40000(系統(tǒng)硬限制,只能root用戶提高)。

      ulimits:
        nproc: 65535
        nofile:
          soft: 20000
          hard: 40000


  • 其他指令

    • 指定服務(wù)容器啟動(dòng)后執(zhí)行的入口文件

      entrypoint: /code/entrypoint.sh


    • 指定容器中運(yùn)行應(yīng)用的用戶名

      user: nginx


    • 指定容器中工作目錄

      working_dir: /code


    • 指定容器中搜索域名、主機(jī)名、mac地址等

      domainname: your_website.com
      hostname: test
      mac_address: 08-00-27-00-0C-0A


    • 允許容器中運(yùn)行一些特權(quán)命令

      privileged: true


    • 指定容器退出后的重啟策略為始終重啟。在生產(chǎn)環(huán)境中推薦配置為always或者unless-stopped

      restart: always


    • 以只讀模式掛載容器的root文件系統(tǒng),意味著不能對(duì)容器內(nèi)容進(jìn)行修改

      read_only: true


    • 打開標(biāo)準(zhǔn)輸入,可以接受外部輸入

      stdin_open: true


    • 模擬一個(gè)偽終端

      tty: true


    • 此外,還有包括domainname,entrypoint,hostnameipc,mac_address,privileged,read_onlyshm_size,restart,stdin_opentty,userworking_dir等指令,基本跟docker run中對(duì)應(yīng)參數(shù)的功能一致。

  • 讀取變量

    • Compose模板文件支持動(dòng)態(tài)讀取主機(jī)的系統(tǒng)環(huán)境變量和當(dāng)前目錄下的.env文件中的變量。例如,下面的Compose文件將從運(yùn)行它的環(huán)境中讀取變量${MONGO_VERSION}的值,并寫入執(zhí)行的指令中。

      version: "3"
      services:
        db:
          image: "mongo:${MONGO_VERSION}"


    • 如果執(zhí)行的MONGO_VERSION=3.2docker-compose up則會(huì)啟動(dòng)一個(gè)mongo:3.2鏡像的容器。若當(dāng)前目錄下存在.env文件,執(zhí)行docker-compose命令時(shí)將從該文件中讀取變量。

到此,相信大家對(duì)“Compose的概念和用法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI