繁体   English   中英

Docker + jwilder/nginx-proxy + jwilder/docker-gen + jrcs/letsencrypt-nginx-proxy-companion + php:7-fpm + wordpress:fpm

[英]Docker + jwilder/nginx-proxy + jwilder/docker-gen + jrcs/letsencrypt-nginx-proxy-companion + php:7-fpm + wordpress:fpm

我知道我真的很接近这一点,但我无法让最后一部分工作。 我几乎肯定它与需要在同一目录下的 WordPress 容器和 PHP 容器有关? 那么PHP可以处理那个目录下的文件吗? 我已经为此工作了一个半星期,但我正在崩溃,寻求帮助。

我可以大部分工作和不同的组合 - 但不是这个特定的组合。

我想要做的是使用 Nginx(每个站点都有自己的 WordPress 容器)PHP 7 为 MySQL 提供单独的容器(并共享数据库)nginx-proxy WordPress

我已经使用 Apache 与 WordPress 一起工作,但这不是我想要的。

我做了大量阅读和大量测试,确实发现我最初缺少 VIRTUAL_PROTO=fastcgi。 我看到在 nginx-proxy 容器中填充的配置......它们看起来是正确的,但我认为我的困惑与路径和虚拟环境有关。

我创建 docker network create nginx-proxy

这些是我拥有的文件和目录... /home/tj/db/docker-compose.yml /home/tj/mysite.com /home/tj/mysite.com/.env /home/tj/nginx-proxy /docker-compose.yml

/home/tj/db/docker-compose.yml

version: "3"

services:
   db:
     image: mysql:5.7
     volumes:
        - ../_shared/db:/var/lib/mysql
     restart: always
     environment:
        MYSQL_ROOT_PASSWORD: somewordpress
        MYSQL_DATABASE: wordpress
        MYSQL_USER: wordpress
        MYSQL_PASSWORD: wordpress
     container_name: db
     networks:
       - nginx-proxy

networks:
  nginx-proxy:
    external:
      name: nginx-proxy

/home/tj/mysite.com/.env

MYSQL_SERVER_CONTAINER=db
VIRTUAL_HOST=mysite.com
DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"
EMAIL_ADDRESS=tj@mysite.com
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wordpress

/home/tj/mysite.com/docker-compose.yml

version: "3"

services:
   wordpress:
     image: wordpress:fpm
     expose:
        - 80
     restart: always
     environment:
        VIRTUAL_HOST: ${VIRTUAL_HOST}
        LETSENCRYPT_HOST: ${VIRTUAL_HOST}
        LETSENCRYPT_EMAIL: ${EMAIL_ADDRESS}
        WORDPRESS_DB_HOST: db:3306
        WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
        WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_USER}
        WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
        VIRTUAL_PROTO: fastcgi
        VIRTUAL_PORT: 3030
        VIRTUAL_ROOT: /usr/share/nginx/html
     container_name: ${VIRTUAL_HOST}
     volumes:
        - ../nginx-proxy/html:/usr/share/nginx/html:rw

networks:
  default:
    external:
      name: nginx-proxy

/home/tj/nginx-proxy/docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx:1.17.7
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - conf:/etc/nginx/conf.d:ro
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
    restart: always

  dockergen:
    image: jwilder/docker-gen:0.7.3
    container_name: nginx-proxy-gen
    depends_on:
      - nginx
    command: -notify-sighup nginx-proxy -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
    restart: always

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy-le
    depends_on:
      - nginx
      - dockergen
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
      NGINX_DOCKER_GEN_CONTAINER: nginx-proxy-gen
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always

  php-fpm:
    image: php:7-fpm
    container_name: php
    environment:
      - VIRTUAL_HOST=docker.nevistechnology.com
      - VIRTUAL_ROOT=/usr/share/nginx/html
      - VIRTUAL_PORT=9000
      - VIRTUAL_PROTO=fastcgi
    restart: always
    ports:
      - 9000
    volumes:
      - ./html:/usr/share/nginx/html

