nginx, Plone Classic container example#

This example is a simple setup with one backend and data being persisted in a Docker volume.

nginx in this example is used as a reverse proxy.


Create an empty project directory named nginx-plone.

mkdir nginx-plone

Change into your project directory.

cd nginx-plone

nginx configuration#

Add a default.conf that will be used by the nginx image:

upstream backend {
  server backend:8080;

server {
  listen 80 default_server;
  server_name plone.localhost;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// https://;
    if (!-f $request_filename) {
      rewrite ^/(.*)$ /VirtualHostBase/http/plone.localhost:80/Plone/VirtualHostRoot/$1;

  location /VirtualHostBase/ {
    proxy_pass http://backend;


http://plone.localhost/ is the URL you will be using to access the website. You can either use plone.localhost, or add it in your /etc/hosts file or DNS, to point to the Docker host IP.

Service configuration with Docker Compose#

Now let's create a docker-compose.yml file:

version: "3"

    image: nginx
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - backend
    - "80:80"

    image: plone/plone-backend:6.0
      SITE: Plone
      TYPE: classic
      - data:/data
    - "8080:8080"

  data: {}

Build the project#

Start the stack with docker compose.

docker compose up -d

This pulls the needed images and starts Plone.

Access Plone via Browser#

After startup, go to http://plone.localhost/ and you should see the site. You can also open the main Plone control page where you can create more Plone sites at http://plone.localhost:8080.

Shutdown and cleanup#

The command docker compose down removes the containers and default network, but preserves the Plone database.

The command docker compose down --volumes removes the containers, default network, and the Plone database.