您好,登錄后才能下訂單哦!
本篇內容主要講解“Compose的概念和用法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Compose的概念和用法”吧!
Compose項目是docker官方的開源項目,負責實現對docker容器集群的快速編排。其代碼目前在http://github.com/docker/compose
上開源。
Compose定位是定義和運行多個docker容器的應用
,其前身是開源項目Fig
。
通過前面章節的介紹,我們知道使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個web項目,除了web服務容器本身,往往還需要再加上后端的數據庫服務容器,甚至還包括負載均衡容器等。
Compose恰好滿足了這樣的需求。它允許用戶通過一個單獨的docker-compose.yml模板文件來定義一組相關聯的應用容器為一個項目;
Compose中有兩個重要的概念:
服務(service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例;
項目(project):由一組關聯的應用容器組成的一個完成業務單元。
Compose的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷的聲明周期管理;
Compose項目由Python編寫,實際上調用了docker服務提供的API來對容器進行管理。
使用Compose構建dubbo-admin服務
從github上獲取dubbo-admin的master分支源碼
git clone -b master https://github.com/apache/incubator-dubbo-ops.git
修改admin中的application配置,把zookeeper地址修改為zookeeper://zookeeper:2181
;
使用maven進行編譯打包:
mvn clean package -Dmaven.test.skip=true
在dubbo-admin目錄下編寫Dockerfile文件,內容為
# FROM,表示使用jdk8環境為基礎鏡像,如果鏡像不是本地的會從DockerHub進行下載 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的啟動時間,添加java.security.egd的系統屬性指向/dev/urandom作為ENTRYPOINT ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/.urandom", "-jar", "/app,.jar"]
使用docker build -t dubbo-admin:1.0 .
命令進行構建。
在項目根目錄下編寫docker-compose.yml
文件,這個是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命令說明
執行dcoker-compose [COMMAND] --help
或者docker-compose help [COMMAND]
可以查看某個具體命令的使用格式。
# docker-compose命令的基本的使用格式是: docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項
-f, --file <FILE>
指定模板文件,默認為docker-compose.yml
,可以多次指定;
-p, --project-name <NAME>
指定項目名稱,默認將使用所在目錄名稱為項目名;
--x-networking
使用docker的可插拔網絡后端特性;
--x-network-driver <DRIVER>
指定網絡后端的驅動,默認為bridge
;
--verbose
輸出更多調試信息;
-v, --version
打印版本并退出;
命令對象與格式
Compose命令對象
命令 | 說明 |
---|---|
build | 格式為docker-compose build [options] [SERVICE...] 。構建(重新構建)項目中的服務容器。可以隨時在項目目錄下運行docker-compose build 來重新構建服務。選項包括:<br />1. --force-rm 刪除構建過程中的臨時容器;<br />2. --no-cache 構建鏡像過程中不使用cache(這將加長構建過程);<br />3. --pull 始終嘗試通過pull來獲取更新版本的鏡像; |
version | 執行格式為docker-comose version ,打印版本信息。 |
config | 驗證Compse格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因 |
exec | 進入指定的容器 |
images | 列出Compose文件包含的鏡像 |
logs | 格式為docker-compose logs [options] [SERVICE...] 。查看服務容器的輸出,默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過--no-color 來關閉顏色 |
down | 停止up命令所啟動的容器,并移除網絡。 |
help | 獲得一個命令的幫助 |
kill | 通過發送SIGKILL信號來強制停止服務容器 |
pause | 格式為docker-compose pause [SERVICE...] ,暫停一個服務容器。 |
port | 格式為docker-compose port [options] SERVICE PRIVATE_PORT ,打印某個容器端口所映射的公共端口。選項:<br />1. --protocol=proto 指定端口協議,tcp(默認值)或者upd;<br />2. --index=index 如果同一服務存在多個容器,指定命令對象容器的序號(默認為1)。 |
ps | 格式為docker-compse ps [options] [SERVICE...] ,列出項目中目前的所有容器。選項:<br />1. -q 只打印容器的ID信息; |
push | 推送服務依賴的鏡像到docker鏡像倉庫; |
pull | 格式為docker-compse pull [options] [SERVICE...] 。拉取服務依賴的鏡像,選項:<br />1. --ignore-pull-failures 忽略拉取鏡像過程中的錯誤。 |
restart | 格式為docker-compose restart [options] [SERVICE...] ,重啟項目中的服務。選項:<br />1. -t, --timeout TIMEOUT 指定重啟前停止容器的超時時間(默認為10秒)。 |
rm | 格式為docker-compose rm [options] [SERVICE...] ,刪除所有(停止狀態的)服務容器。推薦先執行docker-compose stop 命令來停止容器。選項:<br />1. -f, --force 強制直接刪除,包括非停止狀態的容器。一般盡量不要使用該選項;<br />2. -v 刪除容器所掛載的數據卷。 |
run | 格式為docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] ,在指定服務上執行一個命令。例如docker-compose run ubuntu ping docker.com |
scale | 格式為docker-compose scale [options] [SERVICE=NUM...] ,設置指定服務運行的容器個數。例如docker-compose scale web=3 db=2 ,將啟動3個容器運行web服務,2個容器運行db服務。 |
start | 格式為docker-compose start [SERVICE...] ,啟動已經存在的服務容器 |
stop | 停止已經存在的服務容器 |
top | 查看各個服務容器內運行的進程 |
unpause | 格式為docker-compose unpause [SERVICE...] ,恢復處于暫停狀態到的服務。 |
up | 該命令十分強大,它將嘗試自動完成包括構建鏡像,(重新)創建服務,啟動服務,并關聯服務相關容器的一系列操作。鏈接的服務都將會自動啟動,除非已經處于運行狀態。選項:<br />1. -d 在后臺運行服務容器;<br />2. --no-color 不使用顏色來區分不同的服務的控制臺輸出;<br />3. --no-deps 不啟動服務所鏈接的容器;<br />4. --force-recreate 強制重新創建容器,不能與--no-recreate 同時使用;<br />5. --no-recreate 如果容器已經存在了,則不重新創建,不能與--force-recreate 同時使用;<br />6. --no-build 不自動構建缺失的服務鏡像;<br />7. -t, --timeout TIMEOUT 停止容器時的超時時間。 |
Compose模板文件
模板文件是使用Compose的核心,設計到的指令關鍵字也比較多,但大家不要擔心,這里面大部分指令跟docker run相關參數的含義都是類似的。默認的模板文件名稱為docker-compose.yml
,格式為YAML格式;
注意每個服務都必須通過image
指令指定鏡像或build
指令(需要Dockerfile)等來自動構建生成鏡像;
如果使用build
指令,在Dockerfile中設置的選項(例如:CMD,EXPOSE,VOLUME,ENV等)將會自動被獲取,無需在docker-compose.yml
中再次設置。
build
指令
指定Dockerfile所在文件夾的路徑(可以是絕對路徑,或者相對docker-compose.yml
文件的路徑)。Compose將會利用它自動構建這個鏡像,然后使用這個鏡像;
使用context
指令指定Dockerfile所在文件夾的路徑;
使用dockerfile
指令指定Dockerfile文件名;
使用arg
指令指定構建鏡像時的變量;
version: '3' services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
command
指令
覆蓋容器啟動后默認執行的命令
command: echo "hello world"
container_name
指令
指定容器名稱。默認將會使用“項目名稱_服務名稱_序號”這樣的格式
container_name: docker-web-container
configs
指令
僅用于Swarm mode,詳細內容后面swarm mode會講到
deploy
指令
僅用于Swarm mode,詳細內容后面swarm mode會講到
devices
指令
指定設備映射關系
devices: - "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on
指令
解決容器的依賴、啟動先后的問題
dns
指令
自定義DNS服務器,可以是一個值,也可以是一個列表
dns: 8.8.8.8 dns: - 8.8.8.8 - 114.114.114.114
environment
指令
設置環境變量。你可以使用數組或字典兩種格式。之給定名稱的變量會自動獲取運行Compose主機上對應變量的值,可以用來防止泄露不必要的數據。
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
expose
指令
暴露端口,但不映射到宿主機,只被連接的服務訪問。進可以指定內部端口為參數。
expose: - "3000" - "8000"
extra_hosts
指令
類似Docker中的--add-host
參數,指定額外的host名稱映射信息。會在啟動后的服務容器中/etc/hosts
文件中添加一條條目8.8.8.8 googledns
。
extra_hosts: - "googledns:8.8.8.8"
healthcheck
指令
通過命令檢查容器是否健康運行
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3
image
指令
指定為鏡像名稱或鏡像ID,如果鏡像在本地不存在,Compose會嘗試拉取這個鏡像
image: session-web:latest
labels
指令
為容器添加Docker元數據(metadata)信息,例如可以為容器添加輔助說明信息。
links
指令
連接到其他容器。注意:不推薦使用該指令。應該使用docker network
建立網絡,而docker run --network
來連接特定網絡,或者使用versionn: '2'
和更高版本的docker-compose.yml
直接定義自定義網絡并使用。
network_mode
指令
設置網絡模式。使用和docker run
的--network
參數一樣的值。
network_mode: "bridge" network_mode: "host" network_mode: "none"
networks
指令
配置容器連接的網絡
version: "3" services: some-service: networks: - some-network networks: some-network:
ports
指令
暴露端口信息。使用宿主端口:容器端口(HOST:CONTAINER)
格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
volumes
指令
數據卷所掛載路徑設置,可以設置宿主機路徑,同時支持相對路徑
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
ulimits
指令
指定容器的ulimits限制值。例如,指定最大進程數為65535,指定文件句柄數為20000(軟限制,應用可以隨時修改,不能超過硬限制)和40000(系統硬限制,只能root用戶提高)。
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
其他指令
指定服務容器啟動后執行的入口文件
entrypoint: /code/entrypoint.sh
指定容器中運行應用的用戶名
user: nginx
指定容器中工作目錄
working_dir: /code
指定容器中搜索域名、主機名、mac地址等
domainname: your_website.com hostname: test mac_address: 08-00-27-00-0C-0A
允許容器中運行一些特權命令
privileged: true
指定容器退出后的重啟策略為始終重啟。在生產環境中推薦配置為always或者unless-stopped
restart: always
以只讀模式掛載容器的root文件系統,意味著不能對容器內容進行修改
read_only: true
打開標準輸入,可以接受外部輸入
stdin_open: true
模擬一個偽終端
tty: true
此外,還有包括domainname
,entrypoint
,hostname
,ipc
,mac_address
,privileged
,read_only
,shm_size
,restart
,stdin_open
,tty
,user
,working_dir
等指令,基本跟docker run
中對應參數的功能一致。
讀取變量
Compose模板文件支持動態讀取主機的系統環境變量和當前目錄下的.env
文件中的變量。例如,下面的Compose文件將從運行它的環境中讀取變量${MONGO_VERSION}
的值,并寫入執行的指令中。
version: "3" services: db: image: "mongo:${MONGO_VERSION}"
如果執行的MONGO_VERSION=3.2
,docker-compose up
則會啟動一個mongo:3.2
鏡像的容器。若當前目錄下存在.env
文件,執行docker-compose
命令時將從該文件中讀取變量。
到此,相信大家對“Compose的概念和用法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。