Skip to content

Docker 安装编程环境

本章将介绍如何使用 Docker 快速搭建 Python、Node.js、Rust 和 Java 编程环境。

Python 环境

快速运行

bash
# 运行 Python 交互式环境
docker run -it --rm python:3.12 python

# 运行 Python 脚本
docker run -it --rm -v $(pwd):/app -w /app python:3.12 python script.py

搭建开发环境

bash
docker run -it \
  --name python-dev \
  -v $(pwd):/app \
  -w /app \
  -p 8000:8000 \
  python:3.12 /bin/bash

在容器内:

bash
pip install flask
python -c "import flask; print(flask.__version__)"

Dockerfile 示例

dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]

常用 Python 镜像

镜像大小说明
python:3.12~1 GB完整版,包含编译工具
python:3.12-slim~150 MB精简版,适合大多数场景
python:3.12-alpine~50 MB最小版,可能缺少某些依赖

Node.js 环境

快速运行

bash
# 运行 Node.js 交互式环境
docker run -it --rm node:20 node

# 运行脚本
docker run -it --rm -v $(pwd):/app -w /app node:20 node index.js

搭建开发环境

bash
docker run -it \
  --name node-dev \
  -v $(pwd):/app \
  -w /app \
  -p 3000:3000 \
  node:20 /bin/bash

在容器内:

bash
npm init -y
npm install express
node -e "console.log('Node.js ' + process.version)"

Dockerfile 示例

dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

常用 Node.js 镜像

镜像大小说明
node:20~1 GB完整版
node:20-slim~200 MB精简版
node:20-alpine~130 MBAlpine 版,最小

Rust 环境

快速运行

bash
# 运行 Rust 交互式环境
docker run -it --rm rust:latest /bin/bash

# 编译并运行 Rust 程序
docker run -it --rm -v $(pwd):/app -w /app rust:latest bash -c "rustc main.rs && ./main"

搭建开发环境

bash
docker run -it \
  --name rust-dev \
  -v $(pwd):/app \
  -w /app \
  rust:latest /bin/bash

在容器内:

bash
# 创建新项目
cargo new hello-world
cd hello-world
cargo run

Dockerfile 示例(多阶段构建)

dockerfile
# 构建阶段
FROM rust:1.77 AS builder
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
COPY src ./src
RUN cargo build --release

# 运行阶段
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y libssl3 ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/myapp /usr/local/bin/myapp
CMD ["myapp"]

Rust 多阶段构建效果显著:

阶段大小
构建镜像(含 Rust 工具链)~1.5 GB
运行镜像(仅二进制文件)~80 MB

Java 环境

快速运行

bash
# 运行 Java 交互式环境
docker run -it --rm eclipse-temurin:21 /bin/bash

# 编译并运行 Java 程序
docker run -it --rm -v $(pwd):/app -w /app eclipse-temurin:21 bash -c "javac Main.java && java Main"

搭建开发环境

bash
docker run -it \
  --name java-dev \
  -v $(pwd):/app \
  -w /app \
  -p 8080:8080 \
  eclipse-temurin:21 /bin/bash

使用 Maven 构建

bash
docker run -it --rm \
  -v $(pwd):/app \
  -v maven-repo:/root/.m2 \
  -w /app \
  maven:3.9-eclipse-temurin-21 mvn package

Dockerfile 示例(Spring Boot)

dockerfile
# 构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 运行阶段
FROM eclipse-temurin:21-jre-alpine
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

常用 Java 镜像

镜像说明
eclipse-temurin:21完整 JDK
eclipse-temurin:21-jre仅 JRE(运行环境)
eclipse-temurin:21-jre-alpineAlpine 版 JRE,最小
maven:3.9-eclipse-temurin-21包含 Maven 的 JDK

通用技巧

使用数据卷缓存依赖

bash
# 缓存 npm 依赖
docker run -v npm-cache:/root/.npm -v $(pwd):/app -w /app node:20 npm install

# 缓存 Maven 依赖
docker run -v maven-repo:/root/.m2 -v $(pwd):/app -w /app maven:3.9 mvn package

# 缓存 pip 依赖
docker run -v pip-cache:/root/.cache/pip -v $(pwd):/app -w /app python:3.12 pip install -r requirements.txt

使用 Docker Compose 管理开发环境

yaml
# docker-compose.yml
services:
  app:
    image: node:20
    working_dir: /app
    volumes:
      - .:/app
      - node_modules:/app/node_modules
    ports:
      - "3000:3000"
    command: npm run dev

volumes:
  node_modules:

本章小结

Docker 让搭建编程环境变得简单快捷,无需在宿主机上安装各种语言运行时和工具链。通过多阶段构建,可以将最终镜像体积控制在很小的范围内。

延伸阅读