目錄
一、Compose工具的概述
二、Compose的常用命令
1、列出容器
2、查看訪問日志
3、輸出綁定的公共端口
4、重新構建服務
5、啟動服務
6、停止服務
7、刪除已停止服務的容器
8、創建和啟動容器
9、在運行的容器中執行命令
10、指定一個服務啟動容器的個數
11、其他管理命令
三、docker-compose.yml文件
1、image標簽
2、build標簽
3、command標簽
4、dns標簽
5、environment標簽
6、env_file標簽
7、expose標簽
8、port標簽
9、network_mode標簽
10、depends_on標簽
11、links標簽
12、volumes標簽
13、volumes_from標簽
14、logs標簽
一、Compose工具的概述
????????Compose是Docker 官方的開源項目,定位是“定義和運行多個Docker 容器應用的工具”,其前身是Fig,負責實現對Docker容器集群的快速編排。Compose 通過YMAL配置文件來創建和運行所有服務。
????????在Docker中構建自定義鏡像是通過使用Dockerfile 模板文件來實現的,從而使用戶方便地定義一個單獨的應用容器。而Compose使用的模板文件是一個YAML格式文件,它允許用戶通過一個docker-compose.yml 模板文件來定義一-組相關聯的應用容器為一個項目。
????????Compose 項目使用Python語言編寫而成,調用了Docker 服務提供的API來對容器進行管理。因此,只要所操作的平臺支持Docker API, 就可以在其上利用Compose工具來進行編排管理。
????????Compose有以下兩個重要概念。
????????(1)服務(Service):?一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。每個服務都有自己的名稱、使用的鏡像、掛載的數據卷、所屬的網絡、依賴的服務等。
????????(2)項目( Project):由一組關聯的應用容器組成的一-個完整業務單元,在docker-compose.yml中定義,即Compose的一個配置文件可以解析為一個項目,Compose 通過分析指定配置文件,得出配置文件所需完成的所有容器管理與部署操作。
????????Compose的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷的生命周期管理。
二、Compose的常用命令
????????Compose的常用命令常跟在docker-compose主命令后面。
1、列出容器
????????ps命令用于列出所有運行的容器。
????????其常用選項說明如下。
-q:只顯示ID
例如,列出所有運行容器。
docker-compose ps
2、查看訪問日志
????????logs命令用于查看服務日志輸出。
????????其常用選項說明如下。
(1) -f,--follow:實時輸出日志。
(2) -t,--timestamps:顯示時間戳。
(3) --tail="all":從日志末尾顯示行。
例如,查看nginx的實時日志。
docker-compose logs -f nginx
3、輸出綁定的公共端口
????????port命令用于輸出綁定的公共端口。
????????其常用選項說明如下。
(1) --protocol=proto: TCP或UDP, 默認為TCP。
(2) --index=index: 多個容器時的索引數字,默認為1。
例如,輸出eureka 服務8761 端口所綁定的公共端口。
docker-compose port eureka 8761
4、重新構建服務
????????build命令用于構建或重新構建服務。
????????其常用選項說明如下。
(1) --no-cache: 不使用緩存構建鏡像。
(2) --build-arg key=val:設置構建時變量。
例如,構建鏡像。
docker-compose build
5、啟動服務
????????start命令用于自動指定服務已存在的容器。
例如,啟動nginx容器。
docker-compose start nginx
6、停止服務
????????stop命令用于停止已運行服務的容器。
例如,停止nginx容器。
docker-compose stop nginx
7、刪除已停止服務的容器
????????rm命令用于刪除指定服務的容器。
????????其常用選項說明如下。
(1) -f,--force: 強制刪除。
(2) -s,--stop: 刪除容器時需要先停止容器。
(3)-V,刪除與容器相關的任何匿名卷。
例如,刪除已停止的nginx容器。
docker-compose rm nginx
8、創建和啟動容器
????????up命令用于創建和啟動容器。
????????其常用選項說明如下。
( 1)-d:在后臺運行容器。
(2) -t:指定超時時間。
(3) -no-deps:不啟動連接服務。
( 4) --no-recreate:如果容器存在,則不重建容器。
(5) --no-build:不構建鏡像,即使其會丟失。
(6) --build:啟動容器并構建鏡像。
(7) --scale SERVICE=NUM:指定-個服務(容器)的啟動數量。
例如,創建并啟動nginx容器。
docker-compose up -d nginx
9、在運行的容器中執行命令
????????exec命令用于在支持的容器中執行命令。
????????其常用選項說明如下。
(1) -d:在后臺運行命令。
(2) --privileged:給這個進程賦予特殊權限。
(3) -u,--user USER:作為該用戶運行該命令。
(4) -T:禁用分配偽終端,默認分配一個終端。
(5) --index=index:多個容器時的索引數字,默認1。
例如,登錄到nginx容器中。
docker-compose exec nginx bash
10、指定一個服務啟動容器的個數
????????scale命令用于指定服務啟動容器的個數。
例如,設置指定服務運行容器的個數,以service=num的形式指定。
docker-composo scale user=3 movie=3
11、其他管理命令
(1) restart命令用于重啟服務。
(2) kill命令通過發送SIGKILL信號來停止指定服務的容器。
(3) pause命令用于掛起容器。
(4) image命令用于列出本地Docker的鏡像。
(5) down命令用于停止容器和刪除容器、網絡、數據卷及鏡像。
(6) create命令用于創建一個服務。
(7) pull命令用于下載鏡像。
(8) push命令用于推送鏡像。
(9) help命令用于查看幫助信息。
三、docker-compose.yml文件
????????docker-compose.yml文件包含version、services、 networks 三部分,其中,services 和networks是關鍵部分。常見的services書寫規則如下。
1、image標簽
????????image標簽用于指定基礎鏡像。
services:web:image:nginx (image:"nginx:latest")
????????在services標簽下的web為第二級標簽,標簽名可由用戶自定義,它也是服務名稱。
????????image可以指定服務的鏡像名稱或鏡像ID,如果鏡像在本地不存在,則Compose會嘗試獲取這個鏡像。
2、build標簽
????????build標簽用于指定Dockerfile所在文件夾的路徑。該值可以是一個路徑, 也可以是一個對象。Compose 會利用它自動構建鏡像,并使用構建的鏡像啟動容器。
build: /path/to/build/dir
????????也可以使用相對路徑,即
build: ./dir
????????還可以設置上下文根目錄,并以該目錄指定Dockerfile。
build:context: ../dockerfile: path/of/Dockerfile
3、command標簽
????????command標簽用于覆蓋容器啟動后默認執行的命令。
command: bundle exec thin -P 3000
????????也可以寫為類似Dockerfile中的格式,例如:
comand: [bundle, exec, thin, -P, 3000]
4、dns標簽
????????dns標簽用于配置DNS服務器,其可以是一個具體值。
dns: 114.114.114.114
????????也可以是一個列表。
dns:- 114.114.114.114- 115.115.115.115
????????還可以配置DNS搜索域,其可以是一個值或列表。
dns_ search: example.com
dns_ search:- dc1.example.com- dc2.example.com
5、environment標簽
????????environment標簽用于設置鏡像變量。與arg標簽不同的是,arg 標簽設置的變量僅用于構建過程中,而environment標簽設置的變量會一直保存在鏡像和容器中。
environment:RACK_ ENV: developmentSHOW: 'true'SESSION_SECRET:
????????或者:
environment:- RACK_ ENV=development- SHOW=true- SESSION_SECRET
6、env_file標簽
????????env_file標簽用于設置從env文件中獲取的環境變量。可以指定一個文件路徑或路徑表,其優先級低于environment指定的環境變量,即當其設置的變量名稱與environment標簽設置的變量名稱沖突時,以environment標簽設置的變量名稱為主。
env_file: .env
????????可以根據docker.compose.yml設置路徑列表。
env_file:- ./common.env- ./apps/web.env- /opt/secrets.env
7、expose標簽
????????expose標簽用于設置暴露端口,只將端口暴露給連接的服務,不暴露給主機。
expose:- "8000"- "8010"
8、port標簽
????????port標簽用于對外暴露端口定義,使用host:container格式,或者只指定容器的嘴口號,宿主機會隨機映射端口。
ports:- "3000"- "8763:8763"- "宿主機端口:容器端口"
????????注意:當使用host:container格式來映射端口時,如果使用的容器端口號小于60,則可能會得到錯誤的結果,因為YAML會將<xx:yy>格式的數字解析為60進制,所以建議使用字符串格式。
9、network_mode標簽
????????network_mode標簽用于設置網絡模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
10、depends_on標簽
????????depends_on標簽用于指定容器服務的啟動順序。
version: '2'
services: web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres
? ? ? ? 這里,容器會先啟動Redis和DB兩個服務,再啟動Web服務。
11、links標簽
? ? ? ? links標簽用于指定容器連接到當前連接,可以設置別名。
links:- db- db:database- redis
12、volumes標簽
????????volumes標簽用于指定卷掛載路徑,可以掛載一個日錄或者一個已存在的數據卷容器。可以直接使用"host:container”格式,或者使用"host:container:ro" 格式,對于容器來說,后者的數據卷是只讀的,這樣可以有效保護宿主機的文件系統。
volumes://只是指定一個路徑,Docker會自動創建個數據卷 (該路徑是容器內部的)- /var/1ib/mysq1//使用絕對路徑掛載數據卷- /opt/data:/var/lib/mysq1//以Compose配置文件為中心的相對路徑作為數據卷掛載到容器- ./cache:/tmp/cache//使用用戶的相對路徑( ~/ 表示的目錄是/home/<用戶目錄>/ 或者 /root/)- ~/configs:/etc/configs/:ro//已經存在的命名的數據卷- datavolume:/var/1ib/mysq1
????????如果不使用宿主機的路徑,則可以指定一個volume_driver。
volume_ driver: mydriver
13、volumes_from標簽
????????volumes_from標簽用于設置從其他容器或服務掛在數據卷,可選的參數是:ro或者:rw,前者表示容器只讀,后者表示容器對數據卷是可讀可寫的。默認情況下是可讀可寫的。
volumes_ from:- service_ name- service_ name:ro- container:container_name- container:container_name:rw
14、logs標簽
????????logs標簽用于設置日志輸出信息。
logging :driver: syslogoptions:syslog-address: "tcp://192.168.0.42:123"