github 地址:https://github.com/docker/compose
官方文檔:https://docs.docker.com/compose/
docker compose是什么?
這里引用github上的一句話
Docker Compose is a tool for running multi-container applications on Docker defined using the Compose file format. A Compose file is used to define how the one or more containers that make up your application are configured. Once you have a Compose file, you can create and start your application with a single command:
docker-compose up
.
上面的翻譯過來,簡單來說就是管理容器的。
還沒懂?嗯,不光你沒懂,我也沒懂[/手動憨笑]
舉個例子[/手動思考]
一個web項目可能有nginx,mysql,php-fpm等等,很多很多容器,當容器數量達到一定數量比如10個,這時候要擴展,需要先關掉容器 ,你需要一個個關掉,擴展,然后一個個啟動,多麻煩,這時候docker compose出現了。它就是為了解決這個問題的。
簡單明白了是干嘛的,我們來看看官方文檔上的介紹
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.- Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment.- Run
docker-compose up
and Compose starts and runs your entire app.
大概意思:
Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可以使用YAML文件來配置應用程序的服務。然后,只需要一個命令,就可以從配置中創建並啟動所有服務。要了解關於Compose的所有特性的更多信息,請參見特性列表。
組合工作在所有環境中:生產、階段、開發、測試以及CI工作流。您可以在常見用例中了解有關每個案例的更多信息。
使用Compose基本上有三個步驟:
-
用Dockerfile定義你的應用環境,這樣它就可以在任何地方復制。
-
在docker-compose中定義組成應用程序的服務。這樣它們就可以在一個孤立的環境中一起運行。
-
運行docker-compose up,然后Compose啟動並運行你的整個應用。
docker compose ,docker swarm和k8s的區別
你會發現你搜索docker compose的資料經常會出現,,docker swarm,k8s,那這些是干嘛的,有什么區別?
Docker-Compose
Docker-Compose 是用來管理你的容器的,有點像一個容器的管家,想象一下當你的Docker中有成百上千的容器需要啟動,如果一個一個的啟動那得多費時間。有了Docker-Compose你只需要編寫一個文件,在這個文件里面聲明好要啟動的容器,配置一些參數,執行一下這個文件,Docker就會按照你聲明的配置去把所有的容器啟動起來,只需docker-compose up即可啟動所有的容器,但是Docker-Compose只能管理當前主機上的Docker,也就是說不能去啟動其他主機上的Docker容器
Docker Swarm
Docker Swarm 是一款用來管理多主機上的Docker容器的工具,可以負責幫你啟動容器,監控容器狀態,如果容器的狀態不正常它會幫你重新幫你啟動一個新的容器,來提供服務,同時也提供服務之間的負載均衡,而這些東西Docker-Compose 是做不到的
k8s
K8S,就是基於容器的集群管理平台,它的全稱,是kubernetes。
Kubernetes它本身的角色定位是和Docker Swarm 是一樣的,也就是說他們負責的工作在容器領域來說是相同的部分,都是一個跨主機的容器管理平台,當然也有自己一些不一樣的特點,k8s是谷歌公司根據自身的多年的運維經驗研發的一款容器管理平台。而Docker Swarm則是由Docker 公司研發的。
既然這兩個東西是一樣的,那就面臨選擇的問題,應該學習哪一個技術呢?實際上這兩年Kubernetes已經成為了很多大公司的默認使用的容器管理技術,而Docker Swarm已經在這場與Kubernetes競爭中已經逐漸失勢,如今容器管理領域已經開始已經逐漸被Kubernetes一統天下了。所以建議大家學習的時候,應該多考慮一下這門技術在行業里面是不是有很多人在使用。
需要注意的是,雖然Docker Swarm在與Kubernetes的競爭中敗下陣來,但是這個跟Docker這個容器引擎沒有太大關系,它還是整個容器領域技術的基石,Kubernetes離開他什么也不是。
總結
Docker是容器技術的核心、基礎,Docker Compose是一個基於Docker的單主機容器編排工具.而k8s/Docker Swarm是一個跨主機的集群部署工具
Docker-Compose 安裝
參考:
https://docs.docker.com/compose/install/
下載
Github源
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
上面這個由於是github的,可能會比較慢
可以使用這個地址
Daocloud鏡像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
可以看到上面的下載完畢之后應該是在/usr/local/bin/
目錄,我們進該目錄看下
可以看到已經下載成功
授權
給程序授予可執行權限
sudo chmod +x /usr/local/bin/docker-compose
測試是否安裝成功
docker-compose version
快速體驗
參考:https://docs.docker.com/compose/gettingstarted/
這是官方提供的一個入門例子
就是python 使用falask框架,數據庫使用redis的一個計數器
前提條件要已經安裝了docker和docker compose
好,我們現在跑一下官方的測試,體驗一下
1.創建一個目錄
$ mkdir composetest
$ cd composetest
2.創建一個app.py的應用
創建app.p
y文件,文件寫入下面的內容
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
注意保存退出
在此示例中,redis
是應用程序網絡上的redis容器的主機名。我們為Redis使用默認端口6379
。
處理瞬態錯誤
注意
get_hit_count
函數的編寫方式。如果redis服務不可用,這個基本的重試循環使我們可以多次嘗試請求。當應用程序聯機時,這在啟動時很有用,但是如果需要在應用程序的生命周期內隨時重新啟動Redis服務,則還可以使我們的應用程序更具彈性。在群集中,這還有助於處理節點之間的瞬時連接斷開。
3.創建應用的依賴包文件
創建一個requirements.txt
文件,文件寫入下面內容
flask
redis
現在應用相關的基本已經准備好了,現在可以使用dockerfile構建應用了
4.使用dockerfile將應用構建為鏡像
有關dockerfile使用,可以參考:
https://www.cnblogs.com/makalochen/p/14247807.html
創建一個Dockerfile
文件,文件里面寫入下面的內容
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
這告訴Docker:
- 從Python 3.7映像開始構建映像。
- 將工作目錄設置為
/code
。 - 設置
flask
命令使用的環境變量。 - 安裝gcc和其他依賴項
- 復制
requirements.txt
並安裝Python依賴項。 - 向圖像添加元數據以描述容器正在偵聽端口5000
- 將
.
項目中的當前目錄復制到.
映像中的工作目錄。 - 將容器的默認命令設置為
flask run
。
5.創建docker compose服務配置文件
創建docker-compose.yml
文件,文件寫入下面內容
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
該Compose文件定義了兩個服務:web
和redis
。
網絡服務
該web
服務使用從Dockerfile
當前目錄中構建的映像。然后,它將容器和主機綁定到暴露的端口5000
。此示例服務使用Flask Web服務器的默認端口5000
。
Redis服務
該redis
服務使用 從Docker Hub注冊表中提取的公共Redis映像。
6.啟動服務
在項目目錄中,運行
docker-compose up
啟動完成
關於版本的問題
這一步按照官網粘貼,有可能會出現版本不一致的情況,如:
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the
services
key, or omit theversion
key and place your service definitions at the root of the file to use version 1.
解決辦法
重新下載docker-compose
#刪除
sudo rm /usr/local/bin/docker-compose
#下載
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#授權
sudo chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose version
7.瀏覽器測試訪問
到此體驗項目運行完畢,你會發現我們沒有用任何拉取鏡像,構建鏡像,啟動容器的命令,一個命令就把項目跑起來了,這就是docker compose的作用。
docker compoe常用命令
#構建建啟動nignx容器
docker-compose up -d nginx
# 登錄到nginx容器中
docker-compose exec nginx bash
#刪除所有nginx容器,鏡像
docker-compose down
#顯示所有容器
docker-compose ps
#重新啟動nginx容器
docker-compose restart nginx
#在php-fpm中不啟動關聯容器,並容器執行php -v 執行完成后刪除容器
docker-compose run --no-deps --rm php-fpm php -v
#構建鏡像 。
docker-compose build nginx
#不帶緩存的構建。
docker-compose build --no-cache nginx
#查看nginx的日志
docker-compose logs nginx
# 查看nginx的實時日志
docker-compose logs -f nginx
# 驗證(docker-compose.yml)文件配置,當配置正確時,不輸出任何內容,當文件配置錯誤,輸出錯誤信息。
docker-compose config -q
#以json的形式輸出nginx的docker日志
docker-compose events --json nginx
# 暫停nignx容器
docker-compose pause nginx
#恢復ningx容器
docker-compose unpause nginx
#刪除容器(刪除前必須關閉容器)
docker-compose rm nginx
#停止nignx容器
docker-compose stop nginx
#啟動nignx容器
docker-compose start nginx
yaml 文件編寫規則
參考:
https://docs.docker.com/compose/compose-file/compose-file-v3/
yaml命令特別多,但是我們一般只要關注三層即可
#三層!
# 版本
version: "3.9"
# 服務
services:
服務1:web
#服務配置
images
build
network
原來docker的配置
....
服務2:redis
...
#其他配置 網絡/卷、全局規則
volumes:
networks:
configs:
yaml語法規則
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進不允許使用tab,只允許空格
- 縮進的空格數不重要,只要相同層級的元素左對齊即可
- '#'表示注釋
結構介紹
docker-compose.yaml
文件結構主要由
version # docker compose版本
networks # 網絡,用於docker容器內部通訊
x-{name} # 模版命名規則 以x-開頭 用於復用
volumes # 掛載卷
services # 服務模塊,內部定義容器信息 其內部參數相當於docker run時的參數
模塊介紹
version
設定docker-compose.yaml
的版本
需要升級的話,參看文檔 版本升級參考文檔
Compose file 版本 | Docker Engine 版本 |
---|---|
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+ |
1.0 | 1.9.1.+ |
network_mode
使用與--network
參數相同的值,以及特殊形式service:[service name]
一般配合 networks使用
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
為當前docker-compose.yaml
文件創建的容器設定網絡
不一定存在於和version同級,也可以在各個其他模塊中,例如services中
可以參考:https://www.jianshu.com/p/3004fbce4d37
- 內部網絡
services:
some-service:
networks:
- some-network
- other-network
- 公用網絡
version: "3"
networks:
default-network:
aliases(待補充)
網絡的別名
version: "3.8"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
ipv4_address , ipv6_address(待補充)
version: "3.8"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
services
最主要的部分,用來配置各個服務
build
用於構建鏡像,當build和image字段都存在時,使用image指定的鏡像名和tag作為build鏡像的name和tag
version: "3.8" # docker compose版本
services:
webapp: # docker-compose定義的服務(容器)名,主要是針對docker-compose命令的參數,與docker ps看到的容器名不一定一致
build: # 使用Dockerfile構建鏡像
context: ./dir 上下文路徑,相對路徑則是相對於compose文件路徑
dockerfile: Dockerfile-alternate # 指定Dockerfile文件名
args: # 指定Dockerfile的參數 環境變量
buildno: 1 # directory寫法和list寫法均可
context
可以使用相對路徑或者git倉庫的url
build:
context: ./dir
Dockerfile
指定Dockerfile文件名,必須指定context
build:
context: .
dockerfile: Dockerfile-alternate
args
Dockerfile中的ARG
字段,用於指定docker build時的環境變量
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno" # bash-like風格的寫法
RUN echo "Based on commit: $gitcommithash"
可以使用list或者map來設定args
build:
context: .
args: # map
buildno: 1
gitcommithash: cdc3b19
build:
context: .
args: # list
- buildno=1
- gitcommithash=cdc3b19
tips
如果需要使用boolean值,需要使用雙引號("true", "false", "yes", "no", "on", "off"),以便解析器將他們解析為字符串。
cache_from
為build過程指定cache
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
labels
同Dockerfile中的LABEL
指令,為鏡像設定metadata
build:
context: .
labels: # map
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
build:
context: .
labels: # list
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
network
同docker --network
指令,為容器指定網絡,個人理解為設定局域網
橋接可以將兩個物理局域網連接起來
三種模式
build:
context: .
network: host # host模式,網絡延遲最低,性能與宿主機一致
build:
context: .
network: custom_network_1 # 自創network
build:
context: .
network: none # 無網絡
shm_size
設置容器內/dev/shm
目錄的大小
/dev/shm
目錄非常重要,此目錄並不在硬盤上,而是在內存中,默認大小為內存的一半大小,存入其中的文件不會被清空,容器內划分此目錄可以一定程度上指定容器的性能。
build:
context: .
shm_size: '2gb' # 使用字符串設置大小
build:
context: .
shm_size: 10000000 # 設置字節大小
command
相當於Dockerfile中的CMD
命令
command: bundle exec thin -p 3000 # shell-like
command: ["bundle", "exec", "thin", "-p", "3000"] # json-like
container_name
相當於docker run --name
container_name: my-web-container
depends_on
用於表述服務之間的依賴關系
在docker-compose up
時,會根據depends_on來決定啟動順序
version: "3.8"
services:
web:
build: .
depends_on: # 先啟動 db 和 redis
- db
- redis
redis:
image: redis
db:
image: postgres
tips:
docker-compose 不會等待depends_on中的容器的狀態時‘ready’時才啟動,所以需要在啟動完成后檢查容器狀態。官方給出了解決辦法,使用shell腳本來曲線救國,不做贅述。depends_on does not wait for db and redis to be “ready” before starting web - only until they have been started. If you need to wait for a service to be ready, see Controlling startup order for more on this problem and strategies for solving it.
----form https://docs.docker.com/compo...
devices
掛載的外接設備,與--devices
功能相同
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定義dns地址
dns: 8.8.8.8 # 單個string值
dns: # list
- 8.8.8.8
- 9.9.9.9
dns_search
自定義dns搜索域名
dns_search: example.com # 單個string值
dns_search:
- dc1.example.com
- dc2.example.com
entrypoint
覆蓋重寫默認的 entrypoint
entrypoint: /code/entrypoint.sh
同Dockerfile中的寫法
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
tips:
docker-compose.yaml
中的entrypoint
清空Dockerfile中的CMD
命令,並覆蓋所有的Dockerfile中的ENTRYPOINT
指令。
env_file
為docker-compose.yaml
添加環境變量文件。如果在docker-compose -f FILE
中設置了 compose 文件,則env_file
中的文件路徑是相對於FILE
的相對路徑
env_file: .env # single value
env_file: # list
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
tips:
.env 文件格式:# Set Rails/Rack environment # '#'為注釋, # 空行會被忽略 RACK_ENV=development # 格式為 VAR=VAL
.env 文件中的環境變量無法在build過程中被顯示讀取,只會被docker-compose.yaml文件讀取,如果需要在build時使用該環境變量,請在build后加args子參數。
對於指定多個.env文件的情況,官網的這句話賊復雜
Keep in mind that the order of files in the list is significant in determining the value assigned to a variable that shows up more than once.
---from https://docs.docker.com/compo...直譯過來是
請記住,列表中文件的順序對於確定分配給多次顯示的變量的值很重要。
因為對環境參數文件的處理是自上而下的,所以翻譯成人話就是,多個參數文件中包含同一個環境變量,以最后一個為准。
environment
添加環境變量
environment: # map
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment: # list
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
tips:
.env 文件中的環境變量無法在build過程中被顯示讀取,只會被docker-compose.yaml文件讀取,如果需要在build時使用該環境變量,請在build后加args子參數。
次環境變量在構建鏡像時,可以被我們自身的代碼讀取到,例如:func getEnvInfo() string { rackEnv := os.Getenv("RACK_ENV") fmt.Println(rackEnv) } output: development
expose
暴露端口,但是僅限於服務之間的通信,暴露的是內部端口,類似Dockerfile的EXPOSE
指令
expose:
- "3000"
- "8000"
external_links
連接服務
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
tips:
官方推薦使用network
extra_hosts
添加自定義域名,同--add-host
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
也可以在容器內的/etc/hosts
文件內寫入
162.242.195.82 somehost
50.31.209.229 otherhost
healthcheck
同Dockerfile中的HEALTHCHECK
指令
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
使用disabel: true
,相當於test: ["NONE"]
healthcheck:
disable: true
image
指定需要拉取或使用的鏡像,也可以使用倉庫/標簽
或部分鏡像ID
image: redis # 默認標簽 latest
image: ubuntu:18.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
init
在容器內運行一個初始化程序,以轉發信號開獲取進程。
version: "3.8"
services:
web:
image: alpine:latest
init: true
tips:
使用的默認初始化二進制文件是Tini,並安裝在/usr/libexec/docker-init守護程序主機上。您可以通過init-path配置選項將守護程序配置為使用自定義init二進制文件 。
isolation
指定容器隔離技術,Linux只支持default
,windows支持default``process
hyperv
三個值,具體參考 Docker Engine Docs
labels
同Dockerfile中的LABEL
指令,為容器設定metadata
build:
context: .
labels: # map
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
build:
context: .
labels: # list
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
links
舊版的功能,不推薦使用
logging
為當前服務設置日至參數
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver
參數同--log-driver
指令
driver: "json-file"
driver: "syslog"
driver: "none"
tips:
只有使用json-file
和journald
時,docker-compose up
和docker-compose logs
才能看到日志,其他任何的驅動都無法看到日志打印。
指定日志設置,同docker run --log-opt
.格式為k-v結構
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
默認的日志驅動是json-file
,可以設置存儲限制
options:
max-size: "200k" # 單文件最大存儲
max-file: "10" # 文件最大數量
tips:
上述的option
參數僅為json-file
日志驅動支持的參數,不同驅動支持的參數各不相同,具體參照下表。
支持的驅動列表
Driver | Description |
---|---|
none | 不輸出日志。 |
local | 日志以自定義格式存儲,旨在最大程度地減少開銷。 |
json-file | 日志以自定義格式存儲,旨在最大程度地減少開銷。 |
syslog | 將日志消息寫入syslog設施。該syslog守護程序必須在主機上運行。 |
journald | 將日志消息寫入journald。該journald守護程序必須在主機上運行。 |
gelf | 將日志消息寫入Graylog擴展日志格式(GELF)端點,例如Graylog或Logstash。 |
fluentd | 將日志消息寫入fluentd(向前輸入)。該fluentd守護程序必須在主機上運行。 |
awslogs | 將日志消息寫入Amazon CloudWatch Logs。 |
splunk | 將日志消息寫入到splunk使用HTTP Event Collector。 |
etwlogs | 將日志消息寫為Windows事件跟蹤(ETW)事件。僅在Windows平台上可用。 |
gcplogs | 將日志消息寫入Google Cloud Platform(GCP)日志記錄。 |
logentries | 將日志消息寫入Rapid7 Logentries。 |
tips:
具體請參考 Configure logging drivers
ports
對外暴露端口
short syntax:
要么指定兩個端口HOST:CONTAINER
,要么僅指定容器端口(選擇了臨時主機端口)。
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
- "12400-12500:1240"
tips:
當以HOST:CONTAINER
格式映射端口時,使用低於60的容器端口可能會報錯,因為YAML會將格式xx:yy
中的數字解析為以60進制的數(可以理解為時間)。因此建議始終將端口映射顯式指定為字符串。
long syntax
長語法允許出現短語法不允許出現的字段
- target:容器內的端口
- published:公開暴露端口
- protocol:端口協議(tcp或udp)
- mode:
host
用於在每個節點上發布主機端口,或ingress
使群集模式端口達到負載平衡。
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
restart
容器重啟策略
restart: "no" # 失敗不重啟
restart: always # 失敗后總是重啟
restart: on-failure # 錯誤碼為 on-failure 時才重啟
restart: unless-stopped # 手動停止后不重啟
secrets(待補充)
volumes
用來掛載數據卷
short syntax
短語法使用最簡單的格式[SOURCE:]TARGET[:MODE]
SOURCE
可以是宿主機地址,也可以是數據卷名。TARGET
是容器內路徑。MODE
包括ro
forread-only
和rw
forread-write
(默認)
如果使用宿主機的相對路徑,則以docker-compose.yaml
為基礎進行拓展。
volumes:
# 指定容器內路徑,docker 自動創建路徑
- /var/lib/mysql
# 掛載絕對路徑
- /opt/data:/var/lib/mysql
# 掛載相對路徑
- ./cache:/tmp/cache
# 用戶目錄相對路徑
- ~/configs:/etc/configs/:ro
# 命名掛載
- datavolume:/var/lib/mysql
long syntax
長語法允許使用短語法無法表達的字段
type
: 安裝類型,bind
,tmpfs
或者npipe
source
: 掛載源,可以是宿主機路徑,也可以是頂級掛載設置中設置好的卷名。tmpfs不適用於掛載target
: 容器內掛載路徑read_only
: 設置掛載路徑只讀bind
: 配置額外的綁定設置propagation
: 用於設置綁定的傳播模式
volume
: 配置額外的掛載配置nocopy
: 創建卷時禁用從容器復制數據標識位
tmpfs
: 配置額外的tmpfs配置size
: 設置掛載tmpfs的大小(字節)
consistency
: 裝載的一致性要求,consistent (主機和容器具有相同的視圖),cached(讀緩存,主機視圖具有權威性)或delegated(讀寫緩存,容器的視圖具有權威性)之一
version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
volumes:
mydata:
案例:使用docker-compose部署WordPress項目
官方文檔:https://docs.docker.com/compose/wordpress/
創建一個項目目錄
如:命名目錄my_wordpress
:
#創建目錄
mkdir my_wordpress
#進入目錄
cd my_wordpress/
創建yaml文件
創建一個docker-compose.yml
文件來啟動您的 WordPress
博客,文件內容如下:
#指定yaml版本
version: '3.3'
#配置服務
services:
#創建一個db服務
db:
#使用mysql:5.7的鏡像創建
image: mysql:5.7
#容器卷
#可以將主機路徑安裝為單個服務的定義的一部分,而無需在頂級volumes密鑰中進行定義
#但是,如果要在多個服務之間重用卷,請在頂級volumes定義
volumes:
- db_data:/var/lib/mysql
#指定容器重啟策略,當always指定時,容器總是重新啟動
restart: always
#添加環境變量
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
#創建一個wordpress服務
wordpress:
#指定依賴db服務,會先啟動db
depends_on:
- db
#使用wordpress:latest鏡像構建
image: wordpress:latest
#指定暴露端口 宿主機端口:容器端口
ports:
- "8000:80"
#指定容器重啟策略,當always指定時,容器總是重新啟動
restart: always
#添加環境變量
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
#容器卷配置
volumes:
#在第一次調用時docker-compose up,將創建該卷。在隨后的服務調用中將重用相同的卷
db_data: {}
注意事項:
- Docker卷
db_data
將WordPress所做的所有更新持久化到數據庫。了解有關Docker卷的更多信息 - WordPress Multisite僅適用於port
80
和443
。
啟動項目
前台啟動
docker-compose up
后台啟動
docker-compose up -d
訪問測試
ip:8000
關機和清理
該命令docker-compose down
將刪除容器和默認網絡,但會保留WordPress數據庫。
docker-compose down
該命令docker-compose down --volumes
將刪除容器,默認網絡和WordPress數據庫。
docker-compose down --volumes