一、引言
Windows Subsystem for Linux 2 (WSL2)为Windows开发者提供了完整的Linux内核和环境,结合Docker Desktop,可以实现Linux开发环境和Windows系统的完美融合。openEuler在WSL2环境下运行稳定,配合Docker Desktop可以获得流畅的容器化开发体验。
本文将介绍在openEuler WSL2环境下,如何使用Docker Desktop进行容器化开发,包括环境配置、实际应用容器化、多容器编排、以及常见问题解决。相比在物理服务器上部署Kubernetes集群,这种方案更适合本地开发和测试,也是大多数开发者的实际使用场景。
二、环境配置
2.1 安装Docker Desktop
在Windows上安装Docker Desktop:
- 访问 https://www.docker.com/products/docker-desktop
- 下载并安装Docker Desktop for Windows
- 安装完成后启动Docker Desktop
配置WSL2集成:
Docker Desktop设置步骤:
1. 打开Docker Desktop
2. Settings → Resources → WSL Integration
3. 启用 "Enable integration with my default WSL distro"
4. 在列表中找到并启用 openEuler-24.03
5. 点击 "Apply & Restart"
2.2 在WSL2中验证Docker
bash
# 在openEuler WSL2中执行
docker --version
# Docker version 24.0.x
docker info
# 测试运行容器
docker run hello-world
# 查看运行状态
docker ps
# 预期输出示例:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2.3 配置镜像加速(可选)
在Docker Desktop中配置镜像加速:
json
// Settings → Docker Engine
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn"
],
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
}
}
三、实战案例:Python Flask应用容器化
3.1 创建Flask应用
bash
# 创建项目目录
mkdir -p ~/projects/flask-docker-app
cd ~/projects/flask-docker-app
# 创建应用代码
cat > app.py << 'EOF'
from flask import Flask, jsonify
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
return jsonify({
'message': 'Hello from openEuler WSL2!',
'hostname': socket.gethostname(),
'platform': os.uname().sysname
})
@app.route('/health')
def health():
return jsonify({'status': 'healthy'}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
# 创建依赖文件
cat > requirements.txt << 'EOF'
Flask==3.0.0
gunicorn==21.2.0
EOF
3.2 创建Dockerfile
bash
cat > Dockerfile << 'EOF'
FROM python:3.11-slim
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY app.py .
# 暴露端口
EXPOSE 5000
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:5000/health')" || exit 1
# 使用gunicorn运行
CMD ["gunicorn", "-b", "0.0.0.0:5000", "-w", "2", "app:app"]
EOF
3.3 构建和运行
bash
# 构建镜像
docker build -t flask-app:1.0 .
# 查看构建的镜像
docker images | grep flask-app
# 运行容器
docker run -d \
--name myflask \
-p 5000:5000 \
flask-app:1.0
# 查看容器状态
docker ps
# 测试应用
curl http://localhost:5000
# 查看日志
docker logs myflask
# 进入容器
docker exec -it myflask bash
# 查看完整输出示例
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
四、Docker Compose多容器应用
4.1 Web应用 + 数据库示例
bash
# 创建项目目录
mkdir -p ~/projects/flask-postgres
cd ~/projects/flask-postgres
docker-compose.yml:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
DATABASE_URL: postgresql://user:password@db:5432/mydb
depends_on:
db:
condition: service_healthy
restart: always
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
volumes:
postgres_data:
应用代码(app.py):
python
from flask import Flask, jsonify
import psycopg2
import os
app = Flask(__name__)
def get_db_connection():
conn = psycopg2.connect(os.environ['DATABASE_URL'])
return conn
@app.route('/')
def index():
try:
conn = get_db_connection()
cur = conn.cursor()
cur.execute('SELECT version();')
db_version = cur.fetchone()[0]
cur.close()
conn.close()
return jsonify({
'status': 'connected',
'database_version': db_version
})
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/health')
def health():
return jsonify({'status': 'healthy'}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
requirements.txt:
Flask==3.0.0
psycopg2-binary==2.9.9
gunicorn==21.2.0
启动应用:
bash
# 启动所有服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 测试
curl http://localhost:5000
# 停止服务
docker-compose down
五、实用开发工作流
5.1 开发环境容器化
开发用docker-compose.yml:
yaml
version: '3.8'
services:
dev:
image: python:3.11
working_dir: /workspace
volumes:
- .:/workspace
- pip_cache:/root/.cache/pip
ports:
- "5000:5000"
- "8888:8888" # Jupyter
command: bash -c "pip install -r requirements.txt && python app.py"
stdin_open: true
tty: true
volumes:
pip_cache:
5.2 使用VS Code连接容器
bash
# VS Code中安装扩展:
# - Remote - Containers
# - Docker
# 在容器中开发:
# 1. 右键点击运行中的容器
# 2. 选择 "Attach Visual Studio Code"
# 3. 在容器内直接编辑代码
5.3 数据持久化最佳实践
yaml
services:
app:
volumes:
# 绑定挂载(开发)
- ./app:/app
- ./config:/etc/app/config:ro
# 命名卷(数据持久化)
- app_data:/app/data
- cache:/app/cache
volumes:
app_data:
driver: local
cache:
driver: local
六、常见场景实战
6.1 Redis缓存服务
bash
# 启动Redis
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis:alpine redis-server --appendonly yes
# 测试连接
docker exec -it redis redis-cli ping
# PONG
# 使用Redis
docker exec -it redis redis-cli
> SET mykey "Hello WSL2"
> GET mykey
6.2 MySQL数据库
bash
# 启动MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=testdb \
-v mysql_data:/var/lib/mysql \
mysql:8.0
# 连接数据库
docker exec -it mysql mysql -uroot -prootpass
# 或使用客户端
mysql -h 127.0.0.1 -P 3306 -uroot -prootpass
6.3 Nginx静态网站
bash
# 创建网站目录
mkdir -p ~/projects/mynginx/html
cd ~/projects/mynginx
# 创建首页
cat > html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<title>openEuler WSL2 + Docker</title>
</head>
<body>
<h1>Hello from openEuler WSL2!</h1>
<p>Running in Docker container</p>
</body>
</html>
EOF
# 运行Nginx
docker run -d \
--name mynginx \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html:ro \
nginx:alpine
# 访问
curl http://localhost:8080
# 或在Windows浏览器打开:http://localhost:8080
七、WSL2特有优化
7.1 WSL2内存限制配置
在Windows用户目录下创建.wslconfig文件:
ini
# C:\Users\<YourUsername>\.wslconfig
[wsl2]
memory=8GB
processors=4
swap=2GB
localhostForwarding=true
7.2 Docker资源限制
在Docker Desktop设置:
Settings → Resources:
- CPUs: 4
- Memory: 6 GB
- Swap: 1 GB
- Disk image size: 50 GB
7.3 性能优化技巧
bash
# 1. 使用WSL2文件系统(更快)
cd ~/projects # 在WSL2内
# 不要使用 /mnt/c/Users/...(Windows文件系统,较慢)
# 2. 清理未使用的容器和镜像
docker system prune -a
# 3. 查看磁盘使用
docker system df
# 4. 清理构建缓存
docker builder prune

八、故障排查
8.1 Docker无法启动
bash
# 检查Docker Desktop是否运行
# 在Windows任务栏查看Docker图标
# 重启Docker Desktop
# 右键点击Docker图标 → Restart
# 检查WSL2集成
# Docker Desktop → Settings → Resources → WSL Integration
8.2 网络连接问题
bash
# 测试容器网络
docker run --rm alpine ping -c 4 baidu.com
# 检查端口映射
docker port <container_name>
# 检查容器IP
docker inspect <container_name> | grep IPAddress
8.3 文件权限问题
bash
# WSL2中的文件权限
# 确保文件在WSL2文件系统中(~/)
# 而不是Windows挂载点(/mnt/c/)
# 修复权限
chmod +x script.sh
chown -R $USER:$USER .
九、生产部署建议
9.1 环境变量管理
bash
# 使用.env文件
cat > .env << 'EOF'
DATABASE_URL=postgresql://user:pass@db:5432/mydb
REDIS_URL=redis://redis:6379/0
SECRET_KEY=your-secret-key
DEBUG=False
EOF
# docker-compose.yml中使用
services:
app:
env_file:
- .env
9.2 多环境配置
bash
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
9.3 CI/CD集成
yaml
# GitHub Actions示例
name: Docker Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push myapp:${{ github.sha }}
十、总结
通过本文的实践,我们在openEuler WSL2环境下完成了:
核心成果:
- ✅ Docker Desktop与WSL2的完美集成
- ✅ Flask应用的容器化部署
- ✅ Docker Compose多容器编排
- ✅ 常见服务的快速部署
- ✅ WSL2环境的性能优化
WSL2 + Docker的优势:
- 💻 Windows和Linux完美融合
- 🚀 本地开发环境快速搭建
- 🔄 容器与主机无缝交互
- 📦 轻量级,资源占用少
- 🛠️ 适合日常开发和测试
适用场景:
- ✅ 本地开发和测试
- ✅ 学习容器技术
- ✅ 原型验证
- ✅ 小型项目部署
不适用场景:
- ❌ 生产环境大规模部署
- ❌ 需要完整K8s集群
- ❌ 高性能要求的服务
对于生产环境的Kubernetes部署,建议使用云服务器或物理服务器。WSL2方案更适合开发者的日常工作,提供了便捷的容器化开发体验。
参考资源:
- Docker Desktop文档:https://docs.docker.com/desktop/
- WSL2文档:https://docs.microsoft.com/en-us/windows/wsl/
- Docker Compose文档:https://docs.docker.com/compose/
作者声明:本文为原创实践文章,所有操作均在openEuler WSL2 + Docker Desktop环境中验证。


