欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Docker搭建本地開發(fā)環(huán)境的詳細(xì)指南

 更新時間:2025年04月30日 10:44:24   作者:小寶哥Code  
這篇文章主要介紹了使用Docker搭建本地開發(fā)環(huán)境的詳細(xì)指南,涵蓋了從基礎(chǔ)Docker準(zhǔn)備到多容器管理、安全強(qiáng)化等各個方面,通過使用Docker,可以確保開發(fā)環(huán)境的一致性、可移植性和可版本控制,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

使用 Docker 搭建本地開發(fā)環(huán)境

Docker 容器化技術(shù)讓開發(fā)環(huán)境的搭建變得快速、一致且可移植。以下是使用 Docker 快速搭建各類開發(fā)環(huán)境的詳細(xì)指南。

1. Docker 基礎(chǔ)準(zhǔn)備

安裝 Docker

  • Windows: 安裝 Docker Desktop for Windows
  • macOS: 安裝 Docker Desktop for Mac
  • Linux:
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    

Docker Compose 安裝

最新版 Docker Desktop 已包含 Docker Compose。如需單獨(dú)安裝:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. 通用開發(fā)環(huán)境模板

創(chuàng)建基礎(chǔ) docker-compose.yml

在項(xiàng)目根目錄創(chuàng)建 docker-compose.yml

version: '3.8'

services:
  # 這里會添加各種服務(wù)
  
volumes:
  # 持久化數(shù)據(jù)卷
  
networks:
  # 自定義網(wǎng)絡(luò)
  app-network:
    driver: bridge

3. Web 開發(fā)環(huán)境

Node.js 環(huán)境

services:
  node-app:
    image: node:18
    container_name: node-dev
    working_dir: /app
    volumes:
      - ./:/app
      - node_modules:/app/node_modules
    ports:
      - "3000:3000"
    command: sh -c "npm install && npm start"
    environment:
      - NODE_ENV=development

volumes:
  node_modules:

LAMP 環(huán)境 (Linux + Apache + MySQL + PHP)

services:
  webserver:
    image: php:8.2-apache
    container_name: php-apache
    volumes:
      - ./src:/var/www/html
    ports:
      - "80:80"
    depends_on:
      - db
      
  db:
    image: mysql:8.0
    container_name: mysql
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
      
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
    depends_on:
      - db

volumes:
  mysql_data:

MERN 環(huán)境 (MongoDB + Express + React + Node.js)

services:
  backend:
    image: node:18
    container_name: express-backend
    working_dir: /app/backend
    volumes:
      - ./backend:/app/backend
    ports:
      - "5000:5000"
    command: sh -c "npm install && npm start"
    depends_on:
      - mongo
      
  frontend:
    image: node:18
    container_name: react-frontend
    working_dir: /app/frontend
    volumes:
      - ./frontend:/app/frontend
    ports:
      - "3000:3000"
    command: sh -c "npm install && npm start"
    stdin_open: true
    
  mongo:
    image: mongo:6
    container_name: mongodb
    volumes:
      - mongo_data:/data/db
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: rootpassword

volumes:
  mongo_data:

4. Python 開發(fā)環(huán)境

Django 開發(fā)環(huán)境

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    container_name: django-app
    volumes:
      - ./:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    command: python manage.py runserver 0.0.0.0:8000
    
  db:
    image: postgres:15
    container_name: postgres-db
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_DB=postgres

volumes:
  postgres_data:

Dockerfile.dev:

FROM python:3.11

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

Flask + Redis 環(huán)境

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    container_name: flask-app
    volumes:
      - ./:/app
    ports:
      - "5000:5000"
    depends_on:
      - redis
    environment:
      - FLASK_APP=app.py
      - FLASK_ENV=development
    command: flask run --host=0.0.0.0
    
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"

5. Java/Kotlin 開發(fā)環(huán)境

Spring Boot 環(huán)境

