在 Ubuntu 中实现 Docker 远程部署镜像并能在本地直接修改源代码,有几种常见方案:

方案一:使用 Docker Volume 挂载本地目录(推荐)

1. Docker Compose 配置示例

version: '3.8'
services:
  app:
    image: your-image:latest
    volumes:
      # 挂载本地源代码目录到容器
      - ./src:/app/src
      - ./config:/app/config
    ports:
      - "8080:8080"
    environment:
      - NODE_ENV=development

2. Docker 命令方式

# 运行容器并挂载目录
docker run -d \
  -p 8080:8080 \
  -v $(pwd)/src:/app/src \
  -v $(pwd)/config:/app/config \
  --name myapp \
  your-image:latest

方案二:开发模式热重载配置

1. Node.js 应用示例

# Dockerfile.dev
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
# 不复制源代码,通过 volume 挂载
CMD ["npm", "run", "dev"]
# docker-compose.dev.yml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - ./src:/app/src
      - ./node_modules:/app/node_modules
    ports:
      - "3000:3000"
      - "9229:9229" # 调试端口
    environment:
      - NODE_ENV=development
    command: npm run dev

2. Python Flask 应用示例

# Dockerfile.dev
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
CMD ["flask", "run", "--host=0.0.0.0", "--reload"]
# 运行命令
docker run -d \
  -p 5000:5000 \
  -v $(pwd)/app.py:/app/app.py \
  -v $(pwd)/src:/app/src \
  -e FLASK_ENV=development \
  flask-app:dev

方案三:使用远程开发工具

1. VS Code 远程开发

安装扩展:

  • Docker
  • Remote - Containers

.devcontainer/devcontainer.json 配置:

{
  "name": "My App",
  "dockerComposeFile": "../docker-compose.dev.yml",
  "service": "app",
  "workspaceFolder": "/app",
  "mounts": [
    "source=${localWorkspaceFolder},target=/app,type=bind"
  ],
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "dbaeumer.vscode-eslint"
      ]
    }
  }
}

方案四:使用 Bind Mounts + 文件监视

1. 使用 nodemon(Node.js)

// package.json
{
  "scripts": {
    "dev": "nodemon --watch src --exec node src/index.js"
  }
}

2. 使用 inotifywait(通用方案)

# 在容器内安装 inotify-tools
apt-get update && apt-get install -y inotify-tools

# 监视文件变化并重启服务
#!/bin/bash
while inotifywait -r -e modify,create,delete /app/src; do
  echo "检测到文件变化,重启服务..."
  pkill -f "node" || true
  npm start &
done

方案五:生产环境考虑(使用 rsync)

对于生产环境,可以使用 rsync 同步代码:

# 本地同步到远程服务器
rsync -avz --delete \
  -e "ssh -p 22" \
  ./src/ \
  user@remote-server:/app/src/

# 自动监控并同步
fswatch -o ./src | while read f; do
  rsync -avz ./src/ user@remote-server:/app/src/
done

最佳实践建议

1. 开发环境配置

# 创建开发环境脚本
#!/bin/bash
# dev.sh

# 构建开发镜像
docker build -f Dockerfile.dev -t myapp-dev .

# 启动开发容器
docker run -d \
  --name myapp-dev \
  -p 3000:3000 \
  -v $(pwd):/app \
  -v /app/node_modules \
  --env-file .env.dev \
  myapp-dev

# 查看日志
docker logs -f myapp-dev

2. 使用 .dockerignore

.git
.gitignore
node_modules
*.log
.env
dist

3. 性能优化

# 使用缓存友好的挂载
docker run -v $(pwd):/app:cached ...

# 对于大量小文件,考虑使用 delegated
docker run -v $(pwd):/app:delegated ...

调试技巧

  1. 实时查看容器内文件变化

    # 进入容器
    docker exec -it container_name bash
    
    # 查看挂载情况
    mount | grep /app
  2. 检查文件权限

    # 确保容器用户有权限访问挂载的文件
    docker run -u $(id -u):$(id -g) ...

选择哪种方案取决于:

  • 开发环境复杂度
  • 团队协作需求
  • 性能要求
  • 部署环境(云/本地)

最简单的起点是使用 Docker Volume + 开发服务器的热重载功能。

标签: Docker, Ubuntu

添加新评论