php - 如何 docker 化

标签 php wordpress nginx docker docker-compose

我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。

在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都启动了Web服务器(Apache2)和PHP-FPM。我看不到它与docker哲学如何兼容,后者指出“每个容器只有一个进程”。 我错了吗?

因此,我使用docker-compose启动了三个容器:web_db(MariaDB),web_server(nginx)和web_fpm(PHP-FPM)。通过web_server可以对包含数据的./www卷进行监视。因此,将Wordpress文件放置在./www/wordpress中之后,我可以通过继续http://my-ip/wordpress来访问它并将其安装在经典的Wordpress安装中。 这是正确的方法吗?

现在我的Wordpress已启动并正在运行,我想添加另一个服务。但是,那时我真的不知道什么是最佳实践。我应该只创建./www/other-service,并使用相同的容器吗?在我看来,只为一个进程提供一个容器会更好(例如,为什么要有两个执行PHP-FPM的容器?),但是也许我应该避免这样做来隔离我的服务。更确切地说,我认为创建带有第二个数据库的第二个容器可能是很好的(即必要的)。 我可以/应该为Nginx提供一个容器,为PGHP-FPM提供一个容器,为两个数据库提供两个容器吗?还是应该为其他服务重新创建整个堆栈,并在前面放置第三个nginx来做代理并管理HTTPS和证书?

最佳答案

Can/should I have one container for Nginx, one for PHP-FPM and two containers for the two databases? Or should I re-create an entire stack for the other service, with a third nginx in front to do the proxy and managing the HTTPS and certificates?



你好

我为wordpress网络所做的工作(在OVH Cloud上为10多个wordpress)正在为每个Wordpress创建一个堆栈,其中包括:
  • 1个带有Apache / PHP的Wordpress容器,我的wp-content文件夹
  • 的已安装卷
  • 1带有/ var / lib / mysql的安装卷的MySQL容器
  • 1 Nginx代理容器
  • 1让我们加密容器

  • 这种配置是当我在一台主机上获得一台wordpress时。如果我需要在同一主机上启动多个Wordpress,则可以使用Nginx代理启动一个堆栈+让我们加密,然后每个wordpress一个Wordpress / Mysql堆栈。

    我从不直接公开Wordpress容器的端口,我的所有域/虚拟主机均由Nginx代理容器配置,并自动配置为使用“让我们加密”中的SSL。

    这是我的 Rancher堆栈的一个示例,其中一个主机上有一个 Wordpress :
        db:
          environment:
            MYSQL_PASS: MYSQL_PASS
          labels:
            io.rancher.container.pull_image: always
            io.rancher.scheduler.affinity:host_label: server=TARGET
          tty: true
          image: tutum/mysql:5.5
          volumes:
          - /home/docker/wordpress/mysql/lib:/var/lib/mysql:rw
          stdin_open: true
        letsencrypt:
          labels:
            io.rancher.container.pull_image: always
            io.rancher.scheduler.affinity:host_label: server=TARGET
          tty: true
          image: jrcs/letsencrypt-nginx-proxy-companion:latest
          volumes:
          - /home/docker/nginx-proxy/ssl:/etc/nginx/certs:rw
          - /var/run/docker.sock:/var/run/docker.sock:ro
          volumes_from:
          - proxy
          stdin_open: true
        proxy:
          ports:
          - 443:443/tcp
          - 80:80/tcp
          labels:
            io.rancher.sidekicks: letsencrypt
            io.rancher.container.pull_image: always
            io.rancher.scheduler.affinity:host_label: server=TARGET
          tty: true
          image: jwilder/nginx-proxy:latest
          volumes:
          - /etc/nginx/vhost.d
          - /usr/share/nginx/html
          - /var/run/docker.sock:/tmp/docker.sock:ro
          - /home/docker/nginx-proxy/ssl:/etc/nginx/certs:ro
          - /home/docker/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
          stdin_open: true
        wordpress:
          environment:
            DB_NAME: DB_NAME
            DB_PASS: DB_PASS
            DB_USER: DB_USER
            LETSENCRYPT_EMAIL: LETSENCRYPT_EMAIL
            LETSENCRYPT_HOST: LETSENCRYPT_HOST
            VIRTUAL_HOST: www.nicolashug.com, nicolashug.com
            VIRTUAL_PORT: '80'
            WP_ADMIN_EMAIL: WP_ADMIN_EMAIL
            WP_ADMIN_PASSWORD: WP_ADMIN_PASSWORD
            WP_ADMIN_USER: WP_ADMIN_USER
            WP_PROTO: https
            WP_URL: www.nicolashug.com
          log_driver: ''
          labels:
            io.rancher.container.pull_image: always
            io.rancher.scheduler.affinity:host_label: server=TARGET
          tty: true
          log_opt: {}
          image: krustyhack/wordpress:latest
          links:
          - 'db:'
          volumes:
          - /home/docker/wordpress/wordpress/wp-content:/app/wp-content:rw
          stdin_open: true
    

    第一次启动堆栈时,我的Wordpress容器将使用wp-cli自动安装Wordpress,并用我的管理员登录名,密码,电子邮件等配置它,然后安装我的插件和模板。这使我可以启动许多Wordpress,而不必通过url安装它们。

    当我在一台主机上需要多个Wordpress时,我使用相同的堆栈,但没有Nginx代理,让我们加密放置在单独Rancher堆栈中的部分。

    即使在这种情况下,即使我更喜欢用Docker分隔所有应用程序/服务,我也发现将Apache / PHP / Wordpress放在一个容器中最简单。

    我需要做的下一件事是将Mysql与堆栈分开以将所有数据库放在一个服务器上,但这不是这里的讨论:p

    对于您的问题,我要做的是每个Wordpress使用容器Apache / PHP放置一个堆栈,使用Mysql容器使用Nginx代理使用另一个堆栈,让我们为服务器上的所有Wordpress加密。

    我希望我的英语还不错。 :)

    关于php - 如何 docker 化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37317028/

    相关文章:

    Nginx 限制域

    docker - 从由 kubernetes 管理的 docker 容器记录 nginx 事件

    php - 将 JSON 对象写入服务器上的 .json 文件

    php - 我应该在哪里放置 str_replace (' ' 、 '-' ,以删除 url 中的空格并加载正确的 sql 数据

    wordpress - 如何以编程方式删除 Woocommerce 中已应用的折扣优惠券?

    wordpress - 如何获取自定义帖子类型存档页面的链接? [WordPress]

    wordpress - 许可证类似于 MIT 许可证但没有销售能力?

    php - Docker 无法使用 PHP 连接到 mariadb

    php - SQL 按列中的属性排序

    PHP/xdebug 分析器 require_once 性能不佳