Вопрос: Как управлять docker'ом?

Лучший ответ: Чтобы поставить доп расширения какие-то или внести любые изменения в образ контейнера, нужно создать свой кастомный Dockerfile. Например, для php это будет выглядеть следующим образом:# php/Dockerfile

FROM php:7-fpm:latest

MAINTAINER Vasya Pupkin

# Ставим, например, composer.

RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
Затем обновляем docker-compose.yml. Указываем, что будем использовать свой Dockerfile и указываем имя нового образа.php:
        build:
	    context: ./php
	    dockerfile: Dockerfile
        image: my-php
        volumes:
            - ./www:/www
            - ./php/log.conf:/usr/local/etc/php-fpm.d/zz-log.conf
        networks:
            - code-network
Чтоб теперь можно поиграться с композером, можно сделать следующие вещи:
1. Зайти в контейнер по ssh и запускать композер оттудаdocker-compose exec my-php bash
composer --version
2. Запустить композер с хостовой машиныdocker-compose exec my-php composer --version
илиdocker-compose run --rm  my-php  composer --version
Чтоб чуть упростить набор команд, можно создать скриптик на bash (установи себе git bash на windows, из него можно будет выполнять его).#!/usr/bin/env bash

COMPOSE="docker-compose"

if [ $# -gt 0 ]; then
    if [ "$1" == "composer" ]; then
        shift 1
        $COMPOSE run --rm \
            -w /www \
            my-php \
            composer "$@"

    # If "test" is used, run unit tests,
    # pass-thru any extra arguments to php-unit
    elif [ "$1" == "test" ]; then
        shift 1
        $COMPOSE run --rm \
            -w /www \
            my-php \
            ./vendor/bin/phpunit "$@"

    # If "npm" is used, run npm
    # from our node container
    elif [ "$1" == "npm" ]; then
        shift 1
        $COMPOSE run --rm $TTY \
            -w /var/www/html \
            node \
            npm "$@"
    else
        $COMPOSE "$@"
    fi
else
    $COMPOSE ps
fi
Ну и с его помощью можно делать следующее./dev.sh # docker-compose ps
./dev.sh logs my-php # docker-compose logs my-php
./dev.sh composer --version # выполнение любой composer команды
./dev.sh npm --version # выполнение любой npm команды
./dev.sh test --filter some_test_method # запуск phpunit тестов
P. S. У меня тоже, когда-то, докер сложновато шел. Это нормально.

Худший ответ: Собираем образ PHP
Стандартный официальный образ PHP не включает в себя никаких модулей, поэтому чтобы включить их нужно собрать свой образ на основе официального. Звучит немного страшновато, но на деле все просто. Создаем директорию для нашего образа images/php и в ней создаем файл Dockerfile следующего содержания:# Для начала указываем исходный образ, он будет использован как основа
FROM php:7.1-fpm
# Необязательная строка с указанием автора образа
MAINTAINER PHPtoday.ru <info@phptoday.ru>

# RUN выполняет идущую за ней команду в контексте нашего образа.
# В данном случае мы установим некоторые зависимости и модули PHP.
# Для установки модулей используем команду docker-php-ext-install.
# На каждый RUN создается новый слой в образе, поэтому рекомендуется объединять команды.
RUN apt-get update && apt-get install -y \
        curl \
        wget \
        git \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt mbstring mysqli pdo_mysql zip \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd
    
# Куда же без composer'а.
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Добавим свой php.ini, можем в нем определять свои значения конфига
ADD php.ini /usr/local/etc/php/conf.d/40-custom.ini

# Указываем рабочую директорию для PHP
WORKDIR /var/www

# Запускаем контейнер
# Из документации: The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, 
# or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.
CMD ["php-fpm"]
Также в этой папке создадим пока пустой php.ini, чтобы не было ошибки при сборке образа. Можете добавить в него нужные вам настройки.Источник