Docker系列10—容器編排工具Docker Compose詳解

本文收錄在容器技術學習系列文章總目錄html

1Docker Compose 概述

  Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可使用Compose文件來配置應用程序的服務。而後,使用單個命令,您能夠從配置中建立並啓動全部服務。python

  Compose很是適合開發,測試和登臺環境以及CI工做流程。linux

 

1)官方文檔git

 

2)使用Compose基本上是一個三步過程github

  •  定義您的應用程序環境,Dockerfile以即可以在任何地方進行復制。
  •  定義構成應用程序的服務,docker-compose.yml以便它們能夠在隔離環境中一塊兒運行。
  •  最後,運行docker-compose upCompose將啓動並運行整個應用程序。

 

3)一個 docker-compose.yml 文件案例:web

version: '2'

services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis

有關Compose文件的詳細信息,請參閱 Compose文件參考redis

 

4Compose具備管理應用程序整個生命週期的命令:docker

  •  啓動,中止和重建服務
  •  查看正在運行的服務的狀態
  •  流式傳輸運行服務的日誌輸出
  •  在服務上運行一次性命令

 

2Docker Compose 安裝

2.1 安裝條件

1)前提flask

  Docker Compose 依靠Docker Engine 進行任何有意義的工做,所以請確保您已在本地或遠程安裝Docker Engine,具體取決於您的設置。vim

  要以非root用戶身份運行Compose,請參閱以非root用戶身份管理Docker

 

2)安裝系統(主要講linuxpip安裝)

  •  Linux
  •  Mac
  •  Windows
  •  備用安裝選項(使用pip安裝/安裝爲容器)

 

2.2 Linux系統上安裝Compose

1)下載安裝

gitlab https://github.com/docker/compose/releases 上查詢適合本身的版本

我這裏下載的是1.23.2 版本

$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

 

2)添加執行權限

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

  

3)安裝完成,查詢版本

$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01

  

2.3 備用安裝選項(使用pip安裝/安裝爲容器)

2.3.1 使用pip安裝

  可使用pypi安裝Compose pip。若是你安裝使用pip,咱們建議你使用 virtualenv由於許多操做系統都有python系統包與docker-compose依賴項衝突。請參閱virtualenv教程以開始使用。

$ pip install docker-compose

若是你沒有使用virtualenv

$ sudo pip install docker-compose

注:須要6.0或更高版本的pip

 

2.3.2 安裝爲容器

  Compose也能夠在一個容器內運行,來自一個小的bash腳本包裝器。要將compose安裝爲容器,請運行此命令。若是此示例已過時,請務必將版本號替換爲所需的版本號:

$ sudo curl -L --fail https://github.com/docker/compose/releases/download/{{site.compose_version}}/run.sh -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

  

2.4 其餘系統安裝(略)

2.4.1 macOS上安裝Compose

  Docker Desktop for MacDocker Toolbox已經包含Compose和其餘Docker應用程序,所以Mac用戶無需單獨安裝ComposeDocker安裝說明以下:

 

2.4.2 Windows系統上安裝Compose

  Docker Desktop for WindowsDocker Toolbox已經包含Compose和其餘Docker應用程序,所以大多數Windows用戶不須要單獨安裝ComposeDocker安裝說明以下:

  若是您直接在Microsoft Windows Server 2016上運行Docker守護程序和客戶端(使用適用於Windows Server 2016Docker EE,則須要安裝Docker Compose。爲此,請按照下列步驟操做

 

2.5 Docker Compose 升級

  若是從Compose 1.2或更早版本升級,請在升級Compose後刪除或遷移現有容器。這是由於,從版本1.3開始,Compose使用Docker標籤來跟蹤容器,而且須要從新建立容器以添加標籤。

  若是Compose檢測到沒有標籤建立的容器,它將拒絕運行,所以您最終不會使用兩組。若是要繼續使用現有容器(例如,由於它們具備要保留的數據卷),可使用Compose 1.5.x使用如下命令遷移它們:

docker-compose migrate-to-labels

或者,若是您不擔憂保留它們,能夠將它們刪除。撰寫只是建立新的。

docker container rm -f -v myapp_web_1 myapp_db_1 ...

 

2.6 Docker Compose 卸載

正常系統安裝卸載:

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

pip安裝卸載:

pip uninstall docker-compose

 

3、一個完整的Docker Compose 運用演示

3.1 compose 準備

1)建立compose 工做目錄

