[轉帖]docker-compose

docker-compose

https://www.cnblogs.com/embedded-linux/p/10714179.html

須要學習使用一下. 

改天本身再改改用過的yaml文件. 

 

 

docker-compose用於定義和運行多個docker容器。採用YAML文件配置應用服務,可從配置文件啓動相關服務,一條命令能夠啓動多個容器。html

docker-compose應用

compose將所管理的容器分爲三層:工程(project)、服務(service)、容器(container)。compose運行目錄下的全部文件組成一個工程,一個工程包含多個服務,每一個服務中定義了容器運行的鏡像、參數、依賴,一個服務可包含多個容器實例。node

應用compose通常分爲3步:mysql

  1. 用Dockerfile定義app環境,使app能夠在任何地方reproducedlinux

  2. 用docker-compose.yml定義services,使相關services在隔離環境下一塊兒運行。nginx

  3. docker-compose up,啓動compose和整個appsgit

一個docker-compose.yml示例以下:github

複製代碼
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes: logvolume01: {}
複製代碼

compose特性:web

  1. 單主機上隔離環境,compose工程間相互獨立。用命令行選項-p或COMPOSE_PROJECT環境變量定義工程名。redis

  2. 容器建立時保留volume上數據。sql

  3. 僅僅在容器改變時再建立容器。compose緩存了配置,restart時compose re-use存在的未改變的容器。

  4. compose file支持變量,能夠經過變量爲不一樣環境定製composition

docker-compose安裝

目前docker-compose能夠安裝到macOS,Windows和64-bit Linux系統下。

linux下鏡像位於 Compose repository release page on GitHub,安裝方法以下:

sudo curl -L"https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.24.0, build 1110ad01

若要安裝其餘版本能夠修改版本號1.24.0

或pip安裝:

pip install docker-compose

卸載compose

sudo rm /usr/local/bin/docker-compose

或pip卸載(加入compose用pip安裝的話):

pip uninstall docker-compose

docker-compse命令行

複製代碼
Define and run multi-container applications with Docker.


Usage:

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

docker-compose -h|--help


Options:

-f, --file FILE Specify an alternate compose file (default: docker-compose.yml),env:COMPOSE_FILE

-p, --project-name NAME Specify an alternate project name (default: directory name),env:COMPOSE_PROJECT_NAME

--verbose Show more output

--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)

--no-ansi Do not print ANSI control characters

-v, --version Print version and exit

-H, --host HOST Daemon socket to connect to


--tls Use TLS; implied by --tlsverify

--tlscacert CA_PATH Trust certs signed only by this CA

--tlscert CLIENT_CERT_PATH Path to TLS certificate file

--tlskey TLS_KEY_PATH Path to TLS key file

--tlsverify Use TLS and verify the remote

--skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate

--project-directory PATH Specify an alternate working directory (default: the path of the Compose file)

--compatibility If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent


Commands:

build Build or rebuild services

bundle Generate a Docker bundle from the Compose file

config Validate and view the Compose file

create Create services

down Stop and remove containers, networks, images, and volumes

events Receive real time events from containers

exec Execute a command in a running container

help Get help on a command

images List images

kill Kill containers

logs View output from containers

pause Pause services

port Print the public port for a port binding

ps List containers

pull Pull service images

push Push service images

restart Restart services

rm Remove stopped containers

run Run a one-off command

scale Set number of containers for a service

start Start services

stop Stop services

top Display the running processes

unpause Unpause services

up Create and start containers

version Show the Docker-Compose version information
複製代碼

最經常使用的命令是docker-compose updocker-compose up -d(後臺運行)。

docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml up -d consul

up/run/start區別:

docker-compose up用於start或restart全部定義在docker-compose.yml內的服務。

docker-compose run用於一次性或臨時的任務,相似docker run -it(打開交互終端執行命令後退出並返回容器的退出狀態)。

docker-compose start用於restart原來建立但中止的容器,毫不會建立新容器。

logs:日誌輸出信息

--no-color 單色輸出,不顯示其餘顏.
-f, --follow 跟蹤日誌輸出,就是能夠實時查看日誌
-t, --timestamps 顯示時間戳
--tail 從日誌的結尾顯示,--tail=200

更新容器

當服務的配置發生更改時,可以使用docker-compose up命令更新配置。此時,compose會刪除舊容器並建立新容器,新容器會以不一樣的IP地址加入網絡,名稱保持不變,任何指向舊容器的鏈接都會被關閉,從新找到新容器並鏈接上去。

compose file

compose配置文件的格式有多個版本:1,2,2.x和3.x,不一樣docker版本對應不一樣版本compose file。Compose file是YAML文件,用於定義services、networks和volumes,默認爲./docker-compose.yml。詳細語法介紹可參考:Compose file version 3 reference

YAML(Yet Another Markup Language),是一個JSON的超集,意味着任何有效JSON文件也都是一個YAML文件。它規則以下:

1)大小寫敏感

2)使用縮進表示層級關係,但不支持tab縮進,只支持空格

3)縮進的數量不重要但至少一個空格,只要相同層級使用相同數量的空格便可

4)「#」表示註釋,從這個字符開始,直到行末,都會被解析器無視

compose的YAML只使用兩種類型:Maps和Lists,Maps的子項能夠是Lists,Lists的子項也能夠是Maps

Maps:就是一個字典,即key:value的鍵值對。

