开发环境(asdf+docker)

本文目录

  1. 安装 asdf
  2. C/C++
  3. rust 安装
  4. Docker
  5. 扩展组件篇
  6. 工程化训练篇
  7. 服务器规划篇
  8. 延伸阅读

安装 asdf

1.下载 asdf

 git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

2.安装 asdf

# 在 ~/.bashrc 文件中加入以下内容: . "$HOME/.asdf/asdf.sh" . "$HOME/.asdf/completions/asdf.bash"

3.安装所需插件

asdf plugin add golang
asdf plugin add nodejs
asdf plugin add python
asdf plugin add php
asdf plugin add java

1. 检查插件列表
asdf plugin list

4.编程语言安装

1.Golang 安装

# 检查支持的版本有哪些
asdf list-all golang

1. 这里选择1.23.4 
asdf install golang 1.23.4

1. 检查已安装版本
asdf list golang

1. 配置全局命令行工具(切换版本)
asdf global golang 1.23.4

1. 测试
go version

2.Nodejs 安装

# 自动选择最新版,其他步骤同golang
asdf install nodejs latest

3.Python 安装

# 这里注意安装python/php需要安装一些依赖库,ubuntu安装示例
sudo apt update && sudo apt install -y gcc pkg-config make zlib1g-dev libssl-dev libbz2-dev libncurses-dev libffi-dev libreadline-dev libsqlite3-dev tk-dev liblzma-dev

1. 执行安装
asdf install python 3.13.1

#自带 pip
pip --version

4.PHP 安装

# 在python依赖库基础上多了一些
sudo apt update && sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev libcurl4-openssl-dev libgd-dev libonig-dev libpq-dev libzip-dev

1. 执行安装
asdf install php 8.1.31

1. 自带composer pear pecl
composer --version
pear version
pecl version

5.Java 安装

# 推荐Oracle发行版
asdf install java oracle-21.0.5

1. 若需要频繁切换maven gradle 依然可以使用asdf安装
1. 我这里就直接使用apt安装了
sudo apt update && sudo apt install -y maven gradle

#检查
mvn --version
gradle --version

C/C++

# 上面已经安装过了
gcc version
c++ version

rust 安装

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

1. 检查
rustc --version
cargo --version

Docker

在 windows 宿主机安装 docker desktop,启用 wsl2即可

1.MySQL

2.Redis

3.MongoDB

4.PostgreSQL

这里使用一个 docker compose 实现

 

networks:
  local_net:
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/16

services:
  1. Nginx 作为网关
  nginx:
    image: nginx:latest
    container_name: nginx-gateway
    ports:
      - "80:80"
      1. - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    restart: always
    networks:
      local_net:
        ipv4_address: 172.18.0.2

  1. MySQL 数据库
  mysql:
    image: mysql:8.4
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    restart: always
    networks:
      local_net:
        ipv4_address: 172.18.0.3

  1. Redis 数据库
  redis:
    image: redis:latest
    container_name: redis-db
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: always
    networks:
      local_net:
        ipv4_address: 172.18.0.4

  1. MongoDB 数据库
  mongodb:
    image: mongo:8.0
    container_name: mongodb-db
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: rootpassword
    ports:
      - "27017:27017"
    volumes:
      - mongodb-data:/data/db
    restart: always
    networks:
      local_net:
        ipv4_address: 172.18.0.5

  1. PostgreSQL 数据库
  postgresql:
    image: postgres:15
    container_name: postgresql-db
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgrespassword
      POSTGRES_DB: postgresdb
    ports:
      - "5432:5432"
    volumes:
      - postgresql-data:/var/lib/postgresql/data
    restart: always
    networks:
      local_net:
        ipv4_address: 172.18.0.6

volumes:
  mysql-data:
  redis-data:
  mongodb-data:
  postgresql-data:

 

在数据库之外,一个完整的开发环境通常还会用到下面这些常用软件和中间件:

1. 消息队列

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
docker run -d --name kafka --hostname kafka -p 9092:9092 -e KAFKA_CFG_NODE_ID=0 -e KAFKA_CFG_PROCESS_ROLES=controller,broker -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER bitnami/kafka:latest

2. 缓存

docker run -d --name memcached -p 11211:11211 memcached

3. 搜索引擎

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" elasticsearch:8.13.0
docker run -d --name kibana -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" kibana:8.13.0

4. 监控与日志

