Как запустить контейнер MySQL в WSL (Windows Subsystem for Linux)?

Работаю над проектом на Linux и решил попробовать запустить его на Windows через WSL. Docker и остальные компоненты установил — большинство контейнеров поднимаются, но mysql не стартует.
  • 21 марта 2026 г. 12:00
Ответы на вопрос 3
Коротко — самая частая причина, почему MySQL из Docker не стартует в WSL: вы монтируете каталог данных из Windows (через /mnt/c/...) и MySQL ломается из‑за отсутствия unix‑прав/свойств файловой системы DrvFs. Решение — использовать docker volume или WSL (ext4) путь, плюс проверить права и логи контейнера.

Что сделать шаг за шагом

1) Проверить логи контейнера
- Посмотреть статус и логи:
  docker ps -a
  docker logs <container_name_or_id>
  docker inspect --format='{{json .Mounts}}' <container>
Ищите ошибки вроде "InnoDB: Unable to lock ./ibdata1", "The server quit without updating PID file", или сообщения про права/ownership.

2) Если вы монтируете папку из Windows (например /mnt/c/…)
- НЕ монтируйте Windows‑файловую систему в /var/lib/mysql — MySQL часто не работает на DrvFs/9p (нет unix‑прав, symlink, атрибутов).
- Вместо этого:
  - Используйте docker volume (рекомендуется), либо
  - Используйте путь в файловой системе WSL (например /home/you/project/mysql-data), НЕ /mnt/c/…

Пример безопасного запуска (docker volume):
  docker run -d --name mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -p 3306:3306 \
    -v mysql_data:/var/lib/mysql \
    mysql:8.0

Или docker‑compose (файл docker-compose.yml):
  version: '3.8'
  services:
    db:
      image: mysql:8.0
      environment:
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: mydb
        MYSQL_USER: user
        MYSQL_PASSWORD: pass
      volumes:
        - mysql_data:/var/lib/mysql
      ports:
        - "3306:3306"
  volumes:
    mysql_data:

3) Если уже есть volume/папка и MySQL жалуется на права
- Установите правильного владельца (в официальном образе mysql пользователь mysql обычно есть в контейнере):
  docker run --rm -v mysql_data:/var/lib/mysql --entrypoint "" mysql:8.0 \
    bash -c "chown -R mysql:mysql /var/lib/mysql || true"
Если вы используете bind‑mount в WSL (ext4), можно:
  sudo chown -R 999:999 /home/you/project/mysql-data
(UID 999 — часто UID mysql в образе; безопаснее делать chown внутри контейнера как выше).

4) Убедитесь, что Docker в WSL запущен корректно
- Используете ли вы Docker Desktop с интеграцией WSL2? (Docker Desktop → Settings → Resources → WSL Integration)
- WSL должен быть v2 (wsl -l -v).

5) Если контейнер падает — соберите диагностические данные и пришлите их
- Выходы команд:
  docker ps -a
  docker logs <container>
  docker inspect <container>
  ls -la /путь/к/вашему/маунту (внутри WSL, если bind‑mount)
Я помогу по логам.

Типичные сообщения и что они значат
- "Can't create/write to file … permission denied" — проблема прав или используете Windows FS.
- "InnoDB: Unable to lock ./ibdata1" — другой mysql процесс или повреждённые файлы; возможно файлы созданы на Windows FS.
- "The server quit without updating PID file" — обычно следствие ошибок файловой системы/прав.

Если хотите — пришлите:
- docker run/compose команду, которую вы используете,
- вывод docker logs для упавшего контейнера,
- путь к тому каталогу, который монтируете (в WSL: /home/... или /mnt/c/...).

Помогу предложить точное решение по ошибкам из логов.
<code>rm -rf /var/lib/mysql/*</code> внутри контейнера тут не поможет, потому что <code>/var/lib/mysql</code> у тебя примонтирован с хоста и для <code>--initialize</code> каталог должен быть полностью пустым. Если данные не нужны, удали именно хостовую папку: <pre><code>rm -rf ./data/docker-files/mysql-db &amp;&amp; mkdir ./data/docker-files/mysql-db</code></pre> и пересоздай контейнер. На будущее для MySQL под WSL проще использовать именованный volume вместо bind mount — с ними таких проблем нет.
Просто поставьте сразу нормальный <a href="https://www.virtualbox.org/" rel="nofollow">VirtualBox</a> и не тратьте своё время на решение проблем этого огрызка. Далее ставите полноценный дебиан, а в нём уже одной командой легко ставите <code>mariadb</code> и всё сразу работает без проблем. <br/> <pre><code>sudo apt-get install mariadb-server mariadb-client </code></pre> <br/> Если так сильно хочется докер — то он точно так же легко ставится и без проблем используется.
Похожие вопросы