Compose初體驗

IT_狂奔者發表於2020-10-28

目錄

前提條件

定義應用程式依賴項

1、設定

1.1 準備工作

1.2 為專案建立目錄

1.3 在專案中建立一個名為 app.py 的檔案,內容如下

1.4 在專案目錄中建立另一個名為 requirements.txt 的檔案

2、建立

2.1 建立一個名為 Dockerfile 的檔案 

3、在撰寫檔案中定義服務

3.1 在專案目錄中建立一個名為docker-compose.yml 的檔案 

3.2 網路服務

4、生成和執行寫好的程式

4.1 執行 docker-compose up 指令來啟動應用程式

4.2 本地訪問 curl http//localhost:5000/ 以檢視應用程式是否正常執行


 

如下將構建一個執行在Docker Compose上的簡單Python Web應用程式;該應用程式使用Flask框架,並在Redis中維護一個計數器

前提條件

確保已經安裝了Docker Engine 和Docker Compose。您無需安裝Python或Redis,因為兩者均由Docker映像提供。

定義應用程式依賴項

1、設定

1.1 準備工作

# yum -y install pyhton-pip   //pip 是python 包管理工具
# yum -y install epel-release  //報錯執行

1.2 為專案建立目錄

# mkdir composetest
# cd composetest

1.3 在專案中建立一個名為 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)

在此示例中,redis是應用程式網路上的redis容器的主機名。為Redis使用預設埠6379

1.4 在專案目錄中建立另一個名為 requirements.txt 的檔案

flask
redis

2、建立

編寫一個構建Docker映像的Dockerfile。該影像包含Python應用程式所需的所有依賴關係,包括Python本身

2.1 建立一個名為 Dockerfile 的檔案 

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

過程說明:

  • 從Python 3.7映像開始構建映像。
  • 將工作目錄設定為/code。
  • 設定flask命令使用的環境變數。
  • 安裝gcc和其他依賴項
  • 複製requirements.txt並安裝Python依賴項。
  • 向影像新增後設資料以描述容器正在偵聽埠5000
  • 將.專案中的當前目錄複製到.映像中的工作目錄。
  • 將容器的預設命令設定為flask run。

3、在撰寫檔案中定義服務

3.1 在專案目錄中建立一個名為docker-compose.yml 的檔案 

version: "3.8"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

該Compose檔案定義了兩個服務:web和redis

3.2 網路服務

該web服務使用從Dockerfile當前目錄中構建的映像。然後,它將容器和主機繫結到暴露的埠5000。此示例服務使用Flask Web伺服器的預設埠5000。

4、生成和執行寫好的程式

4.1 執行 docker-compose up 指令來啟動應用程式

# docker-compose  up
Starting composetest_redis_1 ... done
Starting composetest_web_1   ... done
Attaching to composetest_web_1, composetest_redis_1
redis_1  | 1:C 28 Oct 2020 10:22:35.396 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 28 Oct 2020 10:22:35.396 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 28 Oct 2020 10:22:35.396 # 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 28 Oct 2020 10:22:35.403 * Running mode=standalone, port=6379.
redis_1  | 1:M 28 Oct 2020 10:22:35.403 # 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 28 Oct 2020 10:22:35.403 # Server initialized
redis_1  | 1:M 28 Oct 2020 10:22:35.403 # 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 28 Oct 2020 10:22:35.403 # 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 madvise > /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 (set to 'madvise' or 'never').
redis_1  | 1:M 28 Oct 2020 10:22:35.403 * Loading RDB produced by version 6.0.9
redis_1  | 1:M 28 Oct 2020 10:22:35.403 * RDB age 15 seconds
redis_1  | 1:M 28 Oct 2020 10:22:35.403 * RDB memory usage when created 0.79 Mb
redis_1  | 1:M 28 Oct 2020 10:22:35.404 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 28 Oct 2020 10:22:35.404 * Ready to accept connections
web_1    |  * Serving Flask app "app.py"
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

4.2 本地訪問 curl http//localhost:5000/ 以檢視應用程式是否正常執行

成功之後會看到前面python編寫的app.py檔案;每重新整理一次 列印 數字遞增的字串

# curl http://0.0.0.0:5000/
Hello World! I have been seen 4 times.