services:
  app:
    image: gradle:8.5-jdk17
    container_name: spring-app
    working_dir: /app
    volumes:
      - ./:/app
      - gradle-cache:/home/gradle/.gradle
    ports:
      - "8080:8080"
    command: gradle bootRun
    depends_on:
      - db
      
  db:
    image: mysql:8.0
    container_name: mysql
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: springapp
    ports:
      - "3306:3306"

volumes:
  gradle-cache:
  mysql_data:

Android 開發(fā)環(huán)境

services:
  android:
    image: thyrlian/android-sdk:latest
    container_name: android-sdk
    working_dir: /app
    volumes:
      - ./:/app
      - gradle-cache:/root/.gradle
      - android-sdk:/opt/android-sdk
    environment:
      - JAVA_OPTS=-Xmx2048m
    
volumes:
  gradle-cache:
  android-sdk:

6. 數(shù)據(jù)科學(xué)環(huán)境

Jupyter Notebook 環(huán)境

services:
  jupyter:
    image: jupyter/datascience-notebook:latest
    container_name: jupyter-notebook
    volumes:
      - ./notebooks:/home/jovyan/work
    ports:
      - "8888:8888"
    environment:
      - JUPYTER_ENABLE_LAB=yes
    command: start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''

TensorFlow 環(huán)境

services:
  tensorflow:
    image: tensorflow/tensorflow:latest-gpu-jupyter
    container_name: tensorflow-gpu
    volumes:
      - ./notebooks:/tf/notebooks
    ports:
      - "8888:8888"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

7. 數(shù)據(jù)庫環(huán)境組合

多數(shù)據(jù)庫開發(fā)環(huán)境

services:
  postgres:
    image: postgres:15
    container_name: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: testdb
    ports:
      - "5432:5432"
      
  mysql:
    image: mysql:8.0
    container_name: mysql
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb
    ports:
      - "3306:3306"
      
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"
      
  mongo:
    image: mongo:6
    container_name: mongodb
    volumes:
      - mongo_data:/data/db
    ports:
      - "27017:27017"

volumes:
  postgres_data:
  mysql_data:
  mongo_data:

8. 開發(fā)工具集成

Git + VS Code Server

services:
  code-server:
    image: codercom/code-server:latest
    container_name: vscode-server
    volumes:
      - ./:/home/coder/project
      - ~/.ssh:/home/coder/.ssh
    ports:
      - "8080:8080"
    environment:
      - PASSWORD=yourpassword
    command: --auth password --host 0.0.0.0

代碼質(zhì)量工具

services:
  sonarqube:
    image: sonarqube:latest
    container_name: sonarqube
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
    ports:
      - "9000:9000"

volumes:
  sonarqube_data:
  sonarqube_extensions:

9. 完整全棧開發(fā)環(huán)境示例

企業(yè)級全棧開發(fā)環(huán)境

version: '3.8'

services:
  frontend:
    image: node:18
    container_name: frontend
    working_dir: /app/frontend
    volumes:
      - ./frontend:/app/frontend
      - frontend_node_modules:/app/frontend/node_modules
    ports:
      - "3000:3000"
    command: sh -c "npm install && npm start"
    
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile.dev
    container_name: backend
    volumes:
      - ./backend:/app
      - backend_node_modules:/app/node_modules
    ports:
      - "5000:5000"
    depends_on:
      - postgres
      - redis
      - mongo
    environment:
      - DB_HOST=postgres
      - DB_NAME=appdb
      - DB_USER=postgres
      - DB_PASSWORD=postgres
      - REDIS_HOST=redis
      - MONGO_URI=mongodb://mongo:27017/appdb
      
  postgres:
    image: postgres:15
    container_name: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: appdb
    ports:
      - "5432:5432"
      
  redis:
    image: redis:alpine
    container_name: redis
    ports:
      - "6379:6379"
      
  mongo:
    image: mongo:6
    container_name: mongodb
    volumes:
      - mongo_data:/data/db
    ports:
      - "27017:27017"
      
  mailhog:
    image: mailhog/mailhog
    container_name: mailhog
    ports:
      - "1025:1025"
      - "8025:8025"
      
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend

