iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
Elastic Stack on Cloud

親愛的,我把ElasticSearch上雲了系列 第 24

Day 24 Docker-Compose nginx + flask container with filebeat-2

Day 24 Docker-Compose nginx + flask container with filebeat-2

前言

昨天我們步驟講到一半,提到透過兩個container,也就是flask以及nginx,接著同樣設定volume將nginx log往外拋,並且在本機透過filebeat去蒐集log並進行上傳。今天我們基於昨天的步驟,以及設定檔,詳細講解如何運作,以及nginx log的一些測試。

資料夾架構及說明

首先我們先檢視一下這個專案,整體資料夾及檔案的架構:

│  docker-compose.yml
│
├─filebeat
├─flask
│      Dockerfile
│      main.py
│      requirements.txt
│      wsgi.ini
│
├─nginx
│      Dockerfile
│      nginx.conf
│
└─nginx-logs
        access.log
        error.log

可以看到,最外層包含四個資料夾,分別是flask, nginx, filebeat, nginx-logs,以及一個檔案 docker-compose.yml

首先這四個資料夾,分別是這次我們會用到的兩個服務:flask、nginx的container folder,另外還有明天會講解到開啟filebeat container的部分,以及蒐集log往外拋的連接volume資料夾nginx-logs

docker-compose.yml檔案則是docker-compose設定不同container的設定檔,昨天講到裡面會包含不同container的設定,以及之間的交互關係。

  • 這裡可以想像就好像把我們第一天run一個container時下的docker run指令,透過設定的方式寫下來,且一次可以設定多個

docker-compose.yml


services:

  flask:
    build: ./flask
    container_name: template_flask
    # restart: always
    environment:
      - APP_NAME=FlaskApp
    expose:
      - 8080


  nginx:
    build: ./nginx
    volumes:
      - "/c/Users/user/flask-nginx-elk-demo/nginx-logs:/var/log/nginx"
    container_name: template_nginx
    # restart: always
    ports:
      - "80:80"

    depends_on:
      - flask

可以看到nginx的container必須depends_on flask,這代表我們會先啟動flask的container,再啟動nginx的container。

其中flask資料夾中需要的東西如下:

DockerFile

FROM python:3.7.2-stretch
WORKDIR /app
ADD . /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD ["uwsgi", "wsgi.ini"]

main.py

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

requirements.txt

Flask==1.1.1
Flask-Cors==3.0.8
uWSGI==2.0.18

wsgi.ini

[uwsgi]
wsgi-file = main.py
callable = app
socket = :8080
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

這邊簡單講解一下每個用途,首先DockerFile當然是建構flask container的主要流程,主要就是透過python的image去啟動,並且先進入app/ folder,將本機上面這些檔案複製上去,並且install 必要的package,接著就透過uwsgi去啟動服務。

因此後面三個,main.py就是flask主程式;requirements.txt就是需要套件;wsgi.ini就是uwsgi的設定,像是我們將socker設8080,並且將socket的權限開放,以及對照到flask的主程式等等。

所以這邊這個container起起來後,就會是uwsgi啟動flask服務的狀態。


接著我們討論到另一個nginx,裡面架構更簡單,主要就是DockerFile以及一個nginx的設定檔,如下:

DockerFile

# Use the Nginx image
FROM nginx

# Remove the default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

# Replace with our own nginx.conf
COPY nginx.conf /etc/nginx/conf.d/

nginx.conf

server {
    listen 80;
    # server_name 0.0.0.0; 
    location / {
        include uwsgi_params;
        uwsgi_pass flask:8080;
    }
}

這邊昨天大致上有提到,其實就是把設定檔蓋過去,這邊也可以看到我們nginx conf中,關於uwsgi_pass的設定,就是flask的8080port,並且對外透過80 port出去。


將這些東西都準備好後,其實就是在最外層目錄,docker-compose.yml同層下,輸入docker-compose up

第一次你會看到他會分別建構這兩個container,運作好以後就會進入Listen狀態,如此一來就成功啟動這兩者。

而你可以同樣拜訪127.0.0.1(docker tool box:192.168.99.100),就會看到頁面是剛剛flask設定的endpoint,return回Hello!

接著檢視log資料夾,也會看到有log進去了!

而這時候搭配先前提到的filebeat監聽,就可以有效地蒐集了。

後記

今天大致上我們將這個流程操作起來,明天我們會提到,如何去測試nginx log,以及在同時在docker-compose下,將filebeat起起來,可以先想一下,這樣的差別跟我們把filebeat架在本機端有什麼差別?


上一篇
Day 23 Docker-Compose nginx + flask container with filebeat
下一篇
Day 25 Docker-Compose nginx + flask container with filebeat-3
系列文
親愛的,我把ElasticSearch上雲了30

尚未有邦友留言

立即登入留言