使用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)
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)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)
這篇文章主要介紹了基于Docker部署 Tomcat集群、 Nginx負(fù)載均衡,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn)
本文主要介紹了Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08