DockerCompose簡述教程

Docker Compose 起源

使用 Docker 的時候,定義 Dockerfile 文件,然后使用docker builddocker run等命令操作容器。然而微服務架構的應用系統(tǒng)一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知

使用 Docker Compose 可以輕松、高效的管理容器,它是一個用于定義和運行多容器 Docker 的應用程序工具

Docker Compose 簡介

Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose不再需要使用shell腳本來啟動容器。
Compose 通過一個配置文件來管理多個Docker容器,在配置文件中,所有的容器通過services來定義,然后使用docker-compose腳本來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發(fā)的場景。

Docker Compose 安裝

Github安裝

下載:

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

添加執(zhí)行權限:

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

檢查安裝是否成功:

docker-compose --version 
docker componse 版本

pip 安裝

sudo pip install docker-compose

Compose 文件

Compose文件是一個定義服務,網(wǎng)絡和卷的YAML文件。 Compose文件的默認文件名為docker-compose.yml.yml.yaml擴展名均可)。

與docker運行一樣,默認情況下,Dockerfile中指定的選項(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,你不需要在docker-compose.yml中再次指定它們。

Docker Compse 文件示例

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:

Docker Compose 語法

build

指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像。

build: /path/to/build/dir

還可以攜帶args參數(shù)

version: '2'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

webapp服務將會通過./dir目錄下的Dockerfile-alternate文件構建容器鏡像。
如果你同時指定image和build,則compose會通過build指定的目錄構建容器鏡像,而構建的鏡像名為image中指定的鏡像名和標簽。

image

指定啟動容器的鏡像,可以是鏡像倉庫/標簽或者鏡像id(或者id的前一部分)

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果鏡像不存在,Compose將嘗試從官方鏡像倉庫將其pull下來,如果你還指定了build,在這種情況下,它將使用指定的build選項構建它,并使用image指定的名字和標記對其進行標記。

container_name

指定一個自定義容器名稱,而不是生成的默認名稱。

container_name: my-web-container

由于Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無法將服務擴展到多個容器。

volumes

卷掛載路徑設置??梢栽O置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro),掛載數(shù)據(jù)卷的默認權限是讀寫(rw),可以通過ro指定為只讀。
你可以在主機上掛載相對路徑,該路徑將相對于當前正在使用的Compose配置文件的目錄進行擴展。 相對路徑應始終以 . 或者..開始。

volumes:
  # 只需指定一個路徑,讓引擎創(chuàng)建一個卷
  - /var/lib/mysql
 
  # 指定絕對路徑映射
  - /opt/data:/var/lib/mysql
 
  # 相對于當前compose文件的相對路徑
  - ./cache:/tmp/cache
 
  # 用戶家目錄相對路徑
  - ~/configs:/etc/configs/:ro
 
  # 命名卷
  - datavolume:/var/lib/mysql

command

覆蓋容器啟動后默認執(zhí)行的命令。

command: bundle exec thin -p 3000

該命令也可以是一個類似于dockerfile的列表:

command: ["bundle", "exec", "thin", "-p", "3000"]

links

鏈接到另一個服務中的容器。 請指定服務名稱和鏈接別名(SERVICE:ALIAS),或者僅指定服務名稱。

web:
  links:
   - db
   - db:database
   - redis

在當前的web服務的容器中可以通過鏈接的db服務的別名database訪問db容器中的數(shù)據(jù)庫應用,如果沒有指定別名,則可直接使用服務名訪問。

鏈接不需要啟用服務進行通信 - 默認情況下,任何服務都可以以該服務的名稱到達任何其他服務。 (實際是通過設置/etc/hosts的域名解析,從而實現(xiàn)容器間的通信。故可以像在應用中使用localhost一樣使用服務的別名鏈接其他容器的服務,前提是多個服務容器在一個網(wǎng)絡中可路由聯(lián)通)

links也可以起到和depends_on相似的功能,即定義服務之間的依賴關系,從而確定服務啟動的順序。

external_links

鏈接到docker-compose.yml外部的容器,甚至并非 Compose 管理的容器。參數(shù)格式跟 links 類似。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

expose

暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內部端口為參數(shù)

expose:
 - "3000"
 - "8000"

ports

暴露端口信息。
常用的簡單格式:使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。

restart

no是默認的重啟策略,在任何情況下都不會重啟容器。 指定為always時,容器總是重新啟動。 如果退出代碼指示出現(xiàn)故障錯誤,則on-failure將重新啟動容器。

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

environment

添加環(huán)境變量。 你可以使用數(shù)組字典兩種形式。 任何布爾值:true,false,yes,no需要用引號括起來,以確保它們不被YML解析器轉換為TrueFalse。
只給定名稱的變量會自動獲取它在 Compose 主機上的值,可以用來防止泄露不必要的數(shù)據(jù)。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
 
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

pid

將PID模式設置為主機PID模式。 這就打開了容器與主機操作系統(tǒng)之間的共享PID地址空間。 使用此標志啟動的容器將能夠訪問和操作裸機的命名空間中的其他容器,反之亦然。即打開該選項的容器可以相互通過進程 ID 來訪問和操作。

pid: "host"

pid

將PID模式設置為主機PID模式。 這就打開了容器與主機操作系統(tǒng)之間的共享PID地址空間。 使用此標志啟動的容器將能夠訪問和操作裸機的命名空間中的其他容器,反之亦然。即打開該選項的容器可以相互通過進程 ID 來訪問和操作。

pid: "host"

net

設置網(wǎng)絡模式。使用和 docker client--net 參數(shù)一樣的值。

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

Docker Compose 命令

ps

列出所有運行容器

docker-compose ps

logs

查看服務日志輸出

docker-compose logs

port

打印綁定的公共端口,下面命令可以輸出eureka 服務 8761 端口所綁定的公共端口

docker-compose port eureka 8761

build

構建或者重新構建服務

docker-compose build

start

啟動指定服務已存在的容器

docker-compose start eureka

stop

停止已運行的服務的容器

docker-compose stop eureka

rm

刪除指定服務的容器

docker-compose rm eureka

up

構建、啟動容器

docker-compose up

kill

通過發(fā)送 SIGKILL 信號來停止指定服務的容器

docker-compose kill eureka

pull

下載服務鏡像

scale

設置指定服務運氣容器的個數(shù),以 service=num 形式指定

docker-compose scale user=3 movie=3

run

在一個服務上執(zhí)行一個命令

docker-compose run web bash
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容