一、Docker Compose 簡介
Docker Compose是一種用于定義和運行多容器Docker應用程序的工具。通過一個docker-compose.yml文件,您可以配置應用程序需要的所有服務(例如:Web服務器、數(shù)據(jù)庫、緩存等)并輕松管理它們。
Docker Compose 使用的三個步驟:
使用 Dockerfile 定義應用程序的環(huán)境。
使用 docker-compose.yml 定義構(gòu)成應用程序的服務,這樣它們可以在隔離環(huán)境中一起運行。
最后,執(zhí)行 docker-compose up 命令來啟動并運行整個應用程序。
二、docker-compose 安裝
此處我采用的是離線安裝方式。
首先下載 docker-compose 到本地,下載地址:https://github.com/docker/compose/
下載鏈接:https://github.com/docker/compose/releases/download/v2.30.1/docker-compose-linux-x86_64
如果直接點擊下載比較慢的話,建議復制鏈接地址到迅雷下載,這樣可能會快一些。下載完成后,把它上傳到 Linux 服務器,如下所示:
接著把可執(zhí)行文件移到 Linux 系統(tǒng)命令目錄(/usr/local/bin/)下,并重命名為 “docker-compose” :
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
授權(quán):
chmod +x /usr/local/bin/docker-compose
驗證是否安裝成功:
docker-compose --version
如果能正常顯示出正確的版本號,說明安裝成功了。
如果需要卸載,直接刪除即可:
sudo rm /usr/local/bin/docker-compose
三、docker-compose常用命令
1、docker-compose up 命令
用法:
docker-compose up [options]
示例:
docker-compose up -d
功能:
創(chuàng)建并啟動服務(容器):如果服務尚未創(chuàng)建,docker-compose up -d 會根據(jù) docker-compose.yml 文件中的定義創(chuàng)建并啟動這些服務。
后臺運行:-d 參數(shù)表示“detached”模式,即以分離模式運行,服務會在后臺運行,不會占用當前終端。
重新創(chuàng)建容器:如果服務已經(jīng)存在且正在運行,docker-compose up -d 會先停止并刪除現(xiàn)有的容器,然后重新創(chuàng)建并啟動新的容器。
構(gòu)建鏡像:如果配置文件中指定了 build 指令,docker-compose up -d 會先構(gòu)建所需的 Docker 鏡像。
檢查配置:在啟動服務之前,docker-compose up -d 會檢查并驗證 docker-compose.yml 文件中的配置。
使用場景:
首次部署:當你第一次部署服務時,使用 docker-compose up -d 可以確保所有服務都按最新配置創(chuàng)建并啟動。
更新服務:當你修改了 docker-compose.yml 文件中的配置或鏡像,使用 docker-compose up -d 可以確保這些更改生效。
確保最新狀態(tài):無論服務是否已經(jīng)存在,docker-compose up -d 都會確保服務是最新的狀態(tài)。
用于部署一個 Compose 應用。
默認情況下該命令會讀取名為 docker-compose.yml 或 docker-compose.yaml 的文件。
當然用戶也可以使用 -f 指定其他文件名。通常情況下,會使用 -d 參數(shù)令應用在后臺啟動。
2、docker-compose down 命令
用法:
docker-compose down [options]
功能:
docker-compose down -v 命令用于停止并移除使用 docker-compose.yml 文件定義的所有容器、網(wǎng)絡(luò)、卷(通過 -v 參數(shù)指定的數(shù)據(jù)卷)以及默認的網(wǎng)絡(luò)橋接。
使用 -v 參數(shù)會刪除所有命名的數(shù)據(jù)卷。這可能會導致數(shù)據(jù)丟失,因此在執(zhí)行前請確保已經(jīng)做好了必要的備份。
使用場景:
適用于徹底清理環(huán)境,例如在開發(fā)過程中需要重置環(huán)境或者測試不同配置時。
完全重置環(huán)境:當你需要完全重置開發(fā)環(huán)境,確保沒有任何遺留數(shù)據(jù)時,可以使用 docker-compose down -v。
測試環(huán)境清理:在自動化測試中,每次測試結(jié)束后使用 docker-compose down -v 可以確保環(huán)境干凈,不受上次測試的影響。
部署前清理:在部署新版本應用之前,使用 docker-compose down -v 可以確保沒有舊版本的殘留數(shù)據(jù)。
選項:
--rmi
all:刪除所有服務的鏡像。
local:僅刪除那些不帶有 :(表示鏡像標簽)或 latest 標簽的鏡像(通常是構(gòu)建時創(chuàng)建的鏡像)。
-v 或 --volumes:移除所有為服務定義的卷(包括默認卷和命名卷)。
--rmi-all:等同于 --rmi all,刪除所有服務的鏡像。
-h, --help:顯示幫助信息。
示例:
1)停止并移除容器、網(wǎng)絡(luò)和默認網(wǎng)絡(luò)
docker-compose down
2)停止并移除容器、網(wǎng)絡(luò)、卷以及鏡像
docker-compose down --volumes --rmi all
3)僅移除構(gòu)建時創(chuàng)建的本地鏡像
docker-compose down --rmi local
4)指定配置文件
docker-compose -f my-compose-file.yml down
注意事項:
使用 docker-compose down --volumes 會刪除所有在 docker-compose.yml 文件中定義的卷,包括默認卷和命名卷。如果你不想刪除這些卷,請不要使用這個選項。
刪除鏡像操作是不可逆的,請確保在刪除鏡像之前備份必要的數(shù)據(jù)。
如果你使用 Docker Compose 來管理多個環(huán)境(例如開發(fā)、測試和生產(chǎn)環(huán)境),請確保你在正確的環(huán)境中運行 docker-compose down 命令,以避免誤刪重要數(shù)據(jù)。
3、docker-compose stop 命令
docker-compose stop
停止 Compose 應用相關(guān)的所有容器,但不會刪除它們。
被停止的應用可以很容易地通過 docker-compose restart 命令重新啟動。
docker-compose stop 命令用于停止通過 docker-compose.yml 文件定義并啟動的所有容器。這個命令不會移除容器、網(wǎng)絡(luò)或卷,它只是停止了容器的運行。
4、docker-compose start 命令
docker-compose start
docker-compose start 命令用于啟動之前已經(jīng)創(chuàng)建但已停止的容器。
5、docker-compose restart 命令
docker-compose restart
重啟已停止的 Compose 應用。
如果用戶在停止該應用后對其進行了變更,那么變更的內(nèi)容不會反映在重啟后的應用中,這時需要重新部署應用使變更生效。
6、docker-compose ps 命令
docker-compose ps
用于列出 Compose 應用中的各個容器。
輸出內(nèi)容包括當前狀態(tài)、容器運行的命令以及網(wǎng)絡(luò)端口。
7、docker-compose rm 命令
用于刪除已停止的 Compose 應用。它會刪除容器和網(wǎng)絡(luò),但是不會刪除卷和鏡像。
語法:
docker-compose rm [OPTIONS] [SERVICE...]
選項:
-f, --file FILE:指定使用的 Compose 配置文件,默認為 docker-compose.yml。
-v, --volumes:刪除容器的同時刪除由 docker-compose.yml 文件定義的卷(如果它們存在并且是容器專用的)。
-a, --all:刪除所有服務容器,而不僅僅是停止的容器。默認情況下,docker-compose rm 只刪除停止的容器。
--rmi TYPE:刪除鏡像。這個選項會刪除構(gòu)建鏡像時產(chǎn)生的中間鏡像和構(gòu)建緩存。TYPE 可以是 all(刪除所有鏡像)、local(只刪除本地鏡像)或 built(只刪除通過 docker-compose 構(gòu)建的鏡像)。
-s, --stop:在刪除容器之前先停止它們。這是默認行為,可以通過添加 --no-stop 標志來覆蓋。
--no-stop:在刪除容器之前不停止它們(通常與 -f 一起使用)。
示例:
1)刪除所有停止的容器
docker-compose rm
這個命令會刪除所有在 docker-compose.yml 文件中定義且當前已停止的容器。
2)刪除所有容器
docker-compose rm -a
這個命令會刪除所有在 docker-compose.yml 文件中定義的容器,無論它們是運行中的還是已停止的。
3)刪除容器和卷
docker-compose rm -v
這個命令會刪除所有已停止的容器以及由 docker-compose.yml 文件定義的卷(如果它們存在并且是容器專用的)。
4)使用指定的 Compose 配置文件
docker-compose -f my-compose.yml rm
這個命令會使用 my-compose.yml 文件來刪除容器。
5)刪除鏡像
docker-compose rm --rmi local
這個命令會刪除所有通過 docker-compose 構(gòu)建且在本地存在的鏡像。
注意事項:
使用 docker-compose rm 命令時,請確保你確實想要刪除這些容器,因為刪除后的數(shù)據(jù)(除非已備份到卷中)將不可恢復。
如果容器正在運行,你需要先停止它們,或者使用 -s 或 --stop 選項來確保在刪除之前先停止它們。
8、docker-compose logs 命令
docker-compose logs 命令用于查看 Docker Compose 應用中各個服務的日志。這個命令非常有用,因為它可以幫助你診斷問題或監(jiān)視服務的行為。
基本用法:
docker-compose logs [options] [SERVICE...]
SERVICE(可選):指定要查看日志的服務名稱。如果未指定,則顯示所有服務的日志。
常用選項:
--follow, -f:實時跟蹤日志輸出,類似于 tail -f。
--tail, -t "all":顯示日志的最后幾行。默認值是 all,也可以指定一個數(shù)字。
--no-color:禁用顏色輸出,使日志更適合重定向到文件或其他工具。
--timestamps, -T:在日志輸出中包含時間戳。
示例:
1)查看所有服務的日志
docker-compose logs
2)查看特定服務的日志
docker-compose logs web
3)查看特定服務的最后10行日志
docker-compose logs --tail 10 web
4)查看所有服務的日志并包含時間戳
docker-compose logs -T
9、使用多個Compose文件
你可以將配置拆分為多個文件:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
四、docker-compose.yml 配置詳解
1、Compose配置文件格式版本與Docker引擎的兼容性表
Compose file format | Docker Engine release |
Compose specification | 19.03.0+ |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
2、頂級配置項
version 定義了版本信息
services 定義了服務的配置信息
networks 定義了網(wǎng)絡(luò)信息,提供給 services 中的 具體容器使用
volumes 定義了卷信息,提供給 services 中的 具體容器使用
示例:
version: "3.8" # Compose文件版本 services: redis: # 服務名稱 image: redis:alpine # 使用的鏡像 ports: - "6379" # 指定的端口 networks: - frontend # 使用的網(wǎng)絡(luò) deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend result: image: nginx ports: - "5001:80" networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: nginx networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s networks: frontend: backend: volumes: db-data:
3、version 常用版本
指定Docker Compose文件格式的版本。常用版本為3.8,3.7等。
4、services 配置指令
1)container_name
指定自定義容器名稱,而不是生成的默認名稱。
version: "3.8" services: redis: image: redis:alpine container_name: redis_test
2)image
指定容器運行的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
version: "3.8" services: redis: image: redis:alpine
3)build
指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。Compose 將會利用它自動構(gòu)建這個鏡像,然后使用這個鏡像。
version: '3.8' services: webapp: build: ./dir
也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑(或者是git倉庫的URL)。同時使用 dockerfile 指令指定 Dockerfile 文件名。
version: '3.8' services: webapp: #自定義發(fā)我名稱 ,主要用查詢 build: context: ./dir dockerfile: Dockerfile-name
注意:
如果同時指定了 image和 build, image 不在具有單獨使用它的意義,而是指定了目前要構(gòu)建的鏡像的名稱。也就是說 Compose 會使用 build 指令中指定的 Dockerfile 構(gòu)建的鏡像,之后構(gòu)建的鏡像名稱使用 image 中指定的名字 webapp:tag命名。
4)command
使用 command 可以覆蓋容器啟動后默認執(zhí)行的命令。
# 寫成shell形式 command: bundle exec thin -p 3000 # 寫成Dockerfile中的exec格式 command: [bundle, exec, thin, -p, 3000]
5)depends_on
設(shè)置依賴關(guān)系。解決容器的依賴、啟動先后的問題。
version: "3.8" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
注意:web 服務不會等待 redis 和 db 完全啟動 之后才啟動。
6)environment
添加環(huán)境變量。您可以使用數(shù)組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML 解析器不會將其轉(zhuǎn)換為 True 或 False。
environment: RACK_ENV: development SHOW: 'true'
如果變量名稱或者值中用到 true|false,yes|no 等表達布爾含義的詞匯,最好放到引號里,避免 YAML 自動解析某些內(nèi)容為對應的布爾語義。這些特定詞匯如下:
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
7)expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內(nèi)部端口為參數(shù):
expose: - "3000" - "8000"
8)ports
映射端口信息。
宿主機端口 : 容器端口 (即:HOST:CONTAINER) 的格式,或者僅僅指定容器的端口(宿主機將會隨機選擇端口)。
ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.18001" - "127.0.0.15000-5010" - "6060:6060/udp"
注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 并且沒放到引號里,可能會得到錯誤結(jié)果,因為 YAML 會自動解析 xx:yy 這種數(shù)字格式為 60 進制。為避免出現(xiàn)這種問題,建議數(shù)字串都采用引號括起來的字符串格式。
9)extra_hosts
添加主機名映射。類似 docker client --add-host。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
以上會在此服務的內(nèi)部容器中 /etc/hosts 創(chuàng)建一個具有 ip 地址和主機名的映射關(guān)系:
162.242.195.82 somehost 50.31.209.229 otherhost
10)networks
配置容器連接的網(wǎng)絡(luò),引用頂級 networks 下的條目 。
services: some-service: networks: some-network: aliases: - alias1 other-network: aliases: - alias2 networks: some-network: # Use a custom driver driver: custom-driver-1 other-network: # Use a custom driver which takes special options driver: custom-driver-2
11)entrypoint
指定服務容器啟動后執(zhí)行的入口文件。
12)user
指定容器中運行應用的用戶名。
13)working_dir
指定容器中工作目錄。
14)restart
restart:
no:是默認的重啟策略,在任何情況下都不會重啟容器。
always:容器總是重新啟動。
on-failure:在容器非正常退出時(退出狀態(tài)非0),才會重啟容器。
unless-stopped:在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經(jīng)停止了的容器
restart: "no" restart: always restart: on-failure restart: unless-stopped
指定容器退出后的重啟策略為始終重啟。該命令對保持服務始終運行十分有效,在生產(chǎn)環(huán)境 中推薦配置為 always 或者 unless-stopped 。
restart: always
注:swarm 集群模式,請改用 restart_policy。
15)aliases
aliases :同一網(wǎng)絡(luò)上的其他容器可以使用服務名稱或此別名來連接到對應容器的服務。
services: some-service: networks: some-network: aliases: - alias1 - alias3 other-network: aliases: - alias2
16)healthcheck
用于檢測 docker 服務是否健康運行。
services: web: image: nginx healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 設(shè)置檢測程序 interval: 1m30s # 設(shè)置檢測間隔 timeout: 10s # 設(shè)置檢測超時時間 retries: 3 # 設(shè)置重試次數(shù) start_period: 40s # 啟動后,多少秒開始啟動檢測程序
17)env_file
從文件添加環(huán)境變量。可以是單個值或列表的多個值。
env_file: .env
也可以是列表格式:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
18)Compose中的環(huán)境變量
你可以使用.env文件設(shè)置docker-compose.yml中使用的變量:
version: '3.8' services: web: image: nginx ports: - "${HOST_PORT}:80"
.env文件:
HOST_PORT=8080
5、volumes 配置指令
將主機的數(shù)據(jù)卷或者文件掛載到容器里。
version: "3.8" services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data"
數(shù)據(jù)卷所掛載路徑設(shè)置。可以設(shè)置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOSTro)。
該指令中路徑支持相對路徑:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
6、networks 配置指令
1)未顯式聲明網(wǎng)絡(luò)環(huán)境
使用docker-compose up啟動容器后,這些容器都會被加入app_default網(wǎng)絡(luò)中。使用docker network ls可以查看網(wǎng)絡(luò)列表,docker network inspect 可以查看對應網(wǎng)絡(luò)的配置。
version: '3' services: web: mage: nginx:latest container_name: web depends_on: - db ports: - "9090:80" links: - db db: image: mysql container_name: db
2)networks關(guān)鍵字指定自定義網(wǎng)絡(luò)
例如:下面的docker-compose.yml文件,定義了front和back網(wǎng)絡(luò),實現(xiàn)了網(wǎng)絡(luò)隔離。其中proxy和db之間只能通過app來實現(xiàn)通信。其中,custom-driver-1并不能直接使用,你應該替換為host, bridge, overlay等選項中的一種。
version: '3.8' services: proxy: build: ./proxy networks: - front app: build: ./app networks: - front - back db: image: postgres networks: - back networks: front: # Use a custom driver driver: custom-driver-1 back: # Use a custom driver which takes special options driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
3)配置默認網(wǎng)絡(luò)
version: '3.8' services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1
4)使用已存在的網(wǎng)絡(luò)
networks: default: external: name: my-pre-existing-network
五、最佳實踐
保持docker-compose.yml簡潔:使用多個文件來分離開發(fā)和生產(chǎn)配置。
版本控制:將你的docker-compose.yml放入版本控制系統(tǒng)中,以管理跨環(huán)境的配置。
使用命名卷:確保數(shù)據(jù)在容器重啟后依然存在。
version: '3.8' # 指定Compose文件的版本 services: # 定義多個服務 web: # Web服務,通常是前端或后端的應用 image: nginx:latest # 使用Nginx鏡像 ports: - "80:80" # 將容器的80端口映射到主機的80端口 volumes: - ./web:/usr/share/nginx/html # 掛載本地目錄到容器中 environment: - NGINX_HOST=localhost # 設(shè)置環(huán)境變量 - NGINX_PORT=80 networks: - frontend # 連接到前端網(wǎng)絡(luò) depends_on: - app # 該服務將在'app'服務啟動后才啟動 restart: always # 在容器崩潰后總是重啟 app: # 應用服務,可以是任何語言的后端服務 build: # 從Dockerfile構(gòu)建鏡像 context: ./app # Dockerfile所在的目錄 dockerfile: Dockerfile # 使用的Dockerfile名稱 ports: - "3000:3000" # 將容器的3000端口映射到主機的3000端口 volumes: - ./app:/usr/src/app # 掛載本地代碼目錄到容器中 environment: - NODE_ENV=development # 設(shè)置環(huán)境變量 - PORT=3000 networks: - frontend # 連接到前端網(wǎng)絡(luò) - backend # 連接到后端網(wǎng)絡(luò) depends_on: - db # 該服務將在'db'服務啟動后才啟動 restart: on-failure # 僅在容器非正常退出時重啟 db: # 數(shù)據(jù)庫服務,使用MySQL image: mysql:5.7 # 使用MySQL 5.7鏡像 volumes: - db_data:/var/lib/mysql # 持久化MySQL數(shù)據(jù)到命名卷 environment: MYSQL_ROOT_PASSWORD: example # MySQL root用戶的密碼 MYSQL_DATABASE: example_db # 自動創(chuàng)建的數(shù)據(jù)庫名稱 MYSQL_USER: user # 創(chuàng)建的用戶名稱 MYSQL_PASSWORD: password # 用戶密碼 networks: - backend # 連接到后端網(wǎng)絡(luò) restart: unless-stopped # 僅在手動停止時不重啟 volumes: # 定義命名卷,用于數(shù)據(jù)持久化 db_data: # MySQL數(shù)據(jù)卷 networks: # 定義自定義網(wǎng)絡(luò) frontend: # 前端網(wǎng)絡(luò),連接web和app服務 backend: # 后端網(wǎng)絡(luò),連接app和db服務
-
應用程序
+關(guān)注
關(guān)注
38文章
3292瀏覽量
57912 -
Docker
+關(guān)注
關(guān)注
0文章
492瀏覽量
11964
原文標題:docker-compose 配置文件內(nèi)容詳解以及常用命令介紹
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論