I'd suggest to first get acquainted with the details of a pip installation (as different from a buildout installation) before you get confused by docker's specifics.
The following is a minimal pip installation of Plone 6 Classic UI which can help to get used with pip's installations:
# install packages
sudo apt-get install -y python3-venv
sudo apt-get install -y git
# set variables
PLONE_VERSION=6.0.2
PLONE_NAME=Plone-${PLONE_VERSION}
PLONE_HOME=${HOME}/${PLONE_NAME}
PLONE_CONSTRAINTS=https://dist.plone.org/release/${PLONE_VERSION}/constraints.txt
PYTHON_TARGET_DIR=/usr/bin
# create venv
${PYTHON_TARGET_DIR}/python3 -m venv "${PLONE_HOME}"
# install pip setuptools and wheel
${PLONE_HOME}/bin/python -m pip install -U pip wheel setuptools -c ${PLONE_CONSTRAINTS}
# install Plone
${PLONE_HOME}/bin/pip --debug install Plone -c ${PLONE_CONSTRAINTS}
# install zope.mkzeoinstance and cookiecutter==2.1.1
${PLONE_HOME}/bin/pip install zope.mkzeoinstance -c ${PLONE_CONSTRAINTS}
${PLONE_HOME}/bin/pip install cookiecutter==2.1.1 -c ${PLONE_CONSTRAINTS}
cd ${PLONE_HOME}
# create zeoinstance with mkzeoinstance
${PLONE_HOME}/bin/mkzeoinstance zeoserver 127.0.0.1:8101
# create zopeinstance (aka client) with cookiecutter using a yaml config file
cat <<EOF | tee ${PLONE_HOME}/client.yaml
default_context:
target: 'client'
wsgi_listen: '*:8081'
initial_user_name: 'admin'
initial_user_password: 'secret'
db_blobs_mode: 'shared'
db_storage: 'zeo'
db_zeo_server: '127.0.0.1:8101'
db_zeo_read_only: false
db_zeo_read_only_fallback: false
db_blobs_location: "blobstorage"
EOF
${PLONE_HOME}/bin/cookiecutter \
-f --no-input \
--config-file "${PLONE_HOME}/client.yaml" \
--checkout 1.0.0b2 https://github.com/plone/cookiecutter-zope-instance
# run zeo in background
${PLONE_HOME}/bin/runzeo -C ${PLONE_HOME}/zeoserver/etc/zeo.conf &
# run wsgi in background
${PLONE_HOME}/bin/runwsgi -v ${PLONE_HOME}/client/etc/zope.ini &
# alternatively run wsgi in debug mode
${PLONE_HOME}/bin/runwsgi -dv ${PLONE_HOME}/client/etc/zope.ini
The directory structures are as follows (The directories under "site-packages" are omitted)
After installing venv, pip, setuptools and wheel the directory structure is as follows:
.
βββ bin
βββ include
βββ lib
β βββ python3.9
β βββ site-packages
β βββ ...
βββ lib64 -> lib
βββ share
βββ python-wheels
After pip installing Plone you get some header files for persistence and zope.proxy and more packages under "site-packages":
.
βββ include
βββ site
βββ python3.9
βββ persistent
βββ zope.proxy
after create zeoinstance with mkzeoinstance you get a directory called "zeoserver" (this can be defined in when calling "mkzeoinstance")
.
βββ zeoserver
βββ bin
βββ etc
βββ log
βββ var
after create zope instance with cookiecutter you get the directories "blobstorage" and "client" (the names can be defined in the yaml config-file passed to cookiecutter)
.
βββ blobstorage
βββ client
βββ etc
βββ var
βββ cache
βββ log
The complete final structure is something like:
.
βββ bin
βββ blobstorage
βββ client
β βββ etc
β βββ var
β βββ cache
β βββ log
βββ include
β βββ site
β βββ python3.9
β βββ persistent
β βββ zope.proxy
βββ lib
β βββ python3.9
β βββ site-packages
β βββ ...
βββ lib64 -> lib
βββ share
β βββ python-wheels
βββ zeoserver
βββ bin
βββ etc
βββ log
βββ var
When you compare this strucure with the one in docker (backend) they are similar. The main difference (as @davisagli explained above) are that the directories for zeo, zope, blobstorage, filestorage, log etc. have other names and are placed elsewhere. Here a docker backend directory structure to compare:
.
βββ bin
βββ etc
β βββ package-includes
β βββ zope.conf.d
βββ include
β βββ python3.11
β βββ site
β βββ python3.11
β βββ persistent
β βββ zope.proxy
βββ lib
β βββ python3.11
β βββ site-packages
β βββ ...
βββ lib64 -> lib [recursive, not followed]
βββ scripts
βββ var -> /data
βββ blobstorage
βββ cache
βββ filestorage
βββ log