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


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

1Docker Compose 概述

  Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可以使用Compose文件來配置應用程序的服務。然后,使用單個命令,您可以從配置中創建並啟動所有服務。

  Compose非常適合開發,測試和登台環境以及CI工作流程。

 

1)官方文檔

 

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

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

 

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

version: '2'

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

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

 

4Compose具有管理應用程序整個生命周期的命令:

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

 

2Docker Compose 安裝

2.1 安裝條件

1)前提

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

  要以非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

 


免責聲明!

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



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