在 Kali Linux 安裝 docker 與 docker-compose ,並執行測試環境,以 Hello Flask 專案為例

by iok
2.2K 人次瀏覽

安裝 Docker 與 docker-compose 程式

Kali Linux 預設沒有安裝 docker 環境,需要手動安裝 docker 套件。

$ sudo apt install docker-compose docker.io

安裝完成後,如果希望使用者帳號可以操控 docker 指令,可以把使用者帳號加入 docker 群組。

$ sudo usermod -aG docker $USER.

該帳號登入再登入一次,讓 group 設定生效

範例專案: Hello Flask

這邊以一個 Hello Flask 專案做為範例,專案設定檔如下,設定 nginx 為前端 reverse proxy ,後端為 flask app 。因測試用途,flask 沒有使用 wsgi 伺服器。

├── app.py
├── docker-compose.yml
├── Dockerfile.flask
├── Dockerfile.nginx
├── nginx.conf
└── requirements.txt

docker-compose.yml 內容

version: '3.9'

services:
  flask:
    build:
      context: .
      dockerfile: Dockerfile.flask
    ports:
      - "5000:5000"
    networks:
      - mynetwork

  nginx:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    ports:
      - "8080:8080"
    networks:
      - mynetwork
    extra_hosts:
      - "host.docker.internal:172.17.0.1"

networks:
  mynetwork:
    driver: bridge

Dockerfile.flask

FROM python:3.10-slim
WORKDIR /app
COPY app.py /app/app.py COPY requirements.txt /app/requirements.txt RUN pip install –no-cache-dir -r requirements.txt

CMD [“python3”, “app.py”]

Dockerfile.nginx

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

nginx.conf,nginx 被設定為 reverse proxy ,並Listen Port 8080 ,將來自 Port 8080 的請求轉送至 Port 5000 (flask app)

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;
        server_name localhost;

        location / {
            proxy_pass http://host.docker.internal:5000;
            proxy_set_header Host $host;
        }
    }
}

app.py 內容,存取網站根目錄時,直接回應 Hello Flask 字串

from flask import Flask, Response

app = Flask(__name__)

@app.route('/', methods=['GET'])
def main():

    response = Response("Hello Flask")
    return response

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt

Flask==2.1.3
Werkzeug==2.0.3

執行docker-compose build,下載並編譯與設定執行環境

$ docker-compose build
Building flask
[+] Building 13.8s (10/10) FINISHED                                                                                                           docker:default
 => [internal] load build definition from Dockerfile.flask                                                                                              0.0s
 => => transferring dockerfile: 227B                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/python:3.10-slim                                                                                     3.5s
 => [internal] load .dockerignore                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                         0.0s
 => [1/5] FROM docker.io/library/python:3.10-slim@sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7                               5.0s
 => => resolve docker.io/library/python:3.10-slim@sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7                               0.0s
 => => sha256:5cc9686f2aa90263bd53a0ee75237af8b54c307b443c5185997aaab2bfa07f73 15.65MB / 15.65MB                                                        4.3s
 => => sha256:5d66a27e733ac4f56a6f6669d01e6aed278e72919f683a73238cdf2ef90dbd31 249B / 249B                                                              1.3s
 => => sha256:e1013c40c02a7875ae30c78c69b68ea7bee31713e8ac1c0f5469c1206258d6d7 9.13kB / 9.13kB                                                          0.0s
 => => sha256:4fc77722db8bd186386ebfe056989b2ba1c8a602ef1c46ec461fa49a9bb4c667 1.75kB / 1.75kB                                                          0.0s
 => => sha256:abe836e1b93b4b373cd684fa406a4dea9920e7420349e7747b869e3522f06f1c 5.37kB / 5.37kB                                                          0.0s
 => => sha256:5e3380732964a9fa4272d7d4ab36e5b9f132b331f3bdbb80c3b6e55fb8cc6be2 3.51MB / 3.51MB                                                          1.2s
 => => extracting sha256:5e3380732964a9fa4272d7d4ab36e5b9f132b331f3bdbb80c3b6e55fb8cc6be2                                                               0.1s
 => => extracting sha256:5cc9686f2aa90263bd53a0ee75237af8b54c307b443c5185997aaab2bfa07f73                                                               0.6s
 => => extracting sha256:5d66a27e733ac4f56a6f6669d01e6aed278e72919f683a73238cdf2ef90dbd31                                                               0.0s
 => [internal] load build context                                                                                                                       0.0s
 => => transferring context: 339B                                                                                                                       0.0s
 => [2/5] WORKDIR /app                                                                                                                                  0.1s
 => [3/5] COPY app.py /app/app.py                                                                                                                       0.0s
 => [4/5] COPY requirements.txt /app/requirements.txt                                                                                                   0.0s
 => [5/5] RUN pip install --no-cache-dir -r requirements.txt                                                                                            4.9s
 => exporting to image                                                                                                                                  0.1s
 => => exporting layers                                                                                                                                 0.1s
 => => writing image sha256:1ecf4090d56ce8d916d633fff7b366fcc7bb5fde47519cfb8085e9d2909f067d                                                            0.0s
 => => naming to docker.io/library/docker-compose-test_flask                                                                                            0.0s
Building nginx
[+] Building 2.0s (7/7) FINISHED                                                                                                              docker:default
 => [internal] load build definition from Dockerfile.nginx                                                                                              0.0s
 => => transferring dockerfile: 148B                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/nginx:alpine                                                                                         1.9s
 => [internal] load .dockerignore                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                         0.0s
 => [internal] load build context                                                                                                                       0.0s
 => => transferring context: 311B                                                                                                                       0.0s
 => CACHED [1/2] FROM docker.io/library/nginx:alpine@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10                            0.0s
 => [2/2] COPY nginx.conf /etc/nginx/nginx.conf                                                                                                         0.0s
 => exporting to image                                                                                                                                  0.0s
 => => exporting layers                                                                                                                                 0.0s
 => => writing image sha256:b81aa9c9449bb2de5b960d3b5bd6b457dfee00f353171a1deda9c713a51f2225                                                            0.0s
 => => naming to docker.io/library/docker-compose-test_nginx

執行 Hello Flask 專案

執行 docker-compose up 指令

$ docker-compose up
Creating network "docker-compose-test_mynetwork" with driver "bridge"
Creating docker-compose-test_nginx_1 ... done
Creating docker-compose-test_flask_1 ... done
Attaching to docker-compose-test_flask_1, docker-compose-test_nginx_1
nginx_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx_1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx_1  | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx_1  | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
flask_1  |  * Serving Flask app 'app' (lazy loading)
flask_1  |  * Environment: production
flask_1  |    WARNING: This is a development server. Do not use it in a production deployment.
flask_1  |    Use a production WSGI server instead.
flask_1  |  * Debug mode: off
flask_1  |  * Running on all addresses.
flask_1  |    WARNING: This is a development server. Do not use it in a production deployment.
flask_1  |  * Running on http://172.18.0.3:5000/ (Press CTRL+C to quit)

測試 Hello Flask 網站

使用 curl 連接本地 Port 8080,確認回應

$ curl http://localhost:8080
Hello Flask

結論

對於時常需要搭設暫時性的測試平台,docker 提供了一個簡便與快速的方式,利用 docker-compose 設定檔,更可以集合多個 Dockerfile,一次設定與執行多個 Docker container 環境,不啻為測試環境的好幫手。

留言