Skip to content
Snippets Groups Projects
README.md 12.4 KiB
Newer Older
jurgenhaas's avatar
jurgenhaas committed
# Docker for Drupal Development

jurgenhaas's avatar
jurgenhaas committed
This composer plugin prepares your local development environment for Docker using the framework from [Docker4Drupal](https://github.com/wodby/docker4drupal) by [Wodby](https://wodby.com).
jurgenhaas's avatar
jurgenhaas committed

## Requirements

jurgenhaas's avatar
jurgenhaas committed
This plugin is best used inside of [L3D](https://gitlab.lakedrops.com/docker/l3d) where no further requirements need to be met.
jurgenhaas's avatar
jurgenhaas committed

## Installation in your Drupal project

jurgenhaas's avatar
jurgenhaas committed
This is a composer plugin. It can be used both in composer based Drupal installations and also vanilla Drupal without composer.

jurgenhaas's avatar
jurgenhaas committed
If you're using the latest version of either [D8 Project Template](https://gitlab.lakedrops.com/composer/project/drupal-8) or [D9 Project Template](https://gitlab.lakedrops.com/composer/project/drupal-9), this docker4drupal plugin will be installed automatically as a dependency of the [Drupal Development Environment](https://gitlab.lakedrops.com/composer/drupal-development-environment).
jurgenhaas's avatar
jurgenhaas committed

In all other cases, simply install it by typing

```bash
composer require lakedrops/docker4drupal
```

This will install and configure all required files so that you can launch your Docker environment straight away without any additional settings. The actions being taken:

- Create and configure **docker-compose.yml** in your project root
- Create and configure **settings.docker.php** in your settings directory
- Modify your **settings.php** to load **settings.docker.php** if available
jurgenhaas's avatar
jurgenhaas committed
- Create Drush settings, aliases and shell-aliases in a `drush` subdirectory of the current directory
jurgenhaas's avatar
jurgenhaas committed
- Configure and (re)start a single Docker [Traefik](https://docs.traefik.io) service in the `~/.traefik` directory which serves as a proxy for any number of parallel running Docker4Drupal projects. This service is provided by the [LakeDrops Traefik Library](https://gitlab.lakedrops.com/composer/library/docker-traefik).
jurgenhaas's avatar
jurgenhaas committed
- Add those new files to **.gitignore** as you usually don't want them to be committed

jurgenhaas's avatar
jurgenhaas committed
### Installation in a vanilla Drupal project

jurgenhaas's avatar
jurgenhaas committed
Before you get started you should create (or add to an existing) `.lakedrops.yml` in your projects root like this:
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
```yaml
docker4drupal:
  webroot: relative/path/to/drupal/core
jurgenhaas's avatar
jurgenhaas committed
```

After that you can call

```bash
composer require lakedrops/docker4drupal
```

and everything will be configured for you.

jurgenhaas's avatar
jurgenhaas committed
## Usage

jurgenhaas's avatar
jurgenhaas committed
All the commands need to be called from the root of your main Drupal project.

### Updating Docker-Compose configuration

```bash
# With Ahoy
ahoy update

# Directly
composer lakedrops:docker4drupal
```

jurgenhaas's avatar
jurgenhaas committed
### Starting the Docker containers

```bash
jurgenhaas's avatar
jurgenhaas committed
# With Ahoy
ahoy up

# Directly
jurgenhaas's avatar
jurgenhaas committed
```

### Stopping the Docker containers

```bash
jurgenhaas's avatar
jurgenhaas committed
# With Ahoy
ahoy stop

# Directly
jurgenhaas's avatar
jurgenhaas committed
```

### Access the services

The following services are available in your browser while the Docker containers are up and running:

- Dashboard: http://docker.localhost:8080
jurgenhaas's avatar
jurgenhaas committed
- Drupal site: http://[PROJECTNAME].docker.localhost:8000
- PhpMyAdmin: http://pma.[PROJECTNAME].docker.localhost:8000
- Mailhog	http://mailhog.[PROJECTNAME].docker.localhost:8000
- Solr	http://solr.[PROJECTNAME].docker.localhost:8000
- Node	http://front.[PROJECTNAME].docker.localhost:8000
- Varnish	http://varnish.[PROJECTNAME].docker.localhost:8000
jurgenhaas's avatar
jurgenhaas committed

Note that Solr, Node and Varnish are not enabled by default. See the customization chapter below to learn how you can enable them.

### PHP Debugging

By default, PHP is configured with XDebug being enabled and you should check the instructions for your IDE on how to get started with a debugging session.

### Watch the logs

Each service (nginx, php, db, etc.) provides their own logs and it is very easy to access them:

```bash
jurgenhaas's avatar
jurgenhaas committed
docker-compose logs -f [SERVICENAME]
jurgenhaas's avatar
jurgenhaas committed
```

jurgenhaas's avatar
jurgenhaas committed
Each service has their own name:
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
- mailhog
- mariadb
- nginx
- node
- php
- pma
- redis
- solr
- varnish
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
### Configure SSH access to your live site

By default, you do **not** have to configure SSH access to your live site. However, if you want to pull the database and/or files from the live site, SSH access comes in pretty handy and the next chapter about Drush will show you how to make use of it.

For the configuration of the access, you need to do two things:

#### Configure your Drush alias

In your project root on your host you'll find a `drush` subdirectory with a file called `aliases.drushrc.php` with a `dev` and a `live` alias. THe first one is configured automatically and the second is empty by default. You have to provide the details manually:

- **root**: the full path to the Drupal root directory on the remote host
- **uri**: the domain and optional base path of the live website
- **remote-host**: a valid host name or IP address of that remote host - if you're in doubt, use the domain name from the **uri** above
- **remote-user**: the username under which you can access the remote host over SSH

There are potentially more options possible, for details please refer to the Drush documentation on this.

#### Configure SSH access from the PHP container

This feature is only available if SSH agent forwarding is enabled on your host. There is a [good tutorial](https://developer.github.com/v3/guides/using-ssh-agent-forwarding/#your-local-ssh-agent-must-be-running) available if you need any help.

Your host SSH configuration is automatically forwarded to the PHP docker container using sockets and you don't have to do anything to make it work, as long as your host is configured correctly to access your live site via SSH - in this case the PHP container can too. This works by mounting and forwarding your `SSH_AUTH_SOCK` environment variable to `/ssh-agent` inside the PHP container, so that the user inside that container can utilize your SSH settings like your user outside the contain who built them.

Typical issues that may cause trouble in this context are:

- **Permission**: the user inside the container has to have the permission to access your SSH auth socket. The best way to ensure that is to run services inside the container as root. This should be OK in a development environment.
- **SSH key should be added to the socket**: Very often, that has already been done at some point during setup of your environment but if not, you should remember to add your key by calling `ssh-add /path/to/your/key` from the host.
jurgenhaas's avatar
jurgenhaas committed

### Using Drush

jurgenhaas's avatar
jurgenhaas committed
This plugin configures Drush with several settings, aliases and shell-aliases that make your developer life much easier. You can either enter the PHP container and execute Drush there, or you can call every Drush command from your host. When you're using the L3D framework, simply call `drush` in your L3D container and everything else happens magically in the background.
jurgenhaas's avatar
jurgenhaas committed

```bash
# Entering PHP Container
docker-compose exec php sh
# Call Drush command
drush site-aliases
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
# ...or, call that command from your host:
docker-compose exec php drush site-aliases
```
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
Even better, you can create shell aliases (see below) for your host's shell which will make that even easier:
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
```bash
jurgenhaas's avatar
jurgenhaas committed
drush site-aliases
jurgenhaas's avatar
jurgenhaas committed
```
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
If you have configured SSH access to your live site (see above) then you can easily pull the database and/or the files from your live site into your development environment easily:
jurgenhaas's avatar
jurgenhaas committed

```bash
jurgenhaas's avatar
jurgenhaas committed
# Pull the database
drush pull-sql

# Pull the files
drush pull-files

# Pull both
drush pull-all
jurgenhaas's avatar
jurgenhaas committed
```

### Further reading

What else can be done with the Docker environment is best described in the [Docker4Drupal Documentation](http://docs.docker4drupal.org/en/latest/).

## Customization

jurgenhaas's avatar
jurgenhaas committed
To overwrite the default settings for the Docker environment, add the relevant parts from this array to your `.lakedrops.yml` file in the root of your project:

```yaml
docker4drupal:
  projectname: [NAME OF CURRENT DIRECTORY]
  ci_home: /home/gitlab-runner
  docker0:
    ip: [IP OF YOUR DOCKER HOST]
    proxy: [IP OF TRAEFIK PROXY]
  traefik:
    domain: docker.localhost
    usessl: 0
    port: 8000
    ports: 8443
    cert: fullchain.pem
    key: privkey.pem
jurgenhaas's avatar
jurgenhaas committed
  live:
    root: ''
    uri: ''
    host: ''
    user: ''
  drush:
    sql:
      tables:
        structure:
          - cache
          - cache_*
          - history
          - search_*
          - sessions
          - watchdog
        skip:
          - migration_*
  drupal:
jurgenhaas's avatar
jurgenhaas committed
  php:
jurgenhaas's avatar
jurgenhaas committed
    xdebug: 1
  webserver:
    type: apache
  varnish:
    enable: 0
  redis:
jurgenhaas's avatar
jurgenhaas committed
  dbbrowser:
    type: pma
  solr:
    enable: 0
jurgenhaas's avatar
jurgenhaas committed
  node:
    enable: 0
    key: ''
    path: ''
  memcached:
    enable: 0
  rsyslog:
    enable: 0
  athenapdf:
    enable: 0
    key: ''
  blackfire:
    enable: 0
    id: ''
    token: ''
  webgrind:
    enable: 0
  wkhtmltox:
    enable: 0
jurgenhaas's avatar
jurgenhaas committed
Once you've changed those values, run `ahoy update` (or `composer lakedrops:docker4drupal`) and the environment will be re-configured. The next time you start your Docker environment those new values will be used.

### Adding new Docker services or enhancing existing ones

You can add more details to you `.lakedrops.yml` configuration to create additional Docker services or enhance existing ones:

```yaml
docker4drupal:
  docker-compose.yml:
    services:
      php:
        environment:
          MY_VAR: value
      mariadbd6:
        image: wodby/mariadb:10.5
jurgenhaas's avatar
jurgenhaas committed
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: drupal
          MYSQL_USER: drupal
          MYSQL_PASSWORD: drupal
      mycustomservice:
        image: mydomain/myimage
```
jurgenhaas's avatar
jurgenhaas committed
This will add another environment variable to the php container, define a second mariadb container named `mariadbd6` which may be used e.g. for a migration from a separate database and also a custom service with your own image and configuration.
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
Please remember to update docker compose with `ahoy update` and then recreate your containers with `ahoy up` after changing these settings.
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
### More configuration tweaks
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
#### Customizing the apache config
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
```yaml
docker4drupal:
  webserver:
    overwriteconfig: 1
jurgenhaas's avatar
jurgenhaas committed
```

jurgenhaas's avatar
jurgenhaas committed
With this setting you get the apache container to include the file `./apache/vhost.conf` relative to your project root when loading up.
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
#### Adding more domain names to be routed to your apache container
jurgenhaas's avatar
jurgenhaas committed
```yaml
docker4drupal:
  extradomains:
    - domain1.example.com
    - domain2.example.com
```
jurgenhaas's avatar
jurgenhaas committed

jurgenhaas's avatar
jurgenhaas committed
## Tipps & Tricks

jurgenhaas's avatar
jurgenhaas committed
### Some notes about localhost subdomains

The domain `localhost` is always defined to be resolved by the IP address 127.0.0.1 which is exactly what we need to work with local installations like this. Using subdomains of localhost to tell Docker and Traefik which of the containers to route the requests to, is what makes this environment really powerful. So, you can use `http://project1.docker.localhost:8000` for the development website and `http://pma.project1.docker.localhost:8000` for the PhpMyAdmin portal of that site which is served by a different service in a different container.

There is some debate whether such subdomains are legitimate or not and Chrome/Google is of the opinion that it is perfectly OK and according to the RFA which defines that stuff. That means, all this works just fine in Chrome. Unfortunately, Firefox/Mozilla has not implemented that standard (yet) and hence it won't work in that browser without tweaking your local hosts file. Should you want to use Firefox, add a line `127.0.0.1 project1.docker.localhost pma.project1.docker.localhost ...` to your `/etc/hosts` file on your host with a space limited list of all possible domains you're going to use.

jurgenhaas's avatar
jurgenhaas committed
### Running multiple sites in parallel

jurgenhaas's avatar
jurgenhaas committed
This plugin configures the Docker containers such that any number of them can be launched in parallel. And as each of them get individual project names which will then be part of the domain name(s), you can use them all at the same time. To make this possible, a separat Docker service container will be created and launched, which operates as a proxy to route your local traffic to the always correct docker container with the correct development website.

### Working with wkhtmltox

When using the Drupal module `print` then go to `admin/config/user-interface/print/pdf/wkhtmltopdf` and remove the options `--footer-font-size 7 --footer-right '[page]'` because they don't work in the unpatched QT version.

jurgenhaas's avatar
jurgenhaas committed
## Links

For more details we recommend the following links:

- Docker Engine
  - [Home](https://www.docker.com)
  - [Documentation](https://docs.docker.com/engine)
- Docker Composer
  - [Home](https://github.com/docker/compose)
  - [Documentation](https://docs.docker.com/compose)
- Docker4Drupal
  - [Home](https://github.com/wodby/docker4drupal)
  - [Documentation](https://wodby.com/stacks/drupal/docs/local)
jurgenhaas's avatar
jurgenhaas committed
  - [Wodby](https://wodby.com)