docker run -d --name prometheus -p 9090:9090 prom/prometheus
docker run -d --name grafana -p 3000:3000 grafana/grafana
docker run -d --name loki -p 3100:3100 grafana/loki

5. 其他常用服务

# 对象存储
docker run -d --name minio -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

1. API网关
docker run -d --name kong -p 8000:8000 -p 8001:8001 -p 8443:8443 -p 8444:8444 kong:3.3.0

1. 任务调度
docker run -d --name airflow -p 8080:8080 apache/airflow:2.6.2

6. 开发工具

# 代码质量检查
docker run -d --name sonarqube -p 9000:9000 sonarqube:9.9.1-community

1. 持续集成
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

7. 网络工具

# API测试
docker run -d --name postman -p 4000:4000 postman/newman

1. 网络模拟
docker run -d --name toxiproxy -p 8474:8474 shopify/toxiproxy

这些容器可以满足大多数开发场景的需求。建议使用docker-compose来管理这些服务,方便统一启动和配置。

 

从容器导出 Nginx 默认配置

可以按照以下步骤来实现,通过启动一个临时的 Nginx 容器,将容器内的相关目录复制到主机上,然后再删除该容器:

  1. 启动临时 Nginx 容器: 使用 docker run 命令启动一个临时的 Nginx 容器:
docker run -d --name temp-nginx nginx:latest

这个命令会在后台启动一个名为 temp-nginx 的 Nginx 容器,使用的是最新版本的 Nginx 镜像。

  1. 复制容器内的目录到主机: 接下来,使用 docker cp 命令将容器内的三个目录(/etc/nginx/nginx.conf、/usr/share/nginx/html、/etc/nginx/conf.d)复制到主机上。下面的命令将它们复制到当前目录下的 nginx 文件夹中:
# 创建主机上的目标目录
mkdir -p nginx
1. 复制 nginx.conf 文件
docker cp temp-nginx:/etc/nginx/nginx.conf nginx/
1. 复制 html 目录
docker cp temp-nginx:/usr/share/nginx/html nginx/
1. 复制 conf.d 目录
docker cp temp-nginx:/etc/nginx/conf.d nginx/

这些命令会分别将容器内的 nginx.conf 文件、html 目录和 conf.d 目录复制到主机上的 nginx 文件夹中。

  1. 删除临时 Nginx 容器: 最后,使用 docker stop 和 docker rm 命令来停止并删除临时的 Nginx 容器:
docker stop temp-nginx
docker rm temp-nginx

 

扩展组件篇

一、技术广度拓展:建议添加的核心组件

以下组件能帮助你掌握现代分布式系统开发中的核心中间件和技术:

1. 消息队列(RabbitMQ/Kafka)

  • 价值:学习异步通信、事件驱动架构、分布式系统解耦
  • Docker 配置示例:
rabbitmq:
  image: rabbitmq:management
  container_name: rabbitmq-server
  ports:
    - "5672:5672"  # AMQP 协议端口
    - "15672:15672" # 管理界面
  networks:
    local_net:
      ipv4_address: 172.18.0.7

kafka:
  image: bitnami/kafka:latest
  container_name: kafka-server
  ports:
    - "9092:9092"
  environment:
    1. KRaft 单节点模式,不再依赖 Zookeeper
    KAFKA_CFG_NODE_ID: 0
    KAFKA_CFG_PROCESS_ROLES: controller,broker
    KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
    KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
    KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
    KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@kafka:9093
    KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
  networks:
    local_net:
      ipv4_address: 172.18.0.8

2. 分布式缓存(Redis 高级用法)

  • 优化建议:已配置 Redis 的前提下,还可以扩展以下场景:
    • Redis Sentinel 高可用模式
    • Redis Streams 实现消息队列
    • RedisJSON 模块实践

3. API 网关(Kong/APISIX)

  • 价值:学习微服务架构下的流量管理、插件开发
  • Docker 配置示例:
kong:
  image: kong:3.6
  container_name: kong-gateway
  environment:
    KONG_DATABASE: "postgres"
    KONG_PG_HOST: postgresql
    KONG_PG_USER: postgres
    KONG_PG_PASSWORD: postgrespassword
  ports:
    - "8000:8000"  # 代理端口
    - "8443:8443"  # SSL 代理
    - "8001:8001"  # Admin API
  depends_on:
    - postgresql
  networks:
    local_net:
      ipv4_address: 172.18.0.10

