openEuler WSL2容器化开发实战:Docker Desktop集成与应用部署

一、引言

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

  1. 访问 https://www.docker.com/products/docker-desktop
  2. 下载并安装Docker Desktop for Windows
  3. 安装完成后启动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环境下完成了:

核心成果

  1. ✅ Docker Desktop与WSL2的完美集成
  2. ✅ Flask应用的容器化部署
  3. ✅ Docker Compose多容器编排
  4. ✅ 常见服务的快速部署
  5. ✅ WSL2环境的性能优化

WSL2 + Docker的优势

  • 💻 Windows和Linux完美融合
  • 🚀 本地开发环境快速搭建
  • 🔄 容器与主机无缝交互
  • 📦 轻量级,资源占用少
  • 🛠️ 适合日常开发和测试

适用场景

  • ✅ 本地开发和测试
  • ✅ 学习容器技术
  • ✅ 原型验证
  • ✅ 小型项目部署

不适用场景

  • ❌ 生产环境大规模部署
  • ❌ 需要完整K8s集群
  • ❌ 高性能要求的服务

对于生产环境的Kubernetes部署,建议使用云服务器或物理服务器。WSL2方案更适合开发者的日常工作,提供了便捷的容器化开发体验。


参考资源

作者声明:本文为原创实践文章,所有操作均在openEuler WSL2 + Docker Desktop环境中验证。

相关推荐
用户03284722207021 小时前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造