[root@along ~]# mkdir composetest
[root@along ~]# cd composetest/

  

2)建立一個app.py文件,後面在項目目錄中調用文件

[root@along composetest]# vim 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)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

注:redis是應用程序網絡上redis容器的主機名。咱們使用Redis的默認端口6379

 

3)建立requirements.txt 項目目錄中調用的另外一個文件

[root@along composetest]# vim requirements.txt
flask
redis

  

3.2 建立Dockerfile,用於啓動一個簡單的容器

建立一個名爲的文件Dockerfile

[root@along composetest]# vim Dockerfile
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

注:從Python 3.4映像開始構建映像。詳細的dockerfile用法詳見:Docker系列07—Dockerfile 詳解

  •  將當前目錄添加./code映像中的路徑中。
  •  將工做目錄設置爲/code
  •  安裝Python依賴項。
  •  將容器的默認命令設置爲python app.py

 

3.3 Compose文件中定義服務

建立docker-compose.yml項目目錄中調用的文件

[root@along composetest]# vim docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Compose文件定義了兩個服務,webredis。該web服務:

  •  使用從Dockerfile當前目錄中構建的圖像。
  •  將容器上的公開端口5000轉發到主機上的端口5000。咱們使用Flask Web服務器的默認端口5000

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

 

3.4 使用Compose構建並運行您的應用程序

1)在項目目錄中,啓動應用程序 docker-compose up

[root@along composetest]# docker-compose up
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
redis_1  | 1:M 15 Jan 2019 07:03:23.108 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 15 Jan 2019 07:03:23.108 # Server initialized
redis_1  | 1:M 15 Jan 2019 07:03:23.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 15 Jan 2019 07:03:23.108 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1  | 1:M 15 Jan 2019 07:03:23.108 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 15 Jan 2019 07:03:23.108 * Ready to accept connections

  

2)瀏覽器查詢http://192.168.130.102:5000/,驗證

 

3)刷新頁面,數字應該增長

 

4)另開一個終端,查看鏡像驗證

[root@along harbor]# docker image ls
REPOSITORY                      TAG                 IMAGE ID            CREATED              SIZE
composetest_web                 latest              ca6d50ca9694        About a minute ago   77.2MB
redis                           alpine              b42dc832c855        3 weeks ago          40.9MB
python                          3.4-alpine          bb81744a76cf        3 weeks ago          65.8MB

 

5)關閉服務

在新開的終端docker-compose down,或者在啓動應用程序的原始終端中按CTRL + C來中止應用程序。

 

3.5 修改compose 配置,添加存儲卷

[root@along composetest]# vim docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"

注:新volumes密鑰將主機上的項目目錄(當前目錄)/code安裝到容器內,容許您動態修改代碼,而無需重建映像。

 

3.6 測試存儲卷

1)從新啓動compose

[root@along composetest]# docker-compose up
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
... ...

  

2)在宿主機的存儲捲上,修改代碼

[root@along composetest]# vim app.py
    return 'Hello World! I am along! I have been seen {} times.\n'.format(count)

Hello World! 郵件更改成Hello World! I am along!

 

3)再在瀏覽器刷新,驗證成功

 

3.7 docker-compose 其餘命令

1)在後臺運行服務,-d(用於分離模式)

[root@along composetest]# docker-compose up -d
Starting composetest_web_1   ... done
Starting composetest_redis_1 ... done

  

2)使用docker-compose ps以查看當前正在運行的內容

[root@along composetest]# docker-compose ps
       Name                      Command               State           Ports         
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
composetest_web_1     python app.py                    Up      0.0.0.0:5000->5000/tcp

  

3docker-compose run命令容許您爲服務運行一次性命令。例如,要查看web服務可用的環境變量 

[root@along composetest]# docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=3848578f8fff
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.9
PYTHON_PIP_VERSION=18.1
HOME=/root

  

4)中止服務

[root@along composetest]# docker-compose stop
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done

  

5)使用該down 命令徹底刪除容器。加--volumes 參數還能夠刪除Redis容器使用的數據卷

[root@along composetest]# docker-compose down --volumes
Removing composetest_web_run_18e4bbaa4b33 ... done
Removing composetest_web_1                ... done
Removing composetest_redis_1              ... done
Removing network composetest_default
相關文章
相關標籤/搜索