在 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=development2. 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 dev2. 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-dev2. 使用 .dockerignore
.git
.gitignore
node_modules
*.log
.env
dist3. 性能优化
# 使用缓存友好的挂载
docker run -v $(pwd):/app:cached ...
# 对于大量小文件,考虑使用 delegated
docker run -v $(pwd):/app:delegated ...调试技巧
实时查看容器内文件变化:
# 进入容器 docker exec -it container_name bash # 查看挂载情况 mount | grep /app检查文件权限:
# 确保容器用户有权限访问挂载的文件 docker run -u $(id -u):$(id -g) ...
选择哪种方案取决于:
- 开发环境复杂度
- 团队协作需求
- 性能要求
- 部署环境(云/本地)
最简单的起点是使用 Docker Volume + 开发服务器的热重载功能。