1. 程式人生 > >(七):docker-compose

(七):docker-compose

簡介

  • Compose 用來定義和執行多個容器的 Docker 應用程式。在 Compose 中你可以使用 YAML 檔案來配置你的應用服務。然後,只需要一個簡單的命令,就可以建立並啟動你配置的所有服務。

  • 使用Compose 基本上分為三步:

  • 1.Dockerfile 定義應用的執行環境 (前面已經介紹過)。

  • 2.docker-compose.yml 定義組成應用的各服務

  • 3.docker-compose up 啟動整個應用

  • 注意:docker-compose是非叢集多個應用管理方式,即只部署在一臺宿主機上。

  • 部署在叢集上,請使用docker stack,使用類似。

compose安裝

安裝地址參考

1.下載compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.設定可執行許可權

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

3.安裝bash命令tab補充

  • 安裝指令碼到/etc/bash_completion.d/
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

  • 某些系統無法自動補全,需要做些額外處理
## 在~/.bashrc 末尾新增
. /etc/bash_completion.d/docker-compose

source ~/.bashrc 

4.版本檢視

$ docker-compose --version
docker-compose version 1.22.0, build 1719ceb

5.解除安裝

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

compose配置說明

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

配置選項

bulid

  • 服務除了可以基於指定的映象,還可以基於一份 Dockerfile,指定 Dockerfile 所在資料夾的路徑。 build: 可以是相對路徑,或者結合context的相對路徑。
build:
  context: ../
  dockerfile: path/of/Dockerfile

image

  • 指定映象
## service_name:服務名稱。
## image:映象名稱或映象 ID。
services:
  service_name:
    image: ubuntu:14.04

args

  • 給容器傳遞引數

  • Dockerfile 中新增引數

ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
  • compose設定引數值
build:
  context: .
  args:
    buildno: 1
    gitcommithash: cdc3b19

build:
  context: .
  args:
    - buildno=1
    - gitcommithash=cdc3b19
  • 不設定值,自動生成
args:
  - buildno
  - gitcommithash

command

  • 覆蓋預設命令
command: bundle exec thin -p 3000
或者
command: ["bundle", "exec", "thin", "-p", "3000"]

depends_on

  • 配置容器依賴。更多參考https://docs.docker.com/compose/compose-file/#depends_on

  • 例如下面容器會先啟動 redis 和 db 兩個服務,最後才啟動 web 服務:

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
  • 注意的是,預設情況下使用 docker-compose up web 這樣的方式啟動 web 服務時,也會啟動 redis 和 db 兩個服務,因為在配置檔案中定義了依賴關係。

pid

  • 將PID模式設定為主機PID模式,跟主機系統共享程序名稱空間。容器使用這個標籤將能夠訪問和操縱其他容器和宿主機的名稱空間。
pid: "host"

ports

  • 對映埠。
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"
  • 注意:當使用HOST:CONTAINER格式來對映埠時,如果你使用的容器埠小於60你可能會得到錯誤得結果,因為YAML將會解析xx:yy這種數字格式為60進位制。所以建議採用字串格式。

extra_hosts

  • 新增主機名的標籤,就是往/etc/hosts檔案中新增一些記錄,與Docker client的–add-host類似:
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
 
## 啟動之後檢視容器內部hosts:
162.242.195.82  somehost
50.31.209.229   otherhost

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
  • 如果你不使用宿主機的路徑,你可以指定一個volume_driver。
volume_driver: mydriver

compose常用命令

命令提示

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 up -d nginx

登入容器

docker-compose exec nginx bash

停止並且刪除所有容器、映象、掛載、映象

docker-compose down

顯示所有容器

docker-compose ps

重新啟動容器

docker-compose restart nginx

暫停容器

docker-compose pause nginx

恢復容器

docker-compose unpause nginx

刪除容器(刪除前必須關閉容器)

docker-compose rm nginx

停止容器

docker-compose stop nginx

啟動容器

docker-compose start nginx

不啟動依賴容器並且執行後刪除容器

docker-compose run --no-deps --rm web python manage.py db upgrade

構建映象

docker-compose build nginx

## 不帶快取的構建。
docker-compose build --no-cache nginx   

檢視日誌

docker-compose logs  nginx                    

## 檢視實時日誌
docker-compose logs -f nginx

驗證(docker-compose.yml)檔案配置

docker-compose config  -q

以json的形式輸出docker日誌

docker-compose events --json nginx

stack常用命令

[[email protected] harbor]# docker stack --help

Usage:  docker stack COMMAND

Manage Docker stacks

Options:


Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.
  • 樣例:
## 建立服務
docker stack deploy -c /usr/local/portainer/portainer-agent-stack.yml portainer

## 刪除服務
docker stack rm portainer