volumes:
  frontend_node_modules:
  backend_node_modules:
  postgres_data:
  mongo_data:

10. 快速啟動與使用技巧

啟動環(huán)境

# 啟動所有服務(wù)
docker-compose up

# 后臺啟動
docker-compose up -d

# 啟動特定服務(wù)
docker-compose up backend db

# 重建鏡像并啟動
docker-compose up --build

管理技巧

# 查看容器日志
docker-compose logs -f backend

# 進(jìn)入容器
docker-compose exec backend bash

# 停止環(huán)境
docker-compose down

# 停止并刪除卷
docker-compose down -v

環(huán)境配置文件化

創(chuàng)建多環(huán)境配置:

  • docker-compose.yml - 基本配置
  • docker-compose.override.yml - 開發(fā)環(huán)境默認(rèn)覆蓋
  • docker-compose.prod.yml - 生產(chǎn)環(huán)境配置

啟動生產(chǎn)環(huán)境:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

總結(jié)

使用 Docker 搭建本地開發(fā)環(huán)境的優(yōu)勢:

  • 一致性 - 確保所有團(tuán)隊(duì)成員使用相同環(huán)境
  • 隔離性 - 不同項(xiàng)目的依賴不會相互干擾
  • 可移植性 - 環(huán)境可以在任何支持 Docker 的系統(tǒng)上運(yùn)行
  • 可版本控制 - 環(huán)境配置可以通過 Git 管理
  • 快速啟動 - 新成員加入只需幾分鐘即可完成環(huán)境搭建

關(guān)鍵最佳實(shí)踐:

  • 使用命名卷而非匿名卷保存數(shù)據(jù)
  • 配置環(huán)境變量以適應(yīng)不同場景
  • 為容器命名以便于管理
  • 將常用命令添加到 Makefile 或 npm scripts 中以簡化操作

通過本指南的配置模板,您可以根據(jù)項(xiàng)目需求快速組合和定制適合的開發(fā)環(huán)境,大大提高開發(fā)效率。

使用 Docker 瞬間搭建本地開發(fā)環(huán)境(續(xù))

11. 多架構(gòu)開發(fā)環(huán)境

微服務(wù)架構(gòu)開發(fā)環(huán)境

針對微服務(wù)開發(fā),可以使用更復(fù)雜的 Docker Compose 配置:

version: '3.8'

services:
  # API Gateway
  gateway:
    image: nginx:alpine
    container_name: api-gateway
    volumes:
      - ./gateway/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - auth-service
      - user-service
      - product-service
    networks:
      - microservice-network
      
  # 認(rèn)證服務(wù)
  auth-service:
    build: 
      context: ./auth-service
      dockerfile: Dockerfile.dev
    container_name: auth-service
    volumes:
      - ./auth-service:/app
    ports:
      - "8001:8000"
    environment:
      - DB_HOST=auth-db
    depends_on:
      - auth-db
    networks:
      - microservice-network
      - auth-network
      
  auth-db:
    image: postgres:15
    container_name: auth-db
    volumes:
      - auth_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=auth
    networks:
      - auth-network
      
  # 用戶服務(wù)  
  user-service:
    build:
      context: ./user-service
      dockerfile: Dockerfile.dev
    container_name: user-service
    volumes:
      - ./user-service:/app
    ports:
      - "8002:8000"
    environment:
      - MONGO_URI=mongodb://user-db:27017/users
    depends_on:
      - user-db
    networks:
      - microservice-network
      - user-network
      
  user-db:
    image: mongo:6
    container_name: user-db
    volumes:
      - user_db_data:/data/db
    networks:
      - user-network
      
  # 產(chǎn)品服務(wù)
  product-service:
    build:
      context: ./product-service
      dockerfile: Dockerfile.dev
    container_name: product-service
    volumes:
      - ./product-service:/app
    ports:
      - "8003:8000"
    environment:
      - MYSQL_HOST=product-db
    depends_on:
      - product-db
    networks:
      - microservice-network
      - product-network
      
  product-db:
    image: mysql:8.0
    container_name: product-db
    volumes:
      - product_db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=products
    networks:
      - product-network
      
  # 監(jiān)控與日志
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    networks:
      - monitoring-network
      - microservice-network
      
  grafana:
    image: grafana/grafana
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus
    networks:
      - monitoring-network

