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: bridgeDockerfile.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 環境,不啻為測試環境的好幫手。