4. 监控三件套(Prometheus + Grafana + Loki)

  • 价值:掌握可观测性体系建设
  • Docker 配置示例:
prometheus:
  image: prom/prometheus:latest
  volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml
  ports:
    - "9090:9090"
  networks:
    local_net:
      ipv4_address: 172.18.0.11

grafana:
  image: grafana/grafana:latest
  ports:
    - "3000:3000"
  networks:
    local_net:
      ipv4_address: 172.18.0.12

loki:
  image: grafana/loki:latest
  ports:
    - "3100:3100"
  networks:
    local_net:
      ipv4_address: 172.18.0.13

二、生产级实践模拟:关键优化建议

1. 网络配置优化

networks:
  local_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/24  # 缩小子网范围避免浪费

2. 服务健康检查

# 以 MySQL 为例
mysql:
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    interval: 5s
    timeout: 3s
    retries: 5

3. 资源限制

redis:
  deploy:
    resources:
      limits:
        cpus: '0.5'
        memory: 512M

4. 密钥管理

secrets:
  mysql_root_password:
    file: ./secrets/mysql_root_password.txt

services:
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
    secrets:
      - mysql_root_password

三、技术栈精进路线建议

技术层级推荐组件学习目标
基础层Nginx, 数据库集群掌握高可用架构设计
中间件层RabbitMQ/Kafka, Redis 集群理解 CAP 定理与分布式一致性
治理层Kong + Prometheus + Grafana学习服务治理与可观测性
云原生层Kubernetes 本地模拟(k3s)过渡到容器编排领域

四、进阶实践建议

  1. 场景化项目实践:
    • 用 Kafka 实现订单系统的最终一致性
    • 用 Kong 插件开发 JWT 认证模块
    • 使用 Prometheus 实现自定义业务指标监控
  2. 破坏性测试:
    • 模拟网络分区(docker network disconnect)
    • 强制杀死容器观察恢复过程
    • 测试数据库主从切换场景
  3. 基础设施即代码:
    • 将 docker-compose 迁移到 Terraform
    • 编写 Ansible Playbook 实现环境初始化

工程化训练篇

一、开发环境完整度提升

1. 搜索引擎 (Elasticsearch + Kibana)

elasticsearch:
  image: elasticsearch:8.13.0
  environment:
    discovery.type: single-node
    xpack.security.enabled: "false"
  ports:
    - "9200:9200"
  networks:
    local_net:
      ipv4_address: 172.18.0.14

kibana:
  image: kibana:8.13.0
  ports:
    - "5601:5601"
  depends_on:
    - elasticsearch
  networks:
    local_net:
      ipv4_address: 172.18.0.15

2. 对象存储 (MinIO)

minio:
  image: minio/minio:RELEASE.2024-05-23T05-35-35Z
  command: server /data --console-address ":9001"
  environment:
    MINIO_ROOT_USER: minioadmin
    MINIO_ROOT_PASSWORD: minioadmin
  ports:
    - "9000:9000"  # API 端口
    - "9001:9001"  # 控制台端口
  volumes:
    - minio-data:/data
  networks:
    local_net:
      ipv4_address: 172.18.0.16

3. 任务调度 (Airflow + Celery)

airflow:
  image: apache/airflow:2.9.0
  environment:
    AIRFLOW__CORE__EXECUTOR: CeleryExecutor
    AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://postgres:postgrespassword@postgresql/postgresdb
  ports:
    - "8080:8080"
  depends_on:
    - postgresql
    - redis
  networks:
    local_net:
      ipv4_address: 172.18.0.17

二、工程化能力训练

1. 代码质量检查 (SonarQube)

sonarqube:
  image: sonarqube:community
  ports:
    - "9000:9000"
  environment:
    SONAR_ES_BOOTSTRAP_CHECKS_DISABLE: "true"
  volumes:
    - sonarqube-data:/opt/sonarqube/data
    - sonarqube-extensions:/opt/sonarqube/extensions
  networks:
    local_net:
      ipv4_address: 172.18.0.18

2. 持续集成 (GitLab Runner + Jenkins)

gitlab-runner:
  image: gitlab/gitlab-runner:alpine
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./gitlab-runner-config:/etc/gitlab-runner
  networks:
    local_net:
      ipv4_address: 172.18.0.19

jenkins:
  image: jenkins/jenkins:lts-jdk17
  ports:
    - "8080:8080"
    - "50000:50000"
  volumes:
    - jenkins-data:/var/jenkins_home
  networks:
    local_net:
      ipv4_address: 172.18.0.20