networks:
  microservice-network:
  auth-network:
  user-network:
  product-network:
  monitoring-network:

volumes:
  auth_db_data:
  user_db_data:
  product_db_data:
  grafana_data:

12. 云原生開發(fā)環(huán)境

Kubernetes 本地開發(fā)

使用 Kind(Kubernetes in Docker)或 Minikube 創(chuàng)建本地 K8s 集群:

services:
  kind:
    image: docker:dind
    container_name: kind-cluster
    privileged: true
    volumes:
      - ./k8s-config:/config
      - kind-data:/var/lib/docker
    ports:
      - "8443:8443" # Kubernetes API
    environment:
      - DOCKER_TLS_CERTDIR=""
    command: sh -c "dockerd-entrypoint.sh & sleep 5 && kind create cluster --config=/config/kind-config.yaml && tail -f /dev/null"

  kubectl:
    image: bitnami/kubectl:latest
    container_name: kubectl
    volumes:
      - ~/.kube:/root/.kube
    depends_on:
      - kind
    command: sh -c "sleep 10 && kubectl get nodes && tail -f /dev/null"

volumes:
  kind-data:

kind-config.yaml:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
- role: worker
- role: worker

13. DevOps 工具鏈環(huán)境

CI/CD 本地開發(fā)環(huán)境

version: '3.8'

services:
  # Git服務(wù)器
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    restart: always
    hostname: gitlab.local
    ports:
      - "80:80"
      - "443:443"
      - "22:22"
    volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    shm_size: '256m'
    
  # CI/CD服務(wù)
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    restart: always
    privileged: true
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - JAVA_OPTS=-Djenkins.install.runSetupWizard=false
    
  # 制品庫
  nexus:
    image: sonatype/nexus3
    container_name: nexus
    restart: always
    ports:
      - "8081:8081"
    volumes:
      - nexus_data:/nexus-data
      
  # 代碼質(zhì)量
  sonarqube:
    image: sonarqube:latest
    container_name: sonarqube
    restart: always
    ports:
      - "9000:9000"
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    environment:
      - SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonar
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
    depends_on:
      - sonarqube-db
      
  sonarqube-db:
    image: postgres:15
    container_name: sonarqube-db
    restart: always
    volumes:
      - sonarqube_db:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
      - POSTGRES_DB=sonar

volumes:
  gitlab_config:
  gitlab_logs:
  gitlab_data:
  jenkins_home:
  nexus_data:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  sonarqube_db:

14. 前端開發(fā)專用環(huán)境

現(xiàn)代前端工具鏈

version: '3.8'

services:
  # 主應(yīng)用開發(fā)環(huán)境
  app:
    image: node:18
    container_name: frontend-app
    working_dir: /app
    volumes:
      - ./:/app
      - node_modules:/app/node_modules
    ports:
      - "3000:3000" # React/Vue/Angular
      - "5173:5173" # Vite
    command: sh -c "npm install && npm run dev"
    stdin_open: true
    tty: true
    
  # 靜態(tài)分析
  eslint:
    image: node:18
    container_name: eslint
    working_dir: /app
    volumes:
      - ./:/app
    command: sh -c "npm install && npm run lint"
    profiles: ["tools"]
    
  # 測試環(huán)境
  test:
    image: node:18
    container_name: test
    working_dir: /app
    volumes:
      - ./:/app
    command: sh -c "npm install && npm test"
    environment:
      - CI=true
    profiles: ["tools"]
    
  # 組件文檔
  storybook:
    image: node:18
    container_name: storybook
    working_dir: /app
    volumes:
      - ./:/app
    ports:
      - "6006:6006"
    command: sh -c "npm install && npm run storybook"
    profiles: ["tools"]
    
  # API Mock服務(wù)
  mock-api:
    image: node:18
    container_name: mock-api
    working_dir: /app/mock-server
    volumes:
      - ./mock-server:/app/mock-server
    ports:
      - "3001:3001"
    command: sh -c "npm install && node server.js"

