【Docker】docker-compose基本使用
1. docker 項目部署弊端
一般的docker部署項目有如下弊端:
- 一個完整的項目通常需要用到多個容器,N個容器之間會形成依賴,比如項目啟動時如果沒有啟動mysql容器,那么項目容器就啟動不起來。沒有啟動es容器,kibana容器也啟動不起來。所以,容器啟動之間的編排顯得至關(guān)重要,項目龐大時我們很難記住容器啟動順序
- 對于容器的編排尚且有一個很簡單的方法就是寫一個shell腳本來一次性解決啟動順序的問題。
- 一般情況下,docker中容器很多,可能有很多個其他項目的容器在里面。我們沒有辦法站在項目的角度將一個項目用到的容器劃分在一起,日后在另一臺服務(wù)器啟動該項目就變得很困難了。
而 docker-compose 就能夠解決以上問題。
2. docker-compose 簡介
Docker Compose是一個用于定義和運行多個Docker容器的工具,負責(zé)實現(xiàn)對 docker 容器集群的快速編排,它使用 YAML 文件來配置應(yīng)用程序的服務(wù)、網(wǎng)絡(luò)和卷等方面。
Compose
中有兩個重要的概念:
- 服務(wù)(service):一個應(yīng)用的容器,實際上可以包括若干運行相同鏡像的容器實例。
- 項目(project):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個完整業(yè)務(wù)單元,在
docker-compose.yml
文件中定義。
3. 實踐
創(chuàng)建一個項目:
mkdir ems
在ems目錄創(chuàng)建一個 docker-compose.yml 模板文件,如下所示:
#代表使用 docker-compose 項目的版本號
version: "3.0"
services:
tomcat:
container_name: tomcat01 #代表給容器指定一個名稱,類似于 docker run --name 參數(shù)。不寫就會默認給一個名字,推薦使用默認名字。
image: tomcat:8.0 #代表使用哪個鏡像,類似于 docker run 指定的鏡像名稱
ports:
- 8080:8080
tomcat1:
image: tomcat:8.0
ports:
- 8081:8080
redis:
image: redis:5.0.12
ports:
- "6379:6379"
mysql:
image: mysql:5.6
ports:
- "3306:3306"
environment: #代表給當(dāng)前容器啟動指定環(huán)境 類似于 docker run -e MYSQL_ROOT_PASSWORD=root
#MYSQL_ROOT_PASSWORD: root
- "MYSQL_ROOT_PASSWORD=root"
volumes: #代表給當(dāng)前容器和宿主機指定數(shù)據(jù)卷 類似于 docker run -v 注意:docker-compose使用絕對路徑必須先創(chuàng)建才能使用
#- /root/mysqldata1:/var/lib/mysql
- mysqlData:/var/lib/mysql
volumes:
mysqlData: #聲明數(shù)據(jù)卷別名,只需要聲明就行,不用賦值,因為docker-compose不會自動創(chuàng)建數(shù)據(jù)卷,所以要先聲明。
啟動docker-compose一組服務(wù):
#這個命令必須在 docker-compose.yml 配置文件目錄下執(zhí)行
docker-compose up
停止并銷毀 Docker Compose 文件定義的容器、網(wǎng)絡(luò)和卷:
docker-compose down
具體來說,docker-compose down
命令會執(zhí)行以下步驟:
- 停止正在運行的容器:它會找到并停止使用
docker-compose up
啟動的容器。 - 移除容器:停止后,這些容器將被,它們的狀態(tài)信息也將被清除。
- 移除網(wǎng)絡(luò):與容器關(guān)聯(lián)的網(wǎng)絡(luò)將被刪除。這適用于由
docker-compose
創(chuàng)建的網(wǎng)絡(luò)。 - 移除卷:由
docker-compose
創(chuàng)建的卷將被銷毀。這將刪除在容器中創(chuàng)建的任何持久數(shù)據(jù)總之,docker-compose down
命令是一種方便的方式,用于停止和清理你在啟動容器時所創(chuàng)建的所有資源,以便你可以完全重置環(huán)境或重新部署應(yīng)用程序。請注意,執(zhí)行此命令將不會刪除 Docker 鏡只會停止并移除與docker-compose up
命令相關(guān)的容器、網(wǎng)絡(luò)和卷。
4. 模板命令
參考文檔:參考文檔
4.1 build 指令
我們在 docker-compose.yml 文件中編寫的服務(wù)在本地都需要有鏡像,那如果是我們需要部署自己的springboot項目的話,我們是不是還得先編寫Dockerfile來將項目打成鏡像?這樣就很麻煩了,所以可以使用build指令來解決這一問題。
version: '3'
services:
webapp:
build:
context: ./dir # 指定Dockerfile上下文目錄
dockerfile: Dockerfile-alternate #指定Dockerfile文件的名字,一般Dockerfile不會改名
args: #使用 arg 指令指定構(gòu)建鏡像時的變量。
buildno: 1
4.2 command 指令
覆蓋容器啟動后默認執(zhí)行的命令。
command: echo "hello world"
4.3 container_name 指令
指定容器名稱。默認將會使用 項目名稱_服務(wù)名稱_序號
這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱后,該服務(wù)將無法進行擴展(scale),因為 Docker 不允許多個容器具有相同的名稱。
4.4 depends_on 指令
解決容器的依賴、啟動先后的問題,以下例子中會先啟動 redis、db 再啟動 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:
web
服務(wù)不會等待redis
db
「完全啟動」之后才啟動。
4.5 env_file 指令
相當(dāng)于 docker run -e
。從文件中獲取環(huán)境變量,可以為單獨的文件路徑或列表。
如果通過 docker compose -f FILE
方式來指定 Compose 模板文件,則 env_file
中變量的路徑會基于模板文件路徑。
如果有變量名稱與 environment
指令沖突,則按照慣例,以后者為準。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 #
開頭的注釋行。
# common.env: Set development environment
PROG_ENV=development
注意:推薦文件都命名為
.env
,因為在linux中默認不會顯示 .env文件,提高了一絲絲的安全性。
4.6 environment 指令
相當(dāng)于 docker run -e
。設(shè)置環(huán)境變量。你可以使用數(shù)組或字典兩種格式。
只給定名稱的變量會自動獲取運行 Compose 主機上對應(yīng)變量的值,可以用來防止泄露不必要的數(shù)據(jù)。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
4.7 image 指令
相當(dāng)于 docker run image
。指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose
將會嘗試拉取這個鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
4.8 nteworks 指令
相當(dāng)于 docker run --network
。配置容器連接的網(wǎng)絡(luò)。
Compose指定網(wǎng)絡(luò)必須先聲明。
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
4.9 ports 指令
相當(dāng)于 docker run -p
。暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER)
格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
ports:
- "3000" #宿主機端口隨機
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
4.10 volumes 指令
相當(dāng)于docker run -v
。數(shù)據(jù)卷所掛載路徑設(shè)置。可以設(shè)置為宿主機路徑(HOST:CONTAINER
)或者數(shù)據(jù)卷名稱(VOLUME:CONTAINER
),并且可以設(shè)置訪問模式 (HOST:CONTAINER:ro
)。
該指令中路徑支持相對路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
如果路徑為數(shù)據(jù)卷名稱,必須在文件中配置數(shù)據(jù)卷。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
4.11 restart 指令
相當(dāng)于 docker run --restart=always
。指定容器退出后的重啟策略為始終重啟。該命令對保持服務(wù)始終運行十分有效,在生產(chǎn)環(huán)境中推薦配置為 always
或者 unless-stopped
。
restart: always
5. Compose 常用命令
5.1 命令對象與格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務(wù)或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務(wù)都會受到命令影響。
執(zhí)行 docker compose [COMMAND] --help
可以查看具體某個命令的使用格式。
docker compose
命令的基本的使用格式是
docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
5.2 命令選項
-
-f, --file FILE
指定使用的 Compose 模板文件,默認為docker-compose.yml
,可以多次指定。 -
-p, --project-name NAME
指定項目名稱,默認將使用所在目錄名稱作為項目名。 -
--verbose
輸出更多調(diào)試信息。 -
-v, --version
打印版本并退出。
5.3 up 命令
格式為 docker compose up [options] [SERVICE...]
。
該命令十分強大,它將嘗試自動完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。
鏈接的服務(wù)都將會被自動啟動,除非已經(jīng)處于運行狀態(tài)。
可以說,大部分時候都可以直接通過該命令來啟動一個項目。
默認情況,docker compose up
啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息,可以很方便進行調(diào)試。
當(dāng)通過 Ctrl-C
停止命令時,所有容器將會停止。
如果使用 docker compose up -d
,將會在后臺啟動并運行所有的容器。一般推薦生產(chǎn)環(huán)境下使用該選項。
默認情況,如果服務(wù)容器已經(jīng)存在,docker compose up
將會嘗試停止容器,然后重新創(chuàng)建(保持使用 volumes-from
掛載的卷),以保證新啟動的服務(wù)匹配 docker-compose.yml
文件的最新內(nèi)容。如果用戶不希望容器被停止并重新創(chuàng)建,可以使用 docker compose up --no-recreate
。這樣將只會啟動處于停止狀態(tài)的容器,而忽略已經(jīng)運行的服務(wù)。如果用戶只想重新部署某個服務(wù),可以使用 docker compose up --no-deps -d <SERVICE_NAME>
來重新創(chuàng)建服務(wù)并后臺停止舊服務(wù),啟動新服務(wù),并不會影響到其所依賴的服務(wù)。
選項:
-
-d
在后臺運行服務(wù)容器。 -
--no-color
不使用顏色來區(qū)分不同的服務(wù)的控制臺輸出。 -
--no-deps
不啟動服務(wù)所鏈接的容器。 -
--force-recreate
強制重新創(chuàng)建容器,不能與--no-recreate
同時使用。 -
--no-recreate
如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate
同時使用。 -
--no-build
不自動構(gòu)建缺失的服務(wù)鏡像。 -
-t, --timeout TIMEOUT
停止容器時候的超時(默認為 10 秒)。
5.4 down 命令
此命令將會停止 up
命令所啟動的容器,并移除網(wǎng)絡(luò)。
docker-compose down #對整個項目操作
docker-compose down 服務(wù)id #對某個服務(wù)操作
5.5 exec 命令
進入指定的容器。
docker-compose exec 服務(wù)id bash
5.6 ps 命令
列出項目中目前的所有容器。
格式為 docker compose ps [options] [SERVICE...]
。
選項:
-
-q
只打印容器的 ID 信息。
5.7 restart 命令
重啟項目中的服務(wù)。
格式為 docker compose restart [options] [SERVICE...]
。
選項:
-
-t, --timeout TIMEOUT
指定重啟前停止容器的超時(默認為 10 秒)。
docker-compose restart 對整個項目操作
docker-compose restart -t 服務(wù)id
5.8 rm 命令
刪除所有(停止狀態(tài)的)服務(wù)容器。推薦先執(zhí)行 docker compose stop
命令來停止容器。
格式為 docker compose rm [options] [SERVICE...]
。
選項:
-
-f, --force
強制直接刪除,包括非停止狀態(tài)的容器。一般盡量不要使用該選項。 -
-v
刪除容器所掛載的數(shù)據(jù)卷。
5.9 top 命令
查看整個項目中所有服務(wù)容器內(nèi)運行進程或者查看某個指定id服務(wù)的容器的進程。
docker-compose top [服務(wù)id]
5.10 logs 命令
查看服務(wù)容器的輸出。默認情況下,docker compose 將對不同的服務(wù)輸出使用不同的顏色來區(qū)分??梢酝ㄟ^ --no-color
來關(guān)閉顏色。文章來源:http://www.zghlxwxcb.cn/news/detail-596266.html
格式為 docker compose logs [options] [SERVICE...]
。文章來源地址http://www.zghlxwxcb.cn/news/detail-596266.html
到了這里,關(guān)于【Docker】docker-compose基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!