Volumes Docker Windows très lent

Petit mémo qui peut servir à d’autres. Docker est formidable, mais dès que vous utilisez des volumes Windows, les performances sont déplorables. Pour palier à cela, il est préférable de travailler directement dans le sous-système de fichiers Linux (WSL2).


Toujours avec le cas de Docker avec Magento 1.9 vu dans mon précédent article, je vais faire les modifications pour grandement accélérer les performances du serveur web et de MySQL en déplaçant leurs données vers le système de fichiers Linux et non Windows.

Sous-système WSL Ubuntu

Dans mon cas, je vais prendre Ubuntu (celui-ci doit être installé ainsi que WSL2 activé). Pour savoir où se situe l’arborescence du sous-système Ubuntu, il suffit dans l’Explorateur de fichiers de taper \\wsl$. On se retrouve alors avec des répertoires docker-desktop et docker-desktop-data qui sont propres à Docker pour Windows et également un répertoire Ubuntu ou se trouve le système de fichiers Ubuntu.

Je vais alors copier tout mon projet Docker – le répertoire projet_mage19 – sous \wsl$\Ubuntu\home\fabien\ et j’édite le docker-compose.yml pour refléter ces changements.

Maintenant il faut démarrer nos conteneurs sous l’environnement Ubuntu et non plus sous Windows. Dans une fenêtre PowerShell, j’ouvre une session WSL, je me place dans le répertoire de mon projet et je fais mon docker-compose :

$ wsl -d Ubuntu
$ cd /home/fabien/projet_mage19
$ docker-compose up -d

Et voilà, tout est 10 fois plus rapide.

Docker projet Magento 1.9 sous Windows

Ceci n’est pas un article à proprement parler, mais un mémo que je laisse visible car cela peut intéresser d’autres personnes.

Afin de me débarrasser d’un stack WAMP vieillissant et peu évolutif pour mes développements par Docker, je publie ci-dessous mon projet Magento 1.9, pour ceux, comme moi qui maintienne encore cet ancien CMS e-commerce.

Répertoire du projet

Il s’agit d’un stack LAMP classique : Apache, PHP 5.6, MySQL 5.7, PHPMyAdmin et memcached. Il y a 4 conteneurs. Niveau arborescence, mon projet Docker Magento 1.9 ressemble à ceci :

projet_mage19/
	confs/
	db_data/
	magento_data/
	mysql/
		conf.d/
	docker-compose.yml
	Dockerfile
  • confs : php.ini
  • db_data : les données MySQL
  • magento_data : le site Magento
  • mysql/conf.d : my.cnf

docker-compose.yml

La partie « command » du conteneur « db » permet d’avoir le my.cnf en lecture seule, sinon il est ignoré par MySQL.

version: "3.9"

services:
  db:
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql
      - ./mysql/conf.d/:/usr/local/mysqlconf
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password_root_mysql
      MYSQL_DATABASE: nom_database
      MYSQL_USER: nom_utilisateur
      MYSQL_PASSWORD: password_utilisateur
    command: >
      bash -c "

      cp /usr/local/mysqlconf/*.cnf /etc/mysql/conf.d/ && chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld
      "
    
  mage19:
    depends_on:
      - db
    build: .
    volumes:
      - ./magento_data:/var/www/html
    ports:
      - "80:80"
    restart: always
    stdin_open: true
    tty: true
    extra_hosts:
      - monsitemagento.local:127.0.0.1
    hostname: monsitemagento.local
    domainname: local
    
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
      
  memcached:
    image: bitnami/memcached:latest
    ports:
      - 11211:11211
    environment:
      - MEMCACHED_CACHE_SIZE=512
      
volumes:
  db_data: {}
  magento_data: {}
  confs: {}

Dockerfile

FROM php:5.6-apache

EXPOSE 80

RUN apt-get update -qq && \
    apt-get install -qy \
	libmemcached-dev \
	zlib1g-dev \
    git \
    gnupg \
    unzip \
    zip \
	&& pecl install memcached-2.2.0 \
    && docker-php-ext-enable memcached

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
	dom \
	hash \
	iconv \
	pcre \
	simplexml \
	mbstring \
	zip \
        gd \
	pdo \
	pdo_mysql \
	memcached
	
COPY confs/php.ini /usr/local/etc/php/conf.d/app.ini
	
RUN a2enmod rewrite
RUN service apache2 restart

my.cnf

[mysqld]
query_cache_type = 1
query_cache_size = 512M
query_cache_limit = 256M

tmp_table_size = 256M
max_heap_table_size = 256M
read_buffer_size = 128M
read_rnd_buffer_size = 128M
bulk_insert_buffer_size = 64M

myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 256M
myisam_repair_threads = 2

key_buffer_size = 256M
max_allowed_packet = 256M
table_open_cache = 1024
sort_buffer_size = 8M
thread_cache_size = 8

innodb_log_buffer_size = 32M
innodb_log_file_size = 32M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 1024M

php.ini

date.timezone = Europe/Paris

memory_limit = 1024M
max_execution_time=600

magic_quotes_gpc = off

opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 256M
opcache.revalidate_freq = 0
apc.enable_cli = On

upload_max_filesize = 16M
post_max_size = 16M

realpath_cache_size = 4096k
realpath_cache_ttl = 7200

display_errors = Off
display_startup_errors = Off

Démarrer les conteneurs avec docker-compose

Pour accéder au site via http://monsitemagento.local ne pas oublier d’ajouter une ligne dans le fichier hosts :

127.0.0.1       monsitemagento.local

Puis, dans un terminal, dans le répertoire projet_mage19 :

docker-compose up -d

Le résultat est (beaucoup) trop lent ? Allez lire l’article qui suit : Volumes Docker Windows très lent