volumes:
  node_modules:

15. 嵌入式系統(tǒng)開發(fā)環(huán)境

IoT和嵌入式開發(fā)容器

version: '3.8'

services:
  # 嵌入式開發(fā)環(huán)境
  embedded-dev:
    image: gcc:latest
    container_name: embedded-dev
    working_dir: /workspace
    volumes:
      - ./:/workspace
    command: tail -f /dev/null
    
  # 交叉編譯
  arm-toolchain:
    build:
      context: .
      dockerfile: ARM.Dockerfile
    container_name: arm-compiler
    working_dir: /workspace
    volumes:
      - ./:/workspace
    command: tail -f /dev/null
    
  # IoT模擬器
  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mqtt-broker
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - mosquitto_data:/mosquitto/data
      - mosquitto_log:/mosquitto/log
      
  # 數(shù)據(jù)采集與存儲
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "8086:8086"
    volumes:
      - influxdb_data:/var/lib/influxdb2
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=password123
      - DOCKER_INFLUXDB_INIT_ORG=my-org
      - DOCKER_INFLUXDB_INIT_BUCKET=iot-data
      
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - influxdb

volumes:
  mosquitto_data:
  mosquitto_log:
  influxdb_data:
  grafana_data:

ARM.Dockerfile:

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    build-essential \
    gcc-arm-linux-gnueabihf \
    g++-arm-linux-gnueabihf \
    cmake \
    make \
    git \
    && rm -rf /var/lib/apt/lists/*

ENV PATH="/usr/arm-linux-gnueabihf/bin:${PATH}"
WORKDIR /workspace

16. 多容器管理與優(yōu)化

使用 Docker Compose 配置文件實(shí)現(xiàn)環(huán)境分離

基礎(chǔ)配置 docker-compose.yml:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/app
    ports:
      - "3000:3000"

開發(fā)環(huán)境配置 docker-compose.dev.yml:

version: '3.8'

services:
  app:
    build:
      dockerfile: Dockerfile.dev
    command: npm run dev
    environment:
      - NODE_ENV=development
    volumes:
      - ./:/app
      - /app/node_modules

測試環(huán)境配置 docker-compose.test.yml:

version: '3.8'

services:
  app:
    command: npm test
    environment:
      - NODE_ENV=test

啟動開發(fā)環(huán)境:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

Makefile 簡化操作

創(chuàng)建 Makefile:

.PHONY: dev test prod down

dev:
	docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

test:
	docker-compose -f docker-compose.yml -f docker-compose.test.yml up --abort-on-container-exit

prod:
	docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

down:
	docker-compose down

logs:
	docker-compose logs -f

使用: make dev 快速啟動開發(fā)環(huán)境。

17. 容器資源管理

設(shè)置資源限制

services:
  app:
    image: node:18
    container_name: web-app
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

使用Docker Compose輕松實(shí)現(xiàn)應(yīng)用伸縮

# 啟動3個應(yīng)用實(shí)例
docker-compose up -d --scale app=3

18. 高級網(wǎng)絡(luò)配置

創(chuàng)建自定義網(wǎng)絡(luò)拓?fù)?/h4>
version: '3.8'

services:
  frontend:
    image: nginx:alpine
    networks:
      - frontend-network
      - app-network
      
  backend:
    image: node:18
    networks:
      - app-network
      - database-network
      
  database:
    image: postgres:15
    networks:
      - database-network

networks:
  frontend-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          
  app-network:
    driver: bridge
    
  database-network:
    driver: bridge
    internal: true  # 內(nèi)部網(wǎng)絡(luò),不能訪問外網(wǎng)

19. 安全強(qiáng)化

安全開發(fā)環(huán)境

version: '3.8'

services:
  secure-app:
    image: node:18
    container_name: secure-app
    user: node  # 非root用戶
    read_only: true  # 只讀文件系統(tǒng)
    cap_drop:  # 刪除所有權(quán)能
      - ALL
    security_opt:
      - no-new-privileges:true
    volumes:
      - ./app:/home/node/app:ro  # 只讀掛載
      - node_modules:/home/node/app/node_modules
      - tmp_data:/tmp  # 可寫臨時目錄
    working_dir: /home/node/app
    command: node server.js
    
  # 安全掃描
  security-scan:
    image: aquasec/trivy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: image secure-app
    profiles: ["scan"]

volumes:
  node_modules:
  tmp_data:

20. 一體化開發(fā)環(huán)境終極示例

以下是一個完整的全棧應(yīng)用開發(fā)環(huán)境,包含前端、后端、數(shù)據(jù)庫、緩存、監(jiān)控等所有組件:

version: '3.8'

services:
  # 前端服務(wù)
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    container_name: frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - REACT_APP_API_URL=http://localhost/api
    depends_on:
      - backend
    networks:
      - frontend-network
      - backend-network
      
  # 后端API服務(wù)
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile.dev
    container_name: backend
    volumes:
      - ./backend:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgres://postgres:postgres@postgres:5432/app
      - REDIS_URL=redis://redis:6379
      - PORT=4000
      - JWT_SECRET=development_secret
    depends_on:
      - postgres
      - redis
    networks:
      - backend-network
      - db-network
      
  # 網(wǎng)關(guān)
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./nginx/default.dev.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - frontend-network
      - backend-network
      
  # 數(shù)據(jù)庫
  postgres:
    image: postgres:15
    container_name: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init-scripts:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=app
    ports:
      - "5432:5432"
    networks:
      - db-network
      
  # 緩存
  redis:
    image: redis:alpine
    container_name: redis
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
    networks:
      - db-network
      
  # 數(shù)據(jù)庫管理工具
  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@example.com
      - PGADMIN_DEFAULT_PASSWORD=admin
    ports:
      - "5050:80"
    depends_on:
      - postgres
    networks:
      - db-network
      
  # 消息隊(duì)列
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - backend-network
      
  # 搜索引擎
  elasticsearch:
    image: elasticsearch:8.6.2
    container_name: elasticsearch
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    networks:
      - db-network
      
  # 監(jiān)控
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"
    networks:
      - monitoring-network
      - backend-network
      
  grafana:
    image: grafana/grafana
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3030:3000"
    depends_on:
      - prometheus
    networks:
      - monitoring-network
      
  # 日志聚合
  loki:
    image: grafana/loki
    container_name: loki
    ports:
      - "3100:3100"
    networks:
      - monitoring-network
      
  promtail:
    image: grafana/promtail
    container_name: promtail
    volumes:
      - ./logs:/var/log
      - ./promtail:/etc/promtail
    command: -config.file=/etc/promtail/config.yml
    networks:
      - monitoring-network
      
  # 郵件測試
  mailhog:
    image: mailhog/mailhog
    container_name: mailhog
    ports:
      - "1025:1025"
      - "8025:8025"
    networks:
      - backend-network

networks:
  frontend-network:
  backend-network:
  db-network:
  monitoring-network:

volumes:
  postgres_data:
  redis_data:
  rabbitmq_data:
  elasticsearch_data:
  prometheus_data:
  grafana_data:

使用小貼士

  • 啟動項(xiàng)目:新克隆項(xiàng)目后立即能啟動開發(fā)環(huán)境

    git clone your-project-url
    cd your-project
    docker-compose up -d
    
  • 保持環(huán)境一致:將 Docker 配置文件納入版本控制,確保團(tuán)隊(duì)所有成員使用相同環(huán)境

  • 優(yōu)化構(gòu)建速度

    • 利用多階段構(gòu)建
    • 使用 .dockerignore 排除不需要的文件
    • 優(yōu)化層緩存
  • 環(huán)境變量管理

    • 使用 .env 文件管理環(huán)境變量
    • 在代碼存儲庫中保留 .env.example 作為模板
  • 持久化管理

    • 為持久化數(shù)據(jù)創(chuàng)建命名卷
    • 定期備份重要卷
    • 考慮將數(shù)據(jù)卷掛載到主機(jī)目錄以便于備份

通過 Docker 構(gòu)建的開發(fā)環(huán)境為開發(fā)者提供了極大的便利,不僅確保了環(huán)境的一致性與可重現(xiàn)性,還大幅降低了配置時間,讓團(tuán)隊(duì)成員可以專注于代碼開發(fā)而非環(huán)境配置。不論是簡單的單一技術(shù)棧應(yīng)用還是復(fù)雜的微服務(wù)架構(gòu),Docker 都能提供快速、可靠的開發(fā)環(huán)境搭建方案。

總結(jié)

到此這篇關(guān)于使用Docker搭建本地開發(fā)環(huán)境的文章就介紹到這了,更多相關(guān)Docker搭建本地開發(fā)環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • DockerToolBox文件掛載的實(shí)現(xiàn)代碼

    DockerToolBox文件掛載的實(shí)現(xiàn)代碼

    這篇文章主要介紹了DockerToolBox文件掛載的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Docker容器修改配置文件的實(shí)現(xiàn)

    Docker容器修改配置文件的實(shí)現(xiàn)

    這篇文章主要介紹了Docker容器修改配置文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)

    基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)

    這篇文章主要介紹了基于Docker部署 Tomcat集群、 Nginx負(fù)載均衡,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳細(xì)介紹如何安裝最新版Docker?Compose

    詳細(xì)介紹如何安裝最新版Docker?Compose

    Docker Compose是一個用來定義和運(yùn)行多個復(fù)雜應(yīng)用的Docker編排工具,下面這篇文章主要給大家介紹了關(guān)于如何安裝最新版Docker?Compose的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 使用Docker部署前后端分離項(xiàng)目的完整步驟

    使用Docker部署前后端分離項(xiàng)目的完整步驟

    剛剛接觸基礎(chǔ)的運(yùn)維工作,采用的是docker部署的方式,下面這篇文章主要給大家介紹了關(guān)于使用Docker部署前后端分離項(xiàng)目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • docker中的環(huán)境變量使用與常見問題解決方案

    docker中的環(huán)境變量使用與常見問題解決方案

    這篇文章主要給大家介紹了關(guān)于docker中環(huán)境變量使用與常見問題解決方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用docker具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 在windows下的安裝Docker的教程

    在windows下的安裝Docker的教程

    這篇文章主要介紹了在windows下的安裝Docker的教程,注意只能是64的系統(tǒng),需要的朋友可以參考下
    2015-12-12
  • docker如何在一個容器內(nèi)部署多個服務(wù)

    docker如何在一個容器內(nèi)部署多個服務(wù)

    這篇文章主要介紹了docker如何在一個容器內(nèi)部署多個服務(wù),思路是這樣的首先拿到你的httpd,以及你的springBoot,合并他們的Dockerfile,然后打包,然后啟動的時候啟動多個端口(httpd的端口和你服務(wù)的端口),需要的朋友可以參考下
    2024-01-01
  • Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn)

    Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn)

    本文主要介紹了Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • docker開通2375端口防漏洞問題

    docker開通2375端口防漏洞問題

    這篇文章主要介紹了docker開通2375端口防漏洞問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論