2168
                    
                    Nov. 21, 2022, 2:22 p.m.
                
                Шпаргалка по docker & docker-compose (Debian 11)
Задачи:
- Установить docker и docker-compose
 - Создать Dockerfile
 - Объединить несколько образов с помощью docker-compose
 
Установка
apt update
apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list  /dev/null
apt update
apt-cache policy docker-ce
apt install docker-ce docker-compose
Если не работает, то необходимо его перезапустить, после установки docker-compose единоразово может выпать в ошибку.
systemctl status docker 
Базовые команды docker
docker -v 
Список рабочих контейнеров
docker ps
Список всех контейнеров
docker ps -a
Список образов
docker images
Поиск образа в репозитории hub.docker.com
docker search nginx
Скачивание ИЛИ обновление образа
docker pull nginx
Запуск с отображением состояния контейнера
docker run -it -p 80:80 nginx:latest
Запуск в фоновом режиме
docker run -d -p 80:80 nginx:latest
Создание копии контейнера с другим тегом
docker tag nginx:v1 nginx:v2
Сборка контейнера из Dockerfile в текущей директории
docker build -t customimage:latest .
Команды для удаления всех контейнеров и образов
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
yes| docker container prune
docker rmi $(docker images -q)
docker images -q |xargs docker rmi
docker volume rm $(docker volume ls -q)
Команды для входа в контейнер и сохранения изменений
$docker exec -it bash
если нужно сохранить изменения:
$docker commit updated_image:v3
Создание Dockerfile – пример
# Исходный образ для создания контейнера
FROM debian:latest 
# Копирование дополнительных файлов с конфигурациями nginx.conf & entrypoint.sh
COPY conf /conf
# Запуск процедуры сборки контейнера, первым шагом идет установка часового пояса, далее установка nginx+php8.0 _fpm, установка даты и времени в php, скачивание(последней версии)-разархивирование-установка прав доступа на phpMyAdmin. И только в конце устанавливаются файлы конфигурации, в противном случае процесс сборки контейнера закончится с ошибкой.
RUN cp /usr/share/zoneinfo/Asia/Yekaterinburg /etc/localtime \ 
 && apt-get update \
 && apt-get install -y \ 
 ca-certificates \
 apt-transport-https \
 software-properties-common \
 wget \
 curl \
 nginx \
 gpg \
 lsb-release \
 && wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \
 && sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \
 && apt-get update \
 && apt-get install -y \ 
 php8.0-fpm \
 php8.0-common \
 php8.0-mysql \
 php8.0-zip \
 php8.0-gd \
 php8.0-mbstring \
 php8.0-curl \
 php8.0-xml \
 php-pear \
 php8.0-bcmath \ 
  && echo "timezone = Asia/Yekaterinburg" >> /etc/php/8.0/php.ini \ 
 && wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin-3.3.8/PostfixAdmin%203.3.8.tar.gz -O PostfixAdmin-tar.gz \
 && tar xvf PostfixAdmin-tar.gz --strip-components=1 -C /var/www/html/ \
 && rm PostfixAdmin-tar.gz \
 && mkdir /var/www/html/templates_c \
 && mv /conf/entrypoint.sh /entrypoint.sh \
 && mv /conf/nginx.conf /etc/nginx/nginx.conf \
 && rm -R /conf \
 && chown -R www-data:www-data /var/www/html \
 && chmod -R 500 /var/www/html \
 && chmod -R 700 /var/www/html/templates_c/ \
 && chmod a+x /entrypoint.sh
# Указание стартового скрипта с которого будет начинаться каждый запуск контейнера
ENTRYPOINT ["/entrypoint.sh"]
# Открытие порта внутри контейнера
EXPOSE 80
Создание файла entrypoint.sh
#!/bin/bash
echo "Start nginx & php-fpm"
nginx
service php8.0-fpm start
# Выдача логов, если данный параметр убрать то контейнер после запуска будет сразу завершатся.
tail -f /var/log/nginx/error.log
Объединение контейнеров в docker-compose
# Версия docker-compose
version: '3'
# Список наших сервисов (контейнеров)
services:
    phpmyadmin:
        restart: always
        image: h963z57/phpmyadmin:main
        # маршрутизируем порты
        ports:
            - "83:80"
        # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
        volumes:
            - /mnt/cfg/phpMyAdmin.config.inc.php:/var/www/html/config.inc.php:ro
    postfixadmin:
        restart: always
        image: h963z57/postfixadmin:main
        # маршрутизируем порты
        ports:
            - "84:80"
        # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
        volumes:
            - /mnt/cfg/poftfixadmin.config.php:/var/www/html/config.inc.php:ro