image: postgres

Lists:就是一個列表。

ports:
  - "8000"
  - "8080"
  - "8090"

咱們能夠看到,能夠有任何數量的項在列表中,項的定義以破折號(-)開頭,而且和父元素之間存在縮進。

版本3的compose file示例以下:

複製代碼
version: "3"
services:
 
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    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
    deploy:
      placement:
        constraints: [node.role == manager]
 
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
 
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]
 
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  frontend:
  backend:
 
volumes:
  db-data:
複製代碼

一個標準配置文件應該包含versionservicesnetworksvolumes四大部分,處於top層。其餘包含的子項(sub-options)要相應縮進。

docker-compose.yml定義的每一個服務都必須經過image指定指定鏡像或build指令(須要Dockerfile)來自動構建。Dockerfile指定的選項,默認狀況下會被compose自動獲取不須要在compose文件中指定。

》version:指定docker-compose.yml文件的寫法格式(版本)

》services:多個容器的集合

》image:指定服務的鏡像名稱或鏡像ID。若是鏡像在本地不存在,compose會嘗試拉取這個鏡像。

services:
  web:
    image: nginx

在 services 標籤下的第二級標籤是 web,這個名字是用戶本身自定義,它就是服務名稱。

》build:配置構建時,compose會利用它來自動構建鏡像,該值能夠是一個路徑,也能夠是一個對象,用於指定Dockfile參數。

複製代碼
build: ./dir
---------------
build:
  context: ./dir
  dockerfile: Dockerfile
  args:
    buildno: 1
複製代碼

depends_on:容器依賴,解決啓動前後順序問題。

command:覆蓋容器啓動後默認執行的命令,能夠是一個列表

command: bundle exec thin -p 3000
----------------------------------
command: [「bundle」,」exec」,」thin」,」-p」,」3000」]

dns:配置 dns 服務器,能夠是一個值或列表

dns: 8.8.8.8
------------
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search:配置 DNS 搜索域,能夠是一個值或列表

dns_search: example.com
------------------------
dns_search:
  - dc1.example.com
  - dc2.example.com

environment:環境變量配置,能夠用數組或字典兩種方式

複製代碼
environment:
  RACK_ENV: development
  SHOW: 'ture'
-------------------------
environment:
  - RACK_ENV=development
  - SHOW=ture
複製代碼

env_file:從文件中獲取環境變量,能夠指定一個文件路徑或路徑列表,其優先級低於 environment 指定的環境變量

env_file: .env
---------------
env_file:
  - ./common.env

expose:暴露端口,只將端口暴露給鏈接的服務,而不暴露給主機

expose:
  - "3000"
  - "8000"

network:分爲兩部分Top-level networks keyService-level networks key。Service-level:Networks to join, referencing entries under the top-level networks key.

    By default Compose sets up a single network for your app. Each container for a service joins the default network and

    is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.

    在容器建立時會建立相應的網絡,容器建立後加入相應的網絡,即此網絡下可訪問到該容器。

Here’s an example Compose file defining two custom networks. The proxy service is isolated from the db service,

because they do not share a network in common - only app can talk to both.

複製代碼
version: "3"
services:

  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
複製代碼

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

network_mode:設置網絡模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

ports:對外暴露的端口定義,和 expose 對應,使用host:container格式或者只指定容器端口,宿主機會隨機映射端口。建議使用字符串格式,數字有時會解析錯誤。

ports: # 暴露端口信息 - "宿主機端口:容器暴露端口"
  - "8763:8763"
  - "8763:8763"

links:將指定容器鏈接到當前鏈接,能夠設置別名,避免ip方式致使的容器重啓動態改變的沒法鏈接狀況

links: # 指定服務名稱:別名

- docker-compose-eureka-server:compose-eureka

volumes:卷掛載路徑,掛載一個目錄或一個已經存在的數據卷容器,能夠直接使用host:container格式,或者host:container:ro,後者對於容器來講,數據卷是隻讀的,可有效保護宿主機的文件系統。compose能夠使用相對路徑。

複製代碼
volumes:

// 只是指定一個路徑,Docker 會自動在建立一個數據卷(這個路徑是容器內部的)。
  - /var/lib/mysql 

// 使用絕對路徑掛載數據卷
  - /opt/data:/var/lib/mysql 

// 以 Compose 配置文件爲中心的相對路徑做爲數據卷掛載到容器。
  - ./cache:/tmp/cache 

// 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro

// 已經存在的命名的數據卷。
  - datavolume:/var/lib/mysql
複製代碼

You can mount a host path as part of a definition for a single service, and there is no need to define it in the top level volumes key.單個容器使用不必定義頂層volume

But, if you want to reuse a volume across multiple services, then define a named volume in the top-level volumes key. 多個服務要共用volume時須要定義頂層volumes

Note: The top-level volumes key defines a named volume and references it from each service’s volumes list. 

 

參考:

  1. https://docs.docker.com/compose/ docker-compose官網文檔

  2. https://github.com/docker/compose

  3. https://docs.docker.com/compose/gettingstarted/ flask和redis示例

  4. https://docs.docker.com/get-started/part3/#your-first-docker-composeyml-file

  5. Compose file version 3 reference

  6. DockerDocker Compose 詳解 簡書

  7. Docker()----Docker-Compose 詳解

相關文章
相關標籤/搜索