3. API 测试 (Postman Newman + Swagger Editor)

swagger-editor:
  image: swaggerapi/swagger-editor
  ports:
    - "8081:8080"
  networks:
    local_net:
      ipv4_address: 172.18.0.21

三、网络模拟与混沌工程

1. 网络模拟工具 (toxiproxy)

toxiproxy:
  image: shopify/toxiproxy:2.8.0
  ports:
    - "8474:8474"  # 控制端口
    - "9002:9002"  # 被代理服务示例端口
  networks:
    local_net:
      ipv4_address: 172.18.0.22

2. 网络故障注入 (Comcast)

# 模拟 100ms 延迟 + 10% 丢包 (需在宿主机执行)
docker run --rm -it --net container:nginx-gateway tyhicks/comcast --latency 100 --packet-loss 10%

四、技术深度训练建议

工具类型推荐实践场景
对象存储实现文件分片上传、预签名 URL 生成、版本控制策略
任务调度设计 DAG 工作流实现 ETL 过程,处理失败重试和任务依赖
网络模拟模拟微服务间的网络分区,测试服务熔断和降级策略
持续集成构建多阶段流水线:代码扫描 → 容器构建 → 金丝雀部署 → 自动化 API 测试

五、环境整合建议

分层架构:

网关层服务层数据层支撑层
Nginx/Kong业务微服务
定时任务服务
API 测试工具
MySQL/PostgreSQL
Redis/MongoDB
Elasticsearch/MinIO
CI/CD(Jenkins)
监控(Prometheus)
日志(Loki)

学习路线:

  1. 基础服务
  2. 分布式中间件
  3. 可观测性体系
  4. 混沌工程
  5. 生产级最佳实践

把这些组件逐步集成进来,就能得到一个媲美中小型企业生产环境的技术沙箱,足以覆盖日常开发与大多数演练场景。

最后再从服务器配置与集群规划的角度,给一套部署参考:


服务器规划篇

一、单机部署场景分析(All-in-One)

1. 开发测试环境(单机)

  • 推荐配置:
  • CPU:4 核(支持轻量级虚拟化)
  • 内存:8-16 GB(需同时运行 IDE 和容器)
  • 存储:100 GB SSD(代码 + 数据库 + 镜像存储)
  • 网络:千兆网卡
  • 典型负载:
  • 典型负载估算:

    • 数据库 (MySQL/PostgreSQL/MongoDB): 2-3 GB
    • Redis/Elasticsearch: 1-2 GB
    • Nginx/Kong: 0.5 GB
    • 应用服务 x3: 1 GB/个
    • 监控工具 (Prometheus+Grafana): 1 GB
    • Redis/Elasticsearch: 1-2 GB
    • Nginx/Kong: 0.5 GB
    • 应用服务 x3: 1 GB/个
    • 监控工具 (Prometheus+Grafana): 1 GB

2. 生产环境(单机 – 仅适用于极小规模)

  • 推荐配置:
  • CPU:8 核(预留突发负载缓冲)
  • 内存:32 GB(数据库缓存优化)
  • 存储:500 GB NVMe SSD(RAID1 保障数据安全)
  • 网络:双千兆网卡(Bonding 模式)
  • 资源分配原则:
  • 数据库独占 50% 内存
  • 中间件(Redis/ES)分配 30% 资源
  • 剩余资源用于应用服务


二、多节点集群规划(4C8G 服务器)

1. Docker Swarm 集群

  • 环境类型节点数角色分配适用场景
    开发测试2 节点1 Manager + 1 Worker功能验证、CI/CD 流水线
    生产环境5 节点3 Manager + 2 Worker中小型业务负载
    – Swarm 特性:
    – Manager 节点推荐奇数个(Raft 共识)
    – 每个 Manager 需 2 GB 内存用于集群管理
    – 开发环境可复用 Manager 作为 Worker

    2. Kubernetes 集群

  • 环境类型节点数角色分配说明
    开发测试3 节点1 Control Plane + 2 Worker使用 k3s 轻量部署
    生产环境7 节点3 Control Plane + 3 Worker + 1 Storage高可用标准架构
    – K8s 资源占用:
    – Control Plane 节点:需预留 1 CPU + 1.5 GB 内存/节点
    – Worker 节点:至少保留 0.5 CPU + 512 MB 内存给系统进程
    暂无评论

    发送评论 编辑评论

    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