volumes:
  conf:
  vhost:
  html:
  certs:

networks:
  default:
    external:
      name: nginx-proxy

现在,我能够开始工作的是,如果我使用“wordpress:latest”而不是“wordpress:fpm”,但我不想使用 Nginx 和 Apache...Apache 使用了大量内存,而我拥有所有我在 Nginx 中的旧配置和注释,所以我想让它工作。

我也有一些 Dockerfile 的东西我也想弄清楚——比如运行命令,但让我看看你们是否能先帮我解决这个问题。

另一件事 - 这更像是一个通用的 Linux 问题,但多年来我一直无法弄清楚,我只是默认使用 root,我知道这是不好的做法。 所以,我有我创建的用户“tj”,如下所示:

sudo useradd tj sudo usermod -aG sudo tj sudo usermod -aG docker tj sudo usermod -aG www-data tj sudo g+w /home/tj -R *

对于 Docker,我开始在我的 /home/tj 目录中工作。 当我尝试编辑文件或上传文件时,出现权限问题。 但是,如果我将目录和文件从www-data:www-data更改为tj:www-data or tj:tj ,它在 SFTP 或终端中对我有用,但是会出现网络问题,例如当我尝试上传时 - www-data在 WordPress sid 上有权限问题。

所以,我知道我参加聚会迟到了,但我可能有一些答案,所以这里什么都不做:

我最终让它运行起来,而且还运行了更多,但我不得不对代理进行相当多的调整: https : //github.com/PiTiLeZarD/nginx-proxy

我不得不考虑的是,fpm 图像仅运行 php! 任何资产或文件都必须绑定为 nginx-proxy 中的一个卷并进行配置,以便 nginx 获取文件而不是 fpm。 在我调整后的 nginx-proxy 中,我在模板中添加了一些关于此的内容:

{{ if (exists (printf "/etc/nginx/static_files/%s" $host)) }}
root {{ printf "/etc/nginx/static_files/%s" $host }};
{{ end }}

vhost.d/default:我添加了一个部分:

location / {
    location ~ \.php$ {
        try_files /dev/null @upstream;
    }
    try_files /assets/$uri $uri @upstream;
}

我调整了所有内容以获得 LOCATION_PATH=@upstream 环境变量(我有很多服务,所以有些仍然使用默认的“/”)

vhost.d/default_location,我在那里添加了 fastcgi 配置:

    index index.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

有很多东西需要配置和跟踪,但是坚持下去,有可能让它发挥作用。

关于根/用户问题,我将 php-fpm 图像作为 www-data:www-data(即 1000:1000)运行我还确保 1000:1000 链接到主机上的管理员用户,这样我就不会不要总是以问题告终。

fpm 的 www.conf 有一个用户/组部分,您可以在其中指定 www-data/www-data,我为用户构建了一个技巧:

# add a NOPASSWD to sudo for www-data
RUN printf 'www-data ALL=(ALL:ALL) NOPASSWD: ALL' | tee /etc/sudoers.d/www-data

# bind www-data user and group from 33:33 to 1000:1000
RUN rmdir /var/www/html \
    && userdel -f www-data \
    && if getent group www-data ; then groupdel www-data; fi \
    && groupadd -g 1000 www-data \
    && useradd -l -u 1000 -g www-data -G sudo www-data \
    && install -d -m 0755 -o www-data -g www-data /home/www-data \
    && find / -group 33 -user 33 2>/dev/null || echo "/var/www" | xargs chown -R 1000:1000

这一步将负责将所有内容从 root:root 切换到 www-data:www-data。 我还在我的 docker 镜像中安装了 sudo,我以前没有,但我遇到了没有它就很难解决的问题。

不确定这是否有帮助,它有点脱节,但话说回来,运行它需要大量移动部件才能完美地组合在一起;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM