我正在玩小型服务器,试图对运行在其上的服务进行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创建一个堆栈,其中包括:
这种配置是当我在一台主机上获得一台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/