docker compose 的使用


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:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  3. Run docker-compose up and Compose starts and runs your entire app.

大概意思:

Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可以使用YAML文件來配置應用程序的服務。然后,只需要一個命令,就可以從配置中創建並啟動所有服務。要了解關於Compose的所有特性的更多信息,請參見特性列表

組合工作在所有環境中:生產、階段、開發、測試以及CI工作流。您可以在常見用例中了解有關每個案例的更多信息。

使用Compose基本上有三個步驟:

  1. 用Dockerfile定義你的應用環境,這樣它就可以在任何地方復制。

  2. 在docker-compose中定義組成應用程序的服務。這樣它們就可以在一個孤立的環境中一起運行。

  3. 運行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/目錄,我們進該目錄看下

image-20210111095537523

可以看到已經下載成功

授權

給程序授予可執行權限

sudo chmod +x /usr/local/bin/docker-compose

測試是否安裝成功

docker-compose version

image-20210111100515723

快速體驗

參考:https://docs.docker.com/compose/gettingstarted/

這是官方提供的一個入門例子

就是python 使用falask框架,數據庫使用redis的一個計數器

前提條件要已經安裝了docker和docker compose

好,我們現在跑一下官方的測試,體驗一下

1.創建一個目錄

$ mkdir composetest
$ cd composetest

2.創建一個app.py的應用

創建app.py文件,文件寫入下面的內容

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文件定義了兩個服務:webredis

網絡服務

web服務使用從Dockerfile當前目錄中構建的映像。然后,它將容器和主機綁定到暴露的端口5000。此示例服務使用Flask Web服務器的默認端口5000

Redis服務

redis服務使用 從Docker Hub注冊表中提取的公共Redis映像。

6.啟動服務

在項目目錄中,運行

docker-compose up

啟動完成

image-20210111141409332

關於版本的問題

這一步按照官網粘貼,有可能會出現版本不一致的情況,如:

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 the version key and place your service definitions at the root of the file to use version 1.

image-20210111103531451

解決辦法

重新下載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.瀏覽器測試訪問

image-20210111141548262

到此體驗項目運行完畢,你會發現我們沒有用任何拉取鏡像,構建鏡像,啟動容器的命令,一個命令就把項目跑起來了,這就是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時的參數

模塊介紹

Docker Compose官方文檔

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搜索域名

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:
  - 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"

舊版的功能,不推薦使用

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-filejournald時,docker-compose updocker-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包括rofor read-onlyrw for read-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-compose up

image-20210112111042684

后台啟動

docker-compose up -d

image-20210112111224374

訪問測試

ip:8000

image-20210112111151772

關機和清理

該命令docker-compose down將刪除容器和默認網絡,但會保留WordPress數據庫。

docker-compose down

該命令docker-compose down --volumes將刪除容器,默認網絡和WordPress數據庫。

docker-compose down --volumes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM