--- title: Docker 與整合環境 tags: - 第一組 --- # Docker 與整合環境 ## Docker ### 架構 ``` malware_explorer/ ├── app/ │ ├── main.py ← API 主入口 │ ├── models.py ← 資料表定義(SQLAlchemy) │ ├── database.py ← 負責連線資料庫 ├── Dockerfile ← 建構 backend 映像檔 ├── docker-compose.yml ← 啟動所有服務(DB + API + GUI) ├── .env ← 存帳號密碼設定 └── requirements.lock ← Python 需要安裝哪些套件 ``` ### 🐳 Docker Compose 設定 #### docker-compose.yml ```yaml services: db: image: postgres:15 ports: - "5432:5432" environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data pgadmin: image: dpage/pgadmin4 container_name: pgadmin ports: - "5050:80" depends_on: - db environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD} volumes: - pgadmin_data:/var/lib/pgadmin volumes: pgdata: pgadmin_data: ``` #### .env 設定檔(環境變數) ``` POSTGRES_USER=admin POSTGRES_PASSWORD=password POSTGRES_DB=malware_db PGADMIN_DEFAULT_EMAIL=admin@example.com PGADMIN_DEFAULT_PASSWORD=password DATABASE_NAME=malware_db ``` #### 資料表模型(`models.py`) 以下參考[資料庫架構](/wQcffVhrSDGZgAvJIz9QoQ) ```python from sqlalchemy import Column, String, Text, Integer, BigInteger, ForeignKey, JSON, TIMESTAMP from sqlalchemy.dialects.postgresql import UUID from database import Base import uuid class Sample(Base): __tablename__ = "samples" sample_id = Column(String(64), primary_key=True) # sha256 當主鍵 original_name = Column(Text) md5_hash = Column(String(32), nullable=False) sha1_hash = Column(String(40), nullable=False) sha256_hash = Column(String(64), nullable=False) file_size = Column(Integer, nullable=False) file_type = Column(Text, nullable=False) platform_id = Column(BigInteger) malware_family_id = Column(BigInteger) malware_type_id = Column(BigInteger) threat_actor_id = Column(BigInteger, nullable=False) source_id = Column(BigInteger, nullable=False) sample_file_path = Column(Text, nullable=False) uploaded_by = Column(UUID(as_uuid=True), nullable=False, default=uuid.uuid4) uploaded_at = Column(TIMESTAMP, nullable=False) notes = Column(Text) class Feature(Base): __tablename__ = "features" feature_id = Column(BigInteger, primary_key=True) sample_id = Column(String(64), ForeignKey("samples.sample_id"), nullable=False) feature_type_id = Column(BigInteger, nullable=False) rule_name = Column(Text, nullable=False) rule_content = Column(Text, nullable=False) extra_data = Column(JSON) created_by = Column(UUID(as_uuid=True), nullable=False) created_at = Column(TIMESTAMP, nullable=False) class User(Base): __tablename__ = "users" user_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(Text, nullable=False) email = Column(Text, nullable=False, unique=True) password_hash = Column(Text, nullable=False) created_at = Column(TIMESTAMP, nullable=False) ``` ### 🚀 啟動服務指令 `docker compose up --build` ### 🛠️ 操作資料庫(兩種方式) 可以到 pgadmin 使用 GUI 管理資料庫或指令 ```shell docker compose exec db psql -U postgres -d malware_db ```