Environment to develop and run TYPO3 in Docker containers
- Docker(4Mac) 17.09 or greater for build
- Docker Compose (included in Docker4Mac)
- A Traefik reverse proxy, e.g. docker-frontend
composer create-project t3easy/typo3-bootcamp awesome-project.tld
(Or clone the project with git and checkout the desired branch)
- Change to awesome-project.tld / open it in you favorite IDE
.envand adjust it to your needs, see below and comments in the file for more information E.g.
If you use a
.localhostvhost, you can access it with Chrome w/o a host entry.
- Add your vhost as a hosts entry for 127.0.0.1 / the box you're running docker on
- Start the environment with
docker-compose up -d
- Setup TYPO3
- With TYPO3 Console
docker-compose exec -u www-data typo3 vendor/bin/typo3cms install:setup
- Or with the browser
docker-compose exec -u www-data typo3 touch /app/private/FIRST_INSTALLOpen http://typo3.localhost/typo3/install.php and configure TYPO3
- With TYPO3 Console
- Go to
In this file you define the environment you'd like to setup.
There are two examples,
.env.dev to start an development environment and
.env.prod as a template to build and deploy your project.
To check the result, run
To deploy to a swarm write the result to a file
docker-compose config > stack.yml and use it
docker stack deploy --compose-file stack.yml myproject
Add all necessary compose files separated with
:, always start with the root
docker-compose.yml to have a proper project name and relative paths.
The settings of the last config wins.
More at https://docs.docker.com/compose/reference/envvars/#compose_file
The FQDN of the TYPO3 project.
It gets prefixed for other services, e.g. if you set VHOST to
you can reach Adminer at
adminer.typo3.localhost and Mailhog at
Adds additional names to the TYPO3 web service. The value must start with a comma (
The name of the docker network that Traefik can use to connect to the web service.
:cached for development on Mac, should be blank for development on Linux and production.
Define the restart policy for all services.
always for production and
no for development.
The image of the db service, see
Set the password of the root db user.
You should not set the password in the
.env file for production setup.
Set it on CLI
MYSQL_ROOT_PASSWORD=MyV3rySecretP4sswd docker-compose up -d
or set it in CI variables.
Bind the db service to a specified ip and port.
127.0.0.1: to publish a dynamic port to localhost only.
127.0.0.1:13306 to publish the port
13306 to publish
13306 to all available IP. ATTENTION! That allows access from anywhere!
The port is mapped to 3306, the MySQL/MariaDB port, inside the container.
See Access the database during development via tcp
Build the TYPO3 image with that PHP extensions.
The port the web container expose. Only if you use
To build a productive environment use
docker-compose -f .docker/build.yml from the root with an prepared
or by setting REDIS and LDAP in the environment of the builder.
If you build on GitLab CI, you can use
.docker/env.gitlab.yml to tag your images.
.gitlab-ci.example.yml for an example how to deploy to docker hosts with GitLab CI.
Consider to set
COMPOSE_PROJECT_NAME at the deploy job, to be able to deploy the project multiple times to the same docker-host, e.g. testing, staging and live.
A dynamic port is mapped to the database service port 3306. To get this port run:
docker-compose ps db
You'll get something like:
Name Command State Ports ------------------------------------------------------------------------------------- project_db_1 docker-entrypoint.sh --cha ... Up 127.0.0.1:32770->3306/tcp
32770 is the port on the local docker host to connect to.
To run a command inside the TYPO3 PHP Container use
E.g. flush the cache
docker-compose exec -u www-data typo3 typo3cms cache:flush
docker-compose exec -T db sh -c 'exec mysqldump --opt --single-transaction -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > dump.sql
docker-compose exec -T db sh -c 'exec mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < dump.sql # Setup new/development extensions docker-compose exec -u www-data typo3 typo3cms extension:setupactive --verbose
ssh user@server 'TYPO3_CONTEXT="Production" /path/to/typo3cms database:export' | docker-compose exec -T db sh -c 'exec mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' # Setup new/development extensions docker-compose exec -u www-data typo3 typo3cms extension:setupactive --verbose
The TYPO3 PHP image does not include mysql or mysqldump binary which are required by typo3-console.
Start a demo stack: