在Windows上设置Docker PHP非常缓慢且痛苦

7
我正在使用带有Hyper-V、4核心和8GB内存的Docker for Windows,但我的PHP项目页面加载时间长达40秒。
我的设置使用自签名证书,但我认为问题与其他事情有关。
在docker构建期间,我收到了以下警告:
“---> Running in 46329f96a79f 重新启动Apache httpd web服务器:apache2[Mon Jun 11 09:17:26.151516 2018] [ssl:warn] [pid 23] AH01906: localhost:443:0服务器证书是CA证书(BasicConstraints: CA == TRUE !?) [Mon Jun 11 09:17:26.151605 2018] [ssl:warn] [pid 23] AH01909: localhost:443:0服务器证书不包含与服务器名称匹配的ID”
由于非https页面也加载得很慢,所以我认为问题出在其他方面。
我的Docker文件如下:
FROM php:5.6-apache
COPY server.crt /etc/apache2/ssl/server.crt
COPY server.key /etc/apache2/ssl/server.key
RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN apt-get update &&\
apt-get install --no-install-recommends --assume-yes --quiet ca-certificates 
curl git &&\
rm -rf /var/lib/apt/lists/*
RUN curl -Lsf 'https://storage.googleapis.com/golang/go1.8.3.linux- 
amd64.tar.gz' | tar -C '/usr/local' -xvzf -
ENV PATH /usr/local/go/bin:$PATH
RUN go get github.com/mailhog/mhsendmail
RUN cp /root/go/bin/mhsendmail /usr/bin/mhsendmail
RUN echo 'sendmail_path = /usr/bin/mhsendmail --smtp-addr mailhog:1025' > 
/usr/local/etc/php/php.ini
COPY ./ /var/www/html/
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN a2enmod rewrite
RUN a2enmod ssl
COPY dev.conf /etc/apache2/sites-enabled/dev.conf
RUN service apache2 restart
EXPOSE 80
EXPOSE 443

当我点击链接时,浏览器栏显示“等待…”大约40秒,但页面内容本身显示得非常快。这可能是DNS问题吗?

你是否正在使用卷共享把代码放在里面?如果是这样,请尝试将整个代码也放在 Docker 镜像中,看看能否加快速度。 - Tarun Lalwani
不,我不认为我正在共享一个卷。我使用COPY ./ /var/www/html/将所有代码复制到Docker容器中。 - user3411864
2
@delboy1978uk 如果您编辑的内容不在dockerfile的第一行,则整个docker构建过程不会重新启动。Docker很友好,当重新构建镜像时默认使用缓存。在更改或编辑dockerfile指令之前的所有内容都将尝试使用缓存。但是,在需要快速配置和测试的情况下,如果可能的话,可以连接到相关容器并在容器内进行更改,并使用docker commit保存配置。 - Jouster500
编辑更新功能是一个不同的挑战需要解决。我想这与我现在面临的速度问题无关。 - user3411864
@IvanVartanyan 我使用了Chrome浏览器的网络选项卡。在40秒结束之前,它不会显示任何请求,直到页面开始加载。 - user3411864
显示剩余6条评论
1个回答

4

我将分享使用PHP + Redis + MySQL + Nginx的Docker设置,看看它是否对你有用!

我的Dockerfile

FROM php:7.1-fpm

RUN apt-get update
RUN apt-get install -y zlib1g-dev \
    libjpeg-dev \
    libpng-dev \
    libfreetype6-dev

# Add Microsoft repo for Microsoft ODBC Driver 13 for Linux
RUN apt-get update && apt-get install -y \
    apt-transport-https \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update

# Install Dependencies
RUN ACCEPT_EULA=Y apt-get install -y \
    unixodbc \
    unixodbc-dev \
    libgss3 \
    odbcinst \
    msodbcsql \
    locales \
    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen

RUN pecl install pdo_sqlsrv-4.1.8preview sqlsrv-4.1.8preview \
    && docker-php-ext-enable pdo_sqlsrv sqlsrv

RUN ln -s /usr/lib/x86_64-linux-gnu/libsybdb.a /usr/lib/

RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install zip

RUN mkdir -p /code
ENV HOME=/code
WORKDIR $HOME

USER root
COPY ./ $HOME

在这个Docker文件中,还有一个SQLServer连接插件(我已经将许多项目与其集成)。
现在是我的docker-compose.yml文件。
web:
    container_name: your_web_container_name
    image: nginx
    ports:
        - "80:80"
    volumes:
        - ./:/code
        - ./host.conf:/etc/nginx/conf.d/default.conf
    links:
        - php:php
redis:
    container_name: your_redis_container_name
    image: redis
php:
    container_name: your_php_container_name
    build: ./
    dockerfile: ./Dockerfile
    volumes:
        - ./:/code
    links:
        - db
        - redis
db:
    container_name: your_database_container_name
    image: mysql:5.6
    volumes:
        - /var/lib/mysql
    ports:
        - "3306:3306"
    environment:
        - MYSQL_USER=docker
        - MYSQL_DATABASE=docker
        - MYSQL_ROOT_PASSWORD=docker
        - MYSQL_PASSWORD=docker

nginx的默认配置文件为default.conf:
server {
    listen 80 default_server;
    root /var/www/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9001;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

